Настройка SSH с двухфакторной аутентификацией (2FA): TOTP и YubiKey для Debian, Ubuntu, CentOS | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Настройка SSH с двухфакторной аутентификацией (2FA): TOTP и YubiKey для Debian, Ubuntu, CentOS

12 мая 2026 8 мин. чтения

Зачем SSH нужна двухфакторная аутентификация и как выбрать метод

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

Выбор между TOTP (Time-based One-Time Password) и аппаратными ключами FIDO2/U2F зависит от требований к безопасности, бюджета и удобства команды.

TOTP (Google Authenticator): универсальность и простота

Метод TOTP генерирует одноразовые шестизначные коды, которые меняются каждые 30 секунд. Секретный ключ хранится на сервере и в мобильном приложении пользователя (Google Authenticator, Authy, Microsoft Authenticator).

Преимущества TOTP:

  • Не требует дополнительного оборудования. Достаточно смартфона.
  • Работает офлайн. Приложение генерирует коды без интернета.
  • Широкая поддержка. Множество бесплатных приложений для всех платформ.
  • Простота развертывания и администрирования.

Главный недостаток - уязвимость к фишингу. Если пользователь введет одноразовый код на фейковом сайте, атакующий сможет использовать его для входа. Также критична синхронизация времени между сервером и устройством пользователя.

Аппаратные ключи (YubiKey): максимальная защита от фишинга

Аппаратные ключи по стандартам FIDO2/U2F используют криптографию с открытым ключом. При аутентификации ключ создает цифровую подпись, уникальную для домена (например, IP-адреса сервера). Это делает атаки фишингом и "человек посередине" практически невозможными - подпись, созданная для домена злоумышленника, будет недействительной на настоящем сервере.

Ключевое преимущество - фишинг-резистентность. Для работы требуется физический ключ (YubiKey, SoloKey) у каждого пользователя, что влечет затраты на закупку и логистику. Этот метод рекомендован для серверов с максимальными требованиями к безопасности: бастион-хосты, серверы с финансовыми данными, критичная инфраструктура.

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

Подготовка сервера и установка необходимых пакетов

Критически важное предупреждение: Все изменения выполняйте, имея открытую вторую активную SSH-сессию или прямой доступ к консоли сервера через KVM/IPMI. Ошибка в конфигурации может заблокировать вход.

Перед началом убедитесь, что базовый SSH-доступ работает. Выполните вход с текущими учетными данными.

Установите пакеты в зависимости от дистрибутива.

Для Debian/Ubuntu:

sudo apt update
sudo apt install libpam-oath oathtool

Для работы с аппаратными ключами дополнительно потребуется:

sudo apt install libfido2-dev pam-u2f

Для RHEL/CentOS/Rocky Linux 8/9:

sudo dnf install epel-release
sudo dnf install pam_oath oathtool

Для аппаратных ключей:

sudo dnf install pam-u2f fido2-tools

Настройка двухфакторной аутентификации через TOTP (Google Authenticator)

Это пошаговая инструкция для настройки 2FA через PAM-модуль pam_oath. Рекомендуемый сценарий - комбинация SSH-ключа и TOTP.

Готовые конфигурационные файлы: sshd_config и PAM

1. Генерация секретного ключа для пользователя. Выполните от имени пользователя, для которого настраивается 2FA:

oathtool -v -d6 $(head -c 1024 /dev/urandom | openssl sha1 | head -c 4)

Команда выведет шестнадцатеричный секрет (hexsecret). Сохраните его. Для удобства можно сгенерировать QR-код:

qrencode -t UTF8 "otpauth://totp/user@server?secret=ВАШ_HEXSECRET&issuer=MySSHServer"

2. Настройка PAM. Отредактируйте файл /etc/pam.d/sshd. Добавьте строку перед правилом @include common-auth:

# Двухфакторная аутентификация через TOTP (OATH)
auth required pam_oath.so usersfile=/etc/users.oath window=5

Параметр window=5 позволяет использовать код с небольшим временным запасом.

3. Сохранение секрета. Добавьте запись в файл /etc/users.oath:

