Двухфакторная аутентификация для SSH на Ubuntu

В самой основе SSH уже обеспечивает защиту трафика между клиентом и сервером. Тем не менее, добавление двухфакторной аутентификации повышает безопасность: даже если пароль скомпрометирован, злоумышленник не сможет войти без одноразового кода. Эта инструкция ориентирована на Ubuntu Server; в других дистрибутивах команды и названия пакетов могут отличаться.
Содержание
- Установка компонентов для двухфакторной аутентификации
- Конфигурация Google Authenticator (libpam-google-authenticator)
- Интеграция с PAM и sshd
- Добавление ключа в приложение на смартфоне
- Как заставить SSH требовать и ключ, и 2FA
- Резервные варианты и отказоустойчивость
- Руководство для администратора и пользователя
- Частые проблемы и как их решать
- Риски, матрица и рекомендации по безопасности
Установка компонентов для двухфакторной аутентификации
Откройте терминал на сервере, где вы будете настраивать 2FA, и выполните установку пакета:
sudo apt update
sudo apt install libpam-google-authenticatorПосле установки запустите утилиту настройки:
google-authenticator
Совет: полезно заранее убедиться, что время на сервере синхронизировано (ntp, systemd-timesyncd), иначе временные токены могут быть недействительны.
Конфигурация Google Authenticator (libpam-google-authenticator)
Утилита задаст серию вопросов. В большинстве случаев ответ «y» (yes) подходит. При ошибке прервите Ctrl+C и запустите google-authenticator заново.
- Утилита спросит, хотите ли вы использовать временные токены (time-based). Нажмите Y и Enter.
После этого вы увидите секретный ключ и аварийные коды. Сохраните их в надежном месте — они понадобятся для настройки приложения аутентификации и восстановления доступа.

Ответьте Y, чтобы обновить файл
/home/username/.google_authenticator, куда будут записаны параметры.Отклонение многократного использования одного токена (disallow multiple uses) рекомендуем включить — это препятствует повторному использованию одноразовых кодов и уменьшает риск одновременного входа с разными устройствами.
По умолчанию, каждый токен действителен 30 секунд. Параметр «window» позволяет увеличить допустимый сдвиг времени. Для компенсации расхождений часов часто применяют значение 4.

- Включите ограничение по частоте (rate-limiting). Это ограничит число попыток ввода кода и снизит вероятность подбора: например, не более 3 попыток каждые 30 секунд.

Важно: сохраните секретный ключ и резервные коды в безопасном месте сразу после генерации. При потере доступа к устройству восстановление возможно только при наличии этих данных.
Интеграция с PAM и sshd
- Откройте PAM-конфигурацию для SSH:
sudo nano /etc/pam.d/sshd
- Добавьте в начало файла строку (вставьте перед другими auth-правилами):
auth required pam_google_authenticator.so
Сохраните и закройте файл (Ctrl+O, Enter, Ctrl+X).
Откройте конфигурацию sshd:
sudo nano /etc/ssh/sshd_config- Убедитесь, что следующие параметры заданы или добавьте их в конец файла:
ChallengeResponseAuthentication yes
UsePAM yes- Если вы хотите, чтобы SSH требовал одновременно публичный ключ и 2FA (чтобы ключ не обходил 2FA), добавьте:
AuthenticationMethods publickey,keyboard-interactiveЭта настройка заставит SSH требовать сначала аутентификацию по ключу, а затем — по интерактивному методу (PAM), который обрабатывает Google Authenticator. Если вы хотите разрешить либо ключ, либо пароль+2FA, применяйте другие комбинации AuthenticationMethods.

- Сохраните файл и перезапустите демон SSH:
sudo systemctl restart ssh
Если у вас есть активная сессия SSH, оставьте её открытой до проверки новой аутентификации, чтобы избежать случайной блокировки доступа.
Добавление ключа в приложение на смартфоне
- Откройте приложение Google Authenticator (или совместимое приложение) на смартфоне или десктопе. Нажмите «+» и выберите “Enter a setup key” (в приложении может быть «Введите ключ настройки»).

- Введите имя учётной записи (например, server.example.com) для распознавания.

- Введите секретный ключ, сгенерированный ранее, и нажмите «Добавить».

При попытке подключения по SSH сервер теперь будет запрашивать проверочный код (verification code).

