Двухфакторная аутентификация (2FA) требует не только знания пароля/ключа, но и наличия физического устройства (смартфона) с одноразовым кодом TOTP. Даже при утечке SSH-ключа злоумышленник не сможет войти без второго фактора.
2FA для SSH через Google Authenticator
apt install libpam-google-authenticator -y
# Настроить для каждого пользователя (запустить от пользователя!)
su - admin
google-authenticator
# Ответить Y, Y, N, Y, Y
# Отсканировать QR-код в Authy/Google Authenticator
Настройка PAM и sshd_config
# /etc/pam.d/sshd
auth required pam_google_authenticator.so
# /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
# (требует ключ И одноразовый код)
systemctl reload sshd
Коды экстренного восстановления
# Расположение файла 2FA пользователя
cat ~/.google_authenticator
# Первая строка — секретный ключ
# Строки с ** — коды восстановления (одноразовые)
2FA для WordPress
Установите плагин WP 2FA или Two Factor Authentication:
- Установить плагин из WordPress Repository
- Включить для всех администраторов в настройках плагина
- Каждый пользователь настраивает свой TOTP при следующем входе
2FA для ISPmanager 6
# ISPmanager поддерживает 2FA через TOTP
# Настройки → Профиль → Двухфакторная аутентификация
# Или через API:
# POST /api/ispmgr/totp.set с параметрами пользователя
Поддерживаемые приложения-аутентификаторы
| Приложение | Платформа | Особенности |
|---|---|---|
| Authy | iOS, Android, Desktop | Синхронизация между устройствами |
| Google Authenticator | iOS, Android | Простота, без синхронизации |
| Microsoft Authenticator | iOS, Android | Облачный бэкап |
| Bitwarden (Premium) | Все | Встроен в менеджер паролей |
| 1Password | Все | Встроен в менеджер паролей |
Типичные ошибки 2FA
| Симптом | Причина | Что делать |
|---|---|---|
| Invalid verification code при верно введённом коде | Рассинхронизация системного времени сервера — TOTP чувствителен к сдвигу более 1–2 минут | Синхронизируйте время: timedatectl set-ntp true и проверьте timedatectl status |
| PAM authentication failure в auth.log при верном коде | Строка pam_google_authenticator.so стоит в неверном порядке относительно pam_unix.so или common-auth | Разместите её выше @include common-auth в /etc/pam.d/sshd и перезапустите sshd |
| Пользователь потерял телефон, коды восстановления не сохранены | Файл ~/.google_authenticator привязан к устройству, резервных кодов нет | Другой администратор входит по SSH-ключу и удаляет/пересоздаёт файл 2FA для пользователя |
| Time out of sync в приложении-аутентификаторе | Часы смартфона разошлись с реальным временем | Включите автоматическую синхронизацию времени в настройках телефона |
Сравнение методов второго фактора
| Метод | Защита от фишинга | Нужна поддержка на сервере |
|---|---|---|
| TOTP (Google Authenticator) | Нет — код можно перехватить и ввести вручную на поддельной странице | Нет, достаточно PAM-модуля |
| SSH-сертификаты (CA) | Да, привязаны к паре ключей, а не к вводимому коду | Да, нужен собственный центр сертификации |
| U2F / WebAuthn (для веб-панелей) | Да, криптографически привязан к домену — не сработает на фишинговом сайте | Да, поддержка должна быть в самой панели и браузере |
Когда 2FA не подходит
- Автоматические скрипты и cron-задачи, использующие SSH-ключ без интерактивной сессии — TOTP через AuthenticationMethods заблокирует такой вход
- Крупная распределённая команда с частой сменой состава — управлять централизованно проще через SSH-сертификаты, а не личные TOTP-секреты каждого
- Аварийный сценарий без второго администратора с доступом — если единственный человек с 2FA потерял телефон и коды, восстановление потребует доступа через консоль хостинг-провайдера
- Тестовый VPS с низкой ценностью данных для личных экспериментов — дополнительный шаг входа не оправдан рисками
Базовая настройка sshd_config, на которую опирается эта схема, разобрана в статье «SSH Hardening: безопасная настройка сервера от взлома». Для веб-панелей вроде cPanel есть отдельный разбор в статье «Двухфакторная аутентификация в cPanel: настройка 2FA».
Проверка результата
Убедитесь, что 2FA реально требуется при входе, а не просто настроена:
# Проверить, что вход по одному ключу без TOTP отклоняется
ssh -o PreferredAuthentications=publickey user@server
# Ожидается запрос verification code, а не мгновенный вход
# Права на файл секрета должны быть закрыты от других пользователей
stat -c "%a %n" ~/.google_authenticator
# Проверить активные методы аутентификации в текущей конфигурации
sshd -T | grep -i authenticationmethods
Если нужен более устойчивый к краже ключей вариант входа для команды, стоит посмотреть на «SSH-сертификаты: вход через центр сертификации».