HOTP/HOTP/T30 user - ВАШ_HEXSECRET

Установите строгие права на файл:

sudo chmod 600 /etc/users.oath
sudo chown root:root /etc/users.oath

4. Критическая настройка sshd_config. Отредактируйте /etc/ssh/sshd_config:

# Отключаем чисто парольную аутентификацию
PasswordAuthentication no
# Включаем интерактивную аутентификацию (для запроса кода TOTP)
ChallengeResponseAuthentication yes
UsePAM yes
# Указываем МЕТОДЫ аутентификации. Порядок важен.
# Этот вариант требует ОДНОВРЕМЕННО SSH-ключ И код TOTP.
AuthenticationMethods publickey,keyboard-interactive:pam

Если необходимо использовать пароль + TOTP (менее безопасно), укажите:

AuthenticationMethods password,keyboard-interactive:pam

5. Перезагрузка SSH и тестирование.

sudo systemctl restart sshd

Откройте новое окно терминала и попробуйте подключиться. После проверки SSH-ключа система запросит Verification code (код из приложения).

Добавление TOTP для нескольких пользователей и централизованное управление

Файл /etc/users.oath поддерживает записи для множества пользователей. Каждая строка - отдельный пользователь. Для массового развертывания создайте скрипт, который генерирует секреты и добавляет их в файл.

Пример простого скрипта:

#!/bin/bash
USER="$1"
SECRET=$(oathtool -v -d6 $(head -c 1024 /dev/urandom | openssl sha1 | head -c 4) | grep "hexsecret" | awk '{print $2}')
echo "HOTP/HOTP/T30 $USER - $SECRET" | sudo tee -a /etc/users.oath
echo "Секрет для $USER: $SECRET"
echo "QR-код URI: otpauth://totp/$USER@$(hostname)?secret=$SECRET&issuer=$(hostname)"

Для крупных инфраструктур рассмотрите использование централизованных систем управления секретами, таких как HashiCorp Vault, которые могут динамически генерировать и проверять TOTP-коды. Подробнее о построении масштабируемых систем аутентификации читайте в нашем руководстве по аутентификации и авторизации.

Настройка двухфакторной аутентификации через аппаратные ключи YubiKey (FIDO2/U2F)

Для использования аппаратных ключей с SSH через PAM применяется модуль pam_u2f.

1. Регистрация ключа для пользователя. Подключите YubiKey и выполните команду от имени пользователя:

mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys

Во время выполнения команды коснитесь сенсора ключа. В файл будет записана уникальная credential запись.

2. Настройка PAM. В файл /etc/pam.d/sshd добавьте:

# Аутентификация через аппаратный ключ U2F
auth required pam_u2f.so cue authfile=/home/%u/.config/Yubico/u2f_keys

Параметр cue выводит подсказку "Please touch the device".

3. Настройка sshd_config. Конфигурация аналогична TOTP:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive:pam

4. Перезагрузка и тестирование. После перезагрузки sshd при подключении после проверки SSH-ключа система запросит касание аппаратного ключа.

Отличия в конфигурации SSH для FIDO2 и работа с несколькими ключами

Файл ~/.config/Yubico/u2f_keys может содержать несколько записей (ключей) для одного пользователя. Каждая запись - на новой строке. Это позволяет зарегистрировать основной и резервный ключ. Просто повторите команду pamu2fcfg с другим ключом, перенаправив вывод в тот же файл с добавлением:

pamu2fcfg >> ~/.config/Yubico/u2f_keys

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

Диагностика проблем и логирование событий аутентификации

Если после настройки вход не работает, следуйте этому алгоритму диагностики.

1. Включите детальное логирование SSH. В /etc/ssh/sshd_config добавьте:

LogLevel VERBOSE

Перезагрузите службу и проверьте журналы:

  • Debian/Ubuntu: sudo tail -f /var/log/auth.log
  • RHEL/CentOS/Rocky: sudo tail -f /var/log/secure

Ищите строки с Failed password, Invalid verification code, Failed keyboard-interactive.

