Одного пароля или даже SSH-ключа недостаточно, если сервер доступен из интернета: украденный ключ с ноутбука даёт полный доступ, а пароль можно подобрать. Второй фактор решает эту проблему: для входа нужен и ключ, и одноразовый код, либо аппаратный токен с PIN. OpenSSH и PAM поддерживают оба варианта штатно, без сторонних агентов на сервере. Главное — не заблокировать себе доступ во время настройки.

Страховка перед изменениями

Сначала откройте второй терминал с активной сессией и не закрывайте его до конца проверки. Если что-то пойдёт не так, вы сможете откатить конфигурацию. Дополнительно проверьте версию OpenSSH: аппаратные ключи ed25519-sk требуют 8.2 и новее, а verify-required — 8.2 с поддержкой FIDO2.

ssh -V
sudo sshd -T | grep -E 'usepam|kbdinteractive|authenticationmethods|pubkeyauth'
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sshd -t

Файлы в /etc/ssh/sshd_config.d/ читаются раньше основного конфига и могут переопределять директивы. Проверяйте итоговое значение через sshd -T, а не только глазами по файлу.

Двухфакторная аутентификация по TOTP

TOTP — шестизначный код, который меняется каждые 30 секунд. На сервере его проверяет PAM-модуль pam_google_authenticator, на телефоне — любое приложение-аутентификатор. Установка и первичная настройка выполняются от обычного пользователя, а не от root.

sudo apt install libpam-google-authenticator
google-authenticator -t -d -f -r 3 -R 30 -w 3
chmod 600 ~/.google_authenticator

Ключи -t включают TOTP, -d запрещает повторное использование кода, -r 3 -R 30 ограничивают частоту попыток, -w 3 разрешает расхождение часов. На экране появится QR-код и резервные коды — сохраните их в менеджере паролей или на бумаге в сейфе. Без них при потере телефона останется только консоль.

Теперь подключаем модуль к PAM и требуем два метода одновременно. Строка nullok позволяет пользователям без настроенного TOTP входить по ключу; после настройки всех учётных записей её лучше убрать.

# /etc/pam.d/sshd
auth required pam_google_authenticator.so nullok

# /etc/ssh/sshd_config.d/10-mfa.conf
KbdInteractiveAuthentication yes
UsePAM yes
PubkeyAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive

Директива AuthenticationMethods publickey,keyboard-interactive означает «ключ, затем код». Именно keyboard-interactive, а не password: TOTP вводится в отдельном приглашении. После перезапуска проверьте вход в новом терминале, не закрывая старый.

Аппаратные ключи FIDO2

Ключ вроде YubiKey или Nitrokey работает как второй фактор и как самостоятельный ключ с PIN. Приватная часть не покидает устройство, поэтому фишинг и копирование файла ключа бесполезны. Создаём ключ с обязательной проверкой присутствия и PIN.

ssh-keygen -t ed25519-sk -O resident -O verify-required -C "yubikey-admin"
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub admin@server
ssh-add -K
ssh -v admin@server 2>&1 | grep -i sk-

Опция -O resident сохраняет ключ на самом токене, что позволяет пользоваться им с разных машин. Команда ssh-add -K загружает резидентные ключи в агент. При входе сервер попросит коснуться токена и ввести PIN; в отладочном выводе появится строка с sk-ssh-ed25519.

Для аппаратного ключа достаточно AuthenticationMethods publickey: сам ключ уже требует физического присутствия. Если нужен максимальный уровень, комбинируйте ключ и TOTP: AuthenticationMethods publickey,keyboard-interactive. Но учтите, что не все клиенты и не все версии PAM ведут себя одинаково — тестируйте на отдельном пользователе.

Разные политики для групп

Вместо глобального правила можно ужесточить требования только для администраторов, оставив обычным пользователям вход по ключу. Блок Match должен идти в конце файла, потому что после него действуют особые правила.

Match Group admins
    AuthenticationMethods publickey,keyboard-interactive

Match Address 10.0.0.0/8
    AuthenticationMethods publickey

Второй блок ослабляет требования для доверенной внутренней сети. Это удобно для автоматизации, но означает, что компрометация внутреннего хоста снижает защиту. Для критичных серверов лучше не делать исключений по адресу, а использовать отдельного пользователя и отдельный ключ.

Диагностика и типичные ошибки

После правки конфигурации всегда выполняйте sshd -t. Синтаксическая ошибка не применится, но при перезапуске служба может не подняться. Логи показывают, какой именно метод аутентификации отклонён.

sudo sshd -t && sudo systemctl reload ssh
sudo journalctl -u ssh -f
sudo tail -f /var/log/auth.log
timedatectl status

В журнале ищите строки Accepted publickey и Failed keyboard-interactive: первая подтверждает, что ключ принят, вторая показывает, на каком этапе отвалился второй фактор. Не включайте избыточное логирование паролей и кодов — это создаёт риск утечки. Для проверки часов достаточно timedatectl: расхождение больше минуты уже ломает TOTP.

  • Permission denied (publickey) — ключ не доходит до сервера или неверны права на ~/.ssh.
  • Код TOTP не принимается — расходятся часы; проверьте timedatectl и синхронизацию через chrony.
  • verify-required не работает — старый OpenSSH или токен без поддержки PIN.
  • После включения MFA перестал работать git по SSH — для него нужен отдельный ключ и агент, либо исключение для служебного пользователя.
  • Резервные коды утеряны — остаётся вход через консоль провайдера и правка PAM.
  • После обновления OpenSSH проверьте поддержку sk- ключей и verify-required.
  • Для автоматизации используйте отдельного пользователя с ключом без TOTP и ограничьте его команды.

Чек-лист внедрения

  • Проверить вход вторым терминалом до закрытия первого.
  • Сохранить резервные коды и второй аппаратный ключ в другом месте.
  • Оставить пароль root только для консоли, а SSH — на ключах.
  • Ограничить попытки входа и включить fail2ban для SSH.
  • Задокументировать процедуру восстановления доступа.

Итог

Двухфакторная аутентификация для SSH строится из двух независимых механизмов: TOTP-код через PAM и аппаратный ключ FIDO2. Первый проще внедрить и он работает с любым клиентом, второй устойчивее к фишингу и не требует ввода кода. Начните с TOTP на одном тестовом пользователе, проверьте восстановление, затем раскатывайте на группу администраторов. И обязательно оставьте себе путь назад — консоль, резервный ключ или второй фактор, который хранится отдельно.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте