Включаем двухфакторную аутентификацию (2FA) для SSH входа в Linux

В этой статье мы покажем, как настроить двухфакторную аутентификацию (2FA) для SSH входа на Linux сервер с помощью Google PAM (Pluggable Authentication Module) и мобильного приложения Microsoft Authenticator . 2FA позволяет добавить дополнительный слой безопасности при аутентификации на Linux хосте по SSH. Теперь для входа на сервер кроме имени и пароля пользователя (rsa ключа), вы должны будете ввести одноразовый цифровой пароль (Time-based One-time Password — TOTP), который генерируется в вашем смартфоне.

Установите на свой смартфон мобильное приложение Microsoft Authenticator (доступно как в Google Store, так и в App Store).

В этой статье я рассматриваю именно Microsoft Authenticator, т.к. я уже использую это приложение для MFA аутентификации в Azure . Если захотите, можно использовать вместо него Google Authenticator.

Теперь нужно установить и настроить пакет Google PAM на вашем Linux сервере:

  1. Подключитесь к вашему Linux хосту по SSH;
  2. Установите пакет Google PAM Authenticator с помощью пакетного менеджера:В Debian/Ubuntu: sudo apt-get install libpam-google-authenticator В RHEL/CentOS/Fedora: yum install google-authenticator

    установка libpam-google-authenticator в linux

  3. Выполните команду: google-authenticator
  4. Утилита сгенерирует и отобразит в консоли QR код; qr код в консоли linux, который сгенерировал google-authenticator
  5. Запустите приложение Microsoft Authenticator на своем смартфоне. Выберите Add account -> Personal account -> Scan a QR Code;
  6. Отсканируйте QR код через приложение. В результате в приложении Authenticator появится новая запись для вашего пользователя и сервера. В этой записи вы сможете получить одноразовый пароль для подключения к хосту; новый аккаунт в Microsoft Authenticator
  7. Обратите внимание, что в консоли Linux показаны секретный ключ и коды аварийного доступа;
    Эти коды нужны для подключения к вашей учетной записи на сервере, если вы потеряете/сломаете свой смартфон. Сохраните коды в безопасное место!
  8. Затем google-authenticator покажет несколько дополнительных вопросов:
  9. Do you want authentication tokens to be time-based? Y -> Enter
  10. Do you want me to update your “/home/sysops/.google_authenticator” file? Y -> Enter
  11. Do you want to disallow multiple uses of the same authentication token? Y -> Enter
  12. By default, tokens are good for 30 seconds… Y -> Enter
    По умолчанию одноразовый токен меняется раз в 30 секунд. Этого как правило достаточно. Но здесь важно, чтобы ваш хост Linux и смартфон были синхронизированы по времени.
  13. Do you want to enable rate-limiting? Y -> Enter настройки google-authenticator
    Можно задать сразу задать все настройки $ google-authenticator -t -f -d -w 3 -e 5 -r 3 -R 30
    -t – включить вход по одноразовому паролю
    -f – сохранить конфигурацию в файле ~/.google_authenticator
    -d – запретить использовать предыдущие пароли
    -w 3 – разрешить использовать один предудущий и один следующий токен (если время не синхронизировано)
    -e 5 – сгенерировать 5 аварийных кодов
    -r 3 -R 30 – разрешить не более 3 логинов каждые 30 секунд

  14. Теперь нужно добавить следующую строку в файл /etc/pam.d/sshd:
    auth required pam_google_authenticator.so nullok

    включить pam_google_authenticator.so в pam.d/sshd

    Опция nullok позволяет пользователю, для которого не настроена двухфакторная аутентификация, входить с помощью только имени и пароля. После настройки и тестирования 2FA рекомендует убрать этот параметр, чтобы требовать обязательное использование двухфакторной аутентификации.

  15. Теперь внесите изменения в файл /etc/ssh/sshd_config: sudo mcedit /etc/ssh/sshd_config
  16. Измените значение в строке ChallengeResponseAuthentication на Yes:
    ChallengeResponseAuthentication yes
  17. Сохраните изменения в файле sshd_config и перезапустите sshd: service ssh restart sshd - включить двухфакторную аутентфикацию

Теперь попробуйте подключится к вашему хосту Linux по SSH. Перед вводом пароля у вас будет запрошено ввести код верификации (verification code).

Откройте приложение Authenticator на смартфоне, найдите пользователя вашего сервера. Введите в консоль 6-символьный одноразовый пароль (One-time password code), который сгенерировал для вас Authenticator.

однаразовй пароль для 2FA аутентфикации

Обратите внимание, что этот одноразовый код ограничен по времени (по умолчанию 30 секунд). Если вы ввели правильный одноразовый код, появится предложение ввести пароль пользователя Linux.

вход на linux по ssh с одноразовым паролем 2fa

При успешном входе в логе аутентификации появится строка:

cat /var/log/auth.log

Dec 21 09:01:22 srv-ubun01 sshd(pam_google_authenticator)[6242]: Accepted google_authenticator for sysops

Если указать неверный код, в логе будут ошибки:

Dec 21 09:02:38 srv-ubun01 sshd(pam_google_authenticator)[6436]: Invalid verification code for sysops_x000D_Dec 21 09:02:40 srv-ubun01 sshd[6436]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.14.1 user=sysops

Если вы хотите использовать 2FA вместе с SSH аутентификацией по ключам, добавьте следующие директивы в /etc/ssh/sshd_config:

PasswordAuthentication no_x000D_PubkeyAuthentication yes_x000D_AuthenticationMethods publickey,keyboard-interactive
EnglishRussianUkrainian