2. Проверьте синхронизацию времени (критично для TOTP). Расхождение более чем на 30 секунд между сервером и телефоном приведет к ошибке. Убедитесь, что работает NTP:

sudo systemctl status chronyd  # или ntpd, systemd-timesyncd
chronyc sources                # проверка источников времени

3. Проверьте корректность файла конфигурации PAM. Протестируйте модуль вручную:

# Установите pamtester если нет
sudo apt install pamtester  # или sudo dnf install pamtester
# Тестируем аутентификацию для пользователя 'user'
echo -e "\n" | pamtester sshd user authenticate

Программа запросит Verification code. Введите текущий код из приложения.

4. Типичные ошибки:

  • Неверный порядок методов в AuthenticationMethods. Убедитесь, что указано publickey,keyboard-interactive:pam.
  • Отсутствие или неправильные права на файл /etc/users.oath (должны быть 600, root:root).
  • Для аппаратных ключей - отсутствие файла ~/.config/Yubico/u2f_keys у пользователя.

Подробные методики аудита и мониторинга безопасности серверов, включая анализ логов аутентификации, собраны в нашем полном руководстве по аудиту и защите серверов.

Аварийное восстановление доступа: что делать, если потерян второй фактор

Внедрение 2FA без плана восстановления - гарантированный инцидент. Подготовьте эти процедуры до применения изменений на боевых серверах.

1. Выделенная учетная запись для восстановления. Создайте отдельного системного пользователя (например, breakglass). Для него в sshd_config настройте доступ ТОЛЬКО по SSH-ключу с определенного доверенного IP-адреса (административной сети):

Match User breakglass
    AuthenticationMethods publickey
    AllowUsers breakglass@192.168.1.100  # IP вашей рабочей станции
    PasswordAuthentication no

Эта учетная запись не должна использовать 2FA через PAM.

2. Физический доступ к консоли. Убедитесь, что у вас есть доступ к IPMI, iDRAC, KVM или физической консоли сервера. Это последний рубеж.

3. Скрипт временного отключения 2FA (ТОЛЬКО для консольного доступа!). Подготовьте скрипт, который комментирует строку auth required pam_oath.so в /etc/pam.d/sshd. Храните его на сервере и запускайте исключительно с локальной консоли.

4. Четкий алгоритм действий при инциденте:

  1. Попытайтесь войти через учетную запись восстановления (breakglass) с доверенной рабочей станции.
  2. Если это невозможно, используйте консольный доступ (IPMI/KVM).
  3. Через консоль временно отключите модуль PAM 2FA, используя подготовленный скрипт или вручную отредактировав /etc/pam.d/sshd.
  4. Войдите в систему, восстановите доступ основному пользователю (сгенерируйте новый TOTP-секрет или зарегистрируйте новый аппаратный ключ).
  5. Верните настройки 2FA в исходное состояние.

Готовый пошаговый чек-лист для подобных ситуаций доступен в нашей шпаргалке по восстановлению доступа при потере ключа 2FA.

Итоги и рекомендации по построению отказоустойчивой системы

Двухфакторная аутентификация для SSH - необходимый стандарт безопасности для любой инфраструктуры, выходящей за рамки тестовой среды. TOTP через Google Authenticator обеспечивает отличный баланс защиты и удобства для большинства команд. Аппаратные ключи FIDO2/U2F - это выбор для максимального уровня безопасности, где неприемлем даже минимальный риск фишинга.

Ключевые принципы успешного внедрения:

  • Всегда используйте 2FA в связке с SSH-ключами, а не с паролями. Это дает два сильных фактора.
  • План аварийного восстановления обязателен. Протестируйте его до развертывания в production.
  • Для крупных инфраструктур планируйте централизованное управление. Интеграция с FreeRADIUS или HashiCorp Vault избавит от ручного управления файлами секретов.
  • Настройте мониторинг событий аутентификации. Неудачные попытки входа с правильным первым фактором (ключом) могут сигнализировать об атаке.
  • Первым делом протестируйте всю конфигурацию на изолированном тестовом сервере или виртуальной машине.

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

Поделиться:
Сохранить гайд? В закладки браузера