Включаем двухфакторную аутентификацию (2FA) для SSH входа в Linux
21.12.2021
itpro
CentOS, Linux, Ubuntu
комментариев 8
В этой статье мы покажем, как настроить двухфакторную аутентификацию (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 сервере:
- Подключитесь к вашему 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 показаны секретный ключ и коды аварийного доступа;
Эти коды нужны для подключения к вашей учетной записи на сервере, если вы потеряете/сломаете свой смартфон. Сохраните коды в безопасное место!
По умолчанию одноразовый токен меняется раз в 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 секунд
auth required pam_google_authenticator.so nullok
Опция nullok позволяет пользователю, для которого не настроена двухфакторная аутентификация, входить с помощью только имени и пароля. После настройки и тестирования 2FA рекомендует убрать этот параметр, чтобы требовать обязательное использование двухфакторной аутентификации.
ChallengeResponseAuthentication yes
Сохраните изменения в файле sshd_config и перезапустите sshd: service ssh restart
Теперь попробуйте подключится к вашему хосту Linux по SSH. Перед вводом пароля у вас будет запрошено ввести код верификации (verification code).
Откройте приложение Authenticator на смартфоне, найдите пользователя вашего сервера. Введите в консоль 6-символьный одноразовый пароль (One-time password code), который сгенерировал для вас Authenticator.
Обратите внимание, что этот одноразовый код ограничен по времени (по умолчанию 30 секунд). Если вы ввели правильный одноразовый код, появится предложение ввести пароль пользователя Linux.
При успешном входе в логе аутентификации появится строка:
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
Предыдущая статья Следующая статья
Двухфакторная аутентификация в OpenSSH: ключ+одноразовый код
В предыдущей статье я рассказал, как добавить проверку одноразовых кодов при логине на свой сервер по SSH. Статья завершалась словами «если ходим по ключу — двухфакторная аутентификация не работает (не используется PAM)».
С недавнего времени, после выпуска OpenSSH версии 6.2, ситуация поменялась к лучшему.
+
sshd(8): Added support for multiple required authentication in SSH protocol 2 via an AuthenticationMethods option. This option lists one or more comma-separated lists of authentication method names. Successful completion of all the methods in any list is required for authentication to complete.
sshd(8): Добавлена поддержка множественных способов аутентификации в SSH протоколе 2 посредством параметра AuthenticationMethods. Этот параметр задаёт один или более списков с запятой-разделителем, перечисляющих названия методов аутентификации. Для аутентификации требуется успешное завершение всех методов в любом из списков.
Начинаем
Рассмотрю пример настройки: аутентификация по ключу и, затем, по одноразовому коду. У меня используется Debian Jessie (testing), там всё доступно «из коробки».
Ставим нужный софт
С момента написания прошлой статьи консольную тулзу положили рядом с модулем, поэтому на сервере нужен лишь один новый пакет:
apt-get install libpam-google-authenticator
На телефон с Android’ом ставим Google Autenticator и какой-либо сканер QR кодов, например такой. Если у вас на телефоне Windows Phone, то программа называется Authenticator (thnx to Skywrtr). Если у вас телефон с другой ОС, то вам сюда.
Инициализация одноразовых кодов
первым вопросом будет, хотим ли мы time-based токены. Ответ — «y».
В ответ получаем ASCII-art с таким симпатичным QR кодом, содержащим в себе секретный ключ (картинка кликабельная):
Также, если вы хотите добавить данные в Google Authenticator вручную — выводятся сам секретный код инициализации и код для проверки.
Также имеет смысл записать в надёжном месте 5 резервных кодов на случай, если вдруг с телефоном что-то случится. А по URL, который тулза тоже пишет, ходить не нужно — там лишь рисуется тот же самый QR код покрасивее. Вы ведь не хотите показывать свой секретный код Гуглу? 🙂
QR код сразу сканируем из приложения в телефоне, потом отвечаем на вопросы в консоли.
— Сохранить всё насовсем в ~/.google_authenticator?
— y
— Запретить использование одного кода несколько раз? Помогает заметить или даже предотвратить атаку man-in-the-middle.
— y
— Увеличить окно времени с приблизительно 1.5 минут до 4 минут?
— n (и тут сразу проверяем, точно ли время в телефоне; впрочем, Google Authenticator последних версий умеет синхронизировать время из интернета)
— Ограничить число попыток логина за промежуток времени?
— y
Настройка PAM
В файле /etc/pam.d/sshd в группе «auth» должна быть лишь одна строка с вызовом модуля pam_google_authenticator.so:
--- /etc/pam.d/sshd.orig 2013-05-22 05:05:49.000000000 +0400 +++ /etc/pam.d/sshd 2013-09-04 16:36:43.141649326 +0400 @@ -1,7 +1,9 @@ # PAM configuration for the Secure Shell service +auth required pam_google_authenticator.so + # Standard Un*x authentication. -@include common-auth +#@include common-auth # Disallow non-root logins when /etc/nologin exists. account required pam_nologin.so
Обращаю внимание на важный момент: с одной стороны, нужно закомментировать все строки и инклюды, добавляющие в группу «auth» проверку пароля, (например, «@include common-auth» выше), иначе у вас после одноразового кода спросят и пароль. С другой стороны, надо понимать, что аутентификация по паролю, которая в большинстве современных дистрибутивов также делается через PAM, будет таким образом сломана. Но это неопасно, т.к. ниже мы явно указываем серверу sshd, что проверка ключа обязательна и без правильного ключа авторизация будет неуспешна.
Пока я не придумал, как можно сделать в PAM одновременно два сценария, например «ключ + одноразовый код» и «пароль + одноразовый код».
Настройка PAM, дополнительные плюшки
Можно сделать так, чтобы одноразовый код спрашивался не для всех. Для этого есть модуль pam_access.so, который нужно вписать перед pam_google_authenticator.so:
auth sufficient pam_access.so accessfile=/etc/ssh/two-factor-skip.conf auth required pam_google_authenticator.so
В файл /etc/ssh/two-factor-skip.conf можно указать что-то эдакое:
# В локальной сети ходим только лишь с ключём + : ALL : 192.168.1.0/24 # Этот юзер не может вводить одноразовые коды + : oldskool : ALL # Всех остальных заставим вводить ещё и одноразовый код - : ALL : ALL
Настройка sshd
В /etc/ssh/sshd_config включаем ChallengeResponse аутентификацию, PAM и указываем, что нужно проверять как ключ, так и одноразовый пароль.
ChallengeResponseAuthentication yes UsePAM yes AuthenticationMethods publickey,keyboard-interactive
Проверяем
Совместимость
Все консольные команды (ssh, scp, sftp) OpenSSH версии 5.9p1 и, очевидно, позднее — поддерживают ChallengeResponse аутентификацию. Более старые версии не проверял.
lftp версий 4.3.3 и 4.4.8 не поддерживает. Другие версии не проверял.
Irssi Conectbot на Android — поддерживает.
SecureCRT — поддерживает, но в настройках соединения необходимо установить Keyboard-interactive и Publickey.
Putty — поддерживает.
Если кто-либо сможет проверить другие программы на (не)совместимость, пишите мне в личку — я допишу сюда.