SSH-доступ удобен и безопасен, если дополнить его двухфакторной аутентификацией (2FA). Второй фактор добавляет к привычной проверке (ключ или пароль) одноразовый код из приложения по стандарту TOTP (Google Authenticator, FreeOTP, 1Password и др.). В результате даже при утечке ключа или пароля вход без кода невозможен.
Если SSH ещё не установлен/не укреплён, сначала пройдите нашу базовую инструкцию: «SSH в Linux: установка, подключение, ключи и безопасная настройка».
Перед началом — чтобы не запереть себя
- Держите вторую SSH-сессию открытой на время настройки.
- Проверяйте синтаксис перед перезапуском:
sudo sshd -t && sudo systemctl reload sshd || sudo systemctl reload ssh
- Иметь резервный доступ (консоль ВМ/панели, второй ключ/аккаунт).
- Время на сервере должно быть точным (TOTP чувствителен):
timedatectl status
.

Как включить 2FA в SSH: общая схема и шаги
Ниже показаны команды для Debian-based, RHEL-based и Arch. Мы подключим PAM-модуль TOTP, включим в sshd_config интерактивную аутентификацию и требование «два фактора», а затем активируем коды для нужных пользователей.
Шаг 1. Установить PAM-модуль для TOTP
Debian-based (Ubuntu, Debian, Astra):
sudo apt update
sudo apt install -y libpam-google-authenticator qrencode
RHEL-based (RHEL, AlmaLinux, Rocky, Fedora):
# На RHEL/Alma/Rocky может понадобиться EPEL:
# sudo dnf install -y epel-release
sudo dnf install -y google-authenticator-libpam qrencode
Arch Linux:
sudo pacman -S libpam-google-authenticator libqrencode
qrencode
не обязателен, но удобен: покажет QR-код в терминале.
Шаг 2. Подключить PAM к SSH
Откройте файл /etc/pam.d/sshd
и добавьте строку до общей auth-политики (то есть раньше строк типа @include common-auth / auth substack password-auth / auth include system-remote-login):
auth required pam_google_authenticator.so
Так 2FA (TOTP) станет обязательной для всех пользователей, у кого настроен SSH-вход.
Сделать 2FA не для всех (опционально):
Если хотите включать коды только выбранным пользователям, добавьте параметр nullok
:
auth required pam_google_authenticator.so nullok
В этом случае у тех, у кого нет файла ~/.google_authenticator
, запрос одноразового кода не появится.
Чтобы выключить 2FA для конкретного пользователя, просто уберите его файл с секретом:
mv ~/.google_authenticator ~/.google_authenticator.disabled
Шаг 3. Настроить политику входа в sshd_config
Откройте /etc/ssh/sshd_config
и включите PAM + интерактивную стадию:
UsePAM yes
KbdInteractiveAuthentication yes # новые версии OpenSSH
# ChallengeResponseAuthentication yes # для старых версий
Если вы нашли в файле один из этих параметров, измените их значения. Если их там нет, просто добавьте их в конец файла.
Дальше выберите один из вариантов политики (или объедините их):
Вариант A — ключ + TOTP (рекомендовано)
PubkeyAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
Чтобы после ввода одноразового кода не спрашивался пароль, в PAM-стеке для sshd в секции auth должна остаться только строка с pam_google_authenticator.so
. Любые включения, которые подтягивают pam_unix.so (пароль проверки), нужно убрать только из auth. Секции account/session не трогаем.
Важно:
PasswordAuthentication no
отключает SSH-метод password, но не пароли внутри PAM. Если в auth остаётся pam_unix.so, sshd законно покажет Password: даже при запрете паролей.
Откройте файл /etc/pam.d/sshd
, найдите нужную строку и поставьте перед ней знак комментария (#).
Debian-based (Ubuntu/Debian/Astra): /etc/pam.d/sshd
#@include common-auth
RHEL-based (RHEL/Alma/Rocky/Fedora): /etc/pam.d/sshd
# auth substack password-auth
# auth include password-auth
Arch Linux: /etc/pam.d/sshd
# auth include system-remote-login
Вариант B — пароль + TOTP
PubkeyAuthentication no
PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive
Вариант C — разрешить и ключ, и пароль, но всегда требовать TOTP
(«ИЛИ» между наборами методов задаётся пробелом)
PubkeyAuthentication yes
PasswordAuthentication yes
AuthenticationMethods publickey,keyboard-interactive password,keyboard-interactive
Применяем изменения:
sudo sshd -t && sudo systemctl reload sshd || sudo systemctl reload ssh
Шаг 4. Подключить 2FA конкретному пользователю
Команды выполняются от имени пользователя, которому включаем 2FA:
google-authenticator
В ответе на Time-based tokens? укажите y
. Для получения кода отсканируйте QR-код или введите секрет/URL из мастера в приложении (Google Authenticator и др.).
Далее рекомендуемые ответы мастера:
- Update ~/.google_authenticator? —
y
- Disallow multiple uses? —
y
- Rate limit? —
y
(например, 3 попытки за 30 сек) - Scratch codes — сохраните в надёжном месте.
Показать QR-код в терминале:
qrencode -t ANSIUTF8 < ~/.google_authenticator
Теперь при входе: сначала пройдёт ключ или пароль (по вашей политике), затем сервер спросит Verification code — введите 6-значный TOTP.
Проверка и диагностика
Тест клиента с подробностями
ssh -vvv user@SERVER_IP
# если у вас ключ + TOTP:
ssh -o PreferredAuthentications=publickey,keyboard-interactive user@SERVER_IP
# если пароль + TOTP:
ssh -o PreferredAuthentications=password,keyboard-interactive user@SERVER_IP
Типовые проблемы
Код не спрашивается. Проверьте UsePAM yes
, KbdInteractiveAuthentication yes
(или ChallengeResponseAuthentication yes
) и AuthenticationMethods …,keyboard-interactive
. Убедитесь, что строка pam_google_authenticator.so
выше общих правил в /etc/pam.d/sshd
. Логи:
sudo journalctl -u sshd -b
Permission denied (keyboard-interactive). Неверный код, расхождение времени или нет ~/.google_authenticator
. Проверьте timedatectl
, запустите google-authenticator
заново.
Too many authentication failures. Агент предлагает слишком много ключей. Подключайтесь явно:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@SERVER_IP
После переустановки ВМ: “REMOTE HOST IDENTIFICATION HAS CHANGED!”
ssh-keygen -R SERVER_IP
Быстрый откат (если закрылись снаружи)
- Через консоль ВМ закомментируйте строку PAM с
pam_google_authenticator.so
или временно упроститеAuthenticationMethods
(например,publickey
). - Перезагрузите
sshd
, верните 2FA после проверки входа.
Заключение
Настройка двухфакторной аутентификации (2FA) для доступа к SSH — важный шаг к защите удалённых подключений. В этой статье мы прошли установку Google Authenticator (TOTP), настроили PAM и изменили параметры SSH-сервера так, чтобы требовать два фактора.
Теперь ваш SSH надёжнее защищён от перебора и несанкционированных входов. Связка ключ + TOTP даёт дополнительный уровень безопасности по сравнению с паролями, а вариант пароль + TOTP позволяет внедрить 2FA там, где ключи пока не используются.
Хотите безопасно протестировать изменения — поднимите окружение на наших облачных VDS: быстрое развёртывание, доступ к консоли и снапшоты для отката.