Важно: модуль libpam-google-authenticator работает для парольных входов через PAM. Если в вашей системе настроена только аутентификация по публичному/приватному ключу и вы не требуете дополнительно keyboard-interactive через AuthenticationMethods, вход по ключу будет обходить 2FA.
Варианты и альтернативы
- Если вы используете YubiKey или другой аппаратный токен, модуль libpam-google-authenticator не подходит. Для U2F/HOTP/YubiKey есть другие PAM-модули: pam_u2f, pam_yubico и т.д. Они требуют другой конфигурации PAM и sshd.
- Для корпоративных сред можно использовать централизованные решения: LDAP/AD + RADIUS (например, FreeRADIUS с Google Authenticator), или SSO-провайдеры с поддержкой SSH (через прокси).
- Если хотите требовать одновременно ключ и 2FA, используйте директиву AuthenticationMethods, как показано выше.
Резервные варианты и восстановление доступа
- Сохраняйте аварийные (scratch) коды, которые выводит
google-authenticatorпри генерации; каждый код применяется один раз. - Экспорт секретного ключа или QR-кода в защищённое хранилище (например, зашифрованный сейф) позволит восстановить доступ на новом устройстве.
- Для критичных серверов организуйте отдельный аккаунт с доступом по ключу (и храните ключ в защищённом месте) на случай, если основной метод восстановления недоступен.
Рольовые чеклисты
Чеклист для администратора:
- Синхронизировать время на сервере (systemd-timesyncd / chrony / ntp).
- Установить libpam-google-authenticator.
- [ ] Запустить
google-authenticatorдля каждого пользователя (или подготовить инструкцию для пользователей). - Обновить /etc/pam.d/sshd и /etc/ssh/sshd_config.
- Если нужно — настроить AuthenticationMethods для связки publickey + 2FA.
- Перезапустить sshd и протестировать вход из новой сессии.
- Развернуть инструкцию по восстановлению для пользователей.
Чеклист для пользователя:
- Сгенерировать секретный ключ на сервере (google-authenticator).
- Сохранить резервные коды в безопасном месте.
- Добавить ключ в приложение (Google Authenticator / Authy / другой совместимый TOTP-клиент).
- Проверить вход в новую SSH-сессию.
Руководство выполнения задачи (Playbook)
Шаги для быстрой настройки на новом сервере:
- Обновить пакеты:
sudo apt update && sudo apt upgrade -yУстановить и запустить sync времени при необходимости.
Установить пакет libpam-google-authenticator:
sudo apt install libpam-google-authenticator -yДля каждого пользователя выполнить
google-authenticatorи собрать ключи.Настроить PAM и sshd, как описано выше.
Перезапустить sshd и проверить доступ.
Частые проблемы и их решения
- Проблема: одноразовый код не проходит.
- Проверьте синхронизацию времени между сервером и устройством. На клиенте и сервере часы должны быть точными.
- Проблема: вход по ключу обходил 2FA.
- По умолчанию publickey может обходить keyboard-interactive. Чтобы этого избежать, настройте AuthenticationMethods publickey,keyboard-interactive.
- Проблема: блокировка пользователей после внедрения PAM.
- Держите открытую админ-сессию на сервере, пока не подтвердите, что новые логины работают. Имеете план отката (SSH-консоль через облачный провайдер или доступ по KVM).
Матрица рисков и способы смягчения
- Потеря устройства с ключами — риск: высокий. Смягчение: хранение резервных кодов, экспорт секретов в защищённый сейф, многоступенчатая проверка при восстановлении.
- Синхрон времени — риск: средний. Смягчение: использовать ntp/chrony и увеличить окно проверок (window).
- Брутфорс одноразовых кодов — риск: низкий при rate-limiting. Смягчение: включить rate-limiting и запрет многократного использования токена.
Когда 2FA через libpam-google-authenticator не подходит
- Если в организации требуется аппаратный U2F-токен (YubiKey) — используйте pam_u2f или pam_yubico.
- Для централизованного управления учётными записями и политиками предпочтительнее решения через RADIUS/LDAP.
Критерии приёмки
- Удалённый вход по SSH для учётной записи, где был выполнен
google-authenticator, требует одноразового кода. - Резервные коды сгенерированы и доступны администратору/пользователю в безопасном месте.
- При настройке AuthenticationMethods вход по ключу без 2FA невозможен.
Советы по безопасности
- Не отключайте логирование попыток входа (journalctl/secure). Анализ логов помогает обнаружить атаки.
- Регулярно проверяйте /home/*/.google_authenticator на предмет неожиданных изменений.
- По возможности комбинируйте 2FA с ограничением доступа по IP, fail2ban и строгими правами sudo.
Часто задаваемые вопросы
Я использую YubiKey. Могу ли я использовать 2FA с SSH по этому сценарию?
Нет. Модуль libpam-google-authenticator работает с TOTP (временными одноразовыми кодами) и рассчитан на стандартные приложения (Google Authenticator, Authy и др.). Для YubiKey используйте соответствующие PAM-модули, например pam_u2f или pam_yubico.
Могу ли я использовать тот же ключ аутентификации на другом телефоне?
Да. Достаточно иметь секретный ключ или QR-код. Перед переносом убедитесь, что удалили ключ со старого устройства, чтобы уменьшить риск компрометации.
Можно ли использовать другое приложение для 2FA?
Да. Любое приложение, поддерживающее стандарт TOTP/HOTP (в т.ч. Authy, FreeOTP и др.), будет работать с libpam-google-authenticator.
Заключение
Добавление двухфакторной аутентификации к SSH на Ubuntu существенно повышает безопасность, особенно для серверов, доступ к которым осуществляется по паролю. Для максимальной защиты комбинируйте 2FA с ключевой аутентификацией, ограничением доступа по IP и мониторингом логов. Всегда держите планы восстановления доступа и резервные коды в безопасном месте.
Image credit: Unsplash. All alterations and screenshots by Ramces Red.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента