В этой статье мы покажем, как настроить двухфакторную аутентификацию (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).
Теперь нужно установить и настроить пакет Google PAM на вашем Linux сервере:
- Подключитесь к вашему Linux хосту по SSH;
- Установите пакет Google PAM Authenticator с помощью пакетного менеджера:В Debian/Ubuntu:
sudo apt-get install libpam-google-authenticator
В RHEL/CentOS/Fedora:yum install google-authenticator
- Выполните команду:
google-authenticator
- Утилита сгенерирует и отобразит в консоли QR код;
- Запустите приложение Microsoft Authenticator на своем смартфоне. Выберите Add account -> Personal account -> Scan a QR Code;
- Отсканируйте QR код через приложение. В результате в приложении Authenticator появится новая запись для вашего пользователя и сервера. В этой записи вы сможете получить одноразовый пароль для подключения к хосту;
- Обратите внимание, что в консоли Linux показаны секретный ключ и коды аварийного доступа;Эти коды нужны для подключения к вашей учетной записи на сервере, если вы потеряете/сломаете свой смартфон. Сохраните коды в безопасное место!
- Затем google-authenticator покажет несколько дополнительных вопросов:
- Do you want authentication tokens to be time-based?
Y -> Enter
- Do you want me to update your “/home/sysops/.google_authenticator” file?
Y -> Enter
- Do you want to disallow multiple uses of the same authentication token?
Y -> Enter
- By default, tokens are good for 30 seconds…
Y -> Enter
По умолчанию одноразовый токен меняется раз в 30 секунд. Этого как правило достаточно. Но здесь важно, чтобы ваш хост Linux и смартфон были синхронизированы по времени. - Do you want to enable rate-limiting?
Y -> Enter
Можно задать сразу задать все настройки$ 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 секунд - Теперь нужно добавить следующую строку в файл /etc/pam.d/sshd:
auth required pam_google_authenticator.so nullok
Опция nullok позволяет пользователю, для которого не настроена двухфакторная аутентификация, входить с помощью только имени и пароля. После настройки и тестирования 2FA рекомендует убрать этот параметр, чтобы требовать обязательное использование двухфакторной аутентификации. - Теперь внесите изменения в файл /etc/ssh/sshd_config:
sudo mcedit /etc/ssh/sshd_config
- Измените значение в строке ChallengeResponseAuthentication на Yes:
ChallengeResponseAuthentication yes
- Сохраните изменения в файле sshd_config и перезапустите sshd: service ssh restart
Теперь попробуйте подключится к вашему хосту Linux по SSH. Перед вводом пароля у вас будет запрошено ввести код верификации (verification code).
Откройте приложение Authenticator на смартфоне, найдите пользователя вашего сервера. Введите в консоль 6-символьный одноразовый пароль (One-time password code), который сгенерировал для вас Authenticator.
Обратите внимание, что этот одноразовый код ограничен по времени (по умолчанию 30 секунд). Если вы ввели правильный одноразовый код, появится предложение ввести пароль пользователя Linux.
При успешном входе в логе аутентификации появится строка:
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 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 PubkeyAuthentication yes AuthenticationMethods publickey,keyboard-interactive