Защитите SSH на Raspberry Pi с помощью двухфакторной аутентификации (TOTP)
- Включите SSH и обновите систему: sudo apt update && sudo apt -y upgrade.
- Установите libpam-google-authenticator и свяжите Pi с приложением TOTP (Google Authenticator или аналог).
- Включите ChallengeResponseAuthentication и добавьте auth required pam_google_authenticator.so в /etc/pam.d/sshd.
- Сохраните экстренные коды и включите rate-limiting. Рассмотрите аппаратные ключи (U2F) или SSH-ключи как альтернативу.
Введение

На Raspberry Pi часто запускают серверы и службы, к которым удобнее подключаться по SSH. Одно только имя пользователя и пароль — слабая защита. Двухфакторная аутентификация (2FA) добавляет второй уровень: одноразовый код, сгенерированный приложением на смартфоне или аппаратным ключом. В этой статье показано, как настроить TOTP (временные одноразовые пароли) для SSH на Raspberry Pi, а также даны рекомендации по эксплуатации, откату и альтернативы.
Важно: если вы используете вход только по SSH-ключу (public key authentication) без пароля, настроенный PAM-модуль для TOTP не будет задействован так же, как при вводе пароля. Рассмотрите комбинацию SSH-ключ + пароль/2FA либо требование дополнительной проверки через PAM для повышения безопасности.
Что такое TOTP в одной строке
TOTP — стандарт для временных одноразовых паролей (обычно 6 цифр, обновляется каждые 30 секунд). Приложения: Google Authenticator, Authy, Microsoft Authenticator и др.
Требования и подготовка
- Raspberry Pi с Raspberry Pi OS (ранее Raspbian).
- Доступ к локальной консоли или уже включённый SSH.
- Смартфон с приложением-генератором кодов (Google Authenticator, Authy или аналог).
- Резервный доступ (например, USB-клавиатура или локальный монитор) на случай ошибок настройки.
Короткая проверка системного времени: TOTP зависит от корректного времени. Установите NTP или проверьте время:
timedatectl statusЕсли время неверное, включите синхронизацию:
sudo timedatectl set-ntp trueОбновление системы
Перед внесением изменений обновите пакеты:
sudo apt update && sudo apt -y upgradeОбновления снижают риск несовместимостей.
Включение SSH
По умолчанию SSH может быть отключён. Включите и запустите сервис:
sudo systemctl enable ssh
sudo systemctl start ssh
Проверьте статус:
sudo systemctl status ssh --no-pagerЕсли вы подключаетесь по сети, найдите IP Pi:
hostname -IПодключение по SSH:
ssh pi@10.3.0.123Замените IP на свой.
Включение ChallengeResponseAuthentication
Чтобы SSH мог запрашивать дополнительный ответ (код TOTP), в конфигурации SSH нужно разрешить challenge-response.
Откройте файл sshd_config:
sudo nano /etc/ssh/sshd_configНайдите строки и установите:
ChallengeResponseAuthentication yes
AuthenticationMethods passwordПримечание: опция AuthenticationMethods управляет последовательностью факторов. Если вы хотите требовать сначала пароль, затем TOTP, используйте: AuthenticationMethods password,keyboard-interactive. Для более строгой модели — publickey,keyboard-interactive.
Сохраните файл (Ctrl+O, Enter), выйдите (Ctrl+X) и перезапустите SSH:
sudo systemctl restart sshПроверьте, что SSH всё ещё принимает подключения с другой сессии, прежде чем закрывать текущее окно.
Установка Google Authenticator PAM-модуля
На Raspberry Pi установите PAM-модуль для работы с TOTP:
sudo apt install libpam-google-authenticator -yЭтот пакет добавляет утилиту google-authenticator и библиотеку pam_google_authenticator.so.
Связывание Pi и приложения (создание QR-кода)
Запустите на Pi:
google-authenticatorУтилита задаст вопросы и сгенерирует секрет, QR-код и набор резервных кодов. Рекомендуемые ответы:
- Временные токены (time-based) — Y (рекомендуется).
- Разрешить многократное использование токена — N (в целях безопасности, чтобы не допустить повторного использования).
- Увеличить временной сдвиг — N (уменьшает возможности подбора).
- Включить rate-limiting — Y (ограничивает попытки).
Терминал отобразит QR-код (в текстовом виде). Для комфортного считывания увеличьте окно терминала или перенаправьте секрет в файл, чтобы открыть его в графической консоли. Сканируйте QR-код через приложение на телефоне:
- Откройте Google Authenticator или другое приложение.
- Добавьте учётную запись -> Сканировать QR-код.
- Подтвердите, что на телефоне появились 6-значные коды, обновляющиеся каждые 30 секунд.
Сохраните набор резервных (emergency) кодов в надёжном месте: менеджер паролей или физическая копия в сейфе. Они нужны, если вы потеряете устройство.


Настройка PAM для SSH
Откройте PAM-конфигурацию для SSH:
sudo nano /etc/pam.d/sshdДобавьте строку (вставьте в правильное место, см. ниже):
auth required pam_google_authenticator.so nullokПараметр nullok разрешает вход без TOTP для учётных записей без настроенного google-authenticator (опционально).
Куда вставлять строку:
- Если вы хотите, чтобы пользователю сначала предлагался пароль, а потом код — вставьте строку после директивы @include common-auth.
- Если вы хотите запросить код до ввода пароля — вставьте строку до @include common-auth.
Пример: запрос пароля, затем TOTP:
@include common-auth
auth required pam_google_authenticator.soСохраните и закройте файл. Перезапустите SSH:
sudo systemctl restart ssh
Теперь при подключении по SSH вы увидите приглашение для ввода пароля и/или одноразового кода в соответствии с выбранной последовательностью.
## Тестирование и отладка
1. Откройте новую сессию SSH (не закрывайте текущую, пока не убедитесь, что новый вход работает).
2. Подключитесь: ssh pi@IP.
3. Введите пароль (если требуется), затем код, отображённый в приложении.
Если вы заблокированы, используйте резервные коды или физический доступ к Pi.
Логи для диагностики: /var/log/auth.log
sudo tail -n 200 /var/log/auth.log
Ищите сообщения pam_google_authenticator и sshd.
## Безопасность и жёсткая конфигурация (рекомендации)
- Отключите вход по паролю вовсе и используйте только SSH-ключи и/или 2FA в виде keyboard-interactive. Но делайте это только после проверки резервного доступа.
- Ограничьте вход для конкретных пользователей в /etc/ssh/sshd_config через AllowUsers.
- Измените порт SSH для снижения числа случайных атак (security by obscurity, не заменяет другие меры).
- Включите Fail2Ban для блокировки IP после ряда неуспешных попыток.
- Отключите root-login: PermitRootLogin no.
- Примите политику сильных паролей для локальных учётных записей.
Примеры команд:
sudo apt install fail2ban -y sudo systemctl enable fail2ban
## Альтернативные подходы и когда 2FA не подходит
1. SSH-ключи (publickey) с защищённой паролем фразой — лучший вариант для автоматизированных систем и CI. Комбинируйте с аппаратным ключом.
2. U2F/FIDO2 аппаратные ключи (например, YubiKey) — обеспечивают высокую степень защиты и устойчивость к фишингу.
3. VPN + внутренний SSH: предоставьте доступ в закрытую сеть, где SSH доступ возможен только через VPN.
4. Если устройство критично и доступ по телефону невозможен (headless в удалённом дат-центре), 2FA через смартфон может быть неудобен — используйте аппаратные ключи или централизованную аутентификацию (LDAP/AD + MFA).
Когда TOTP не подходит:
- Устройства без возможности хранить резервные коды или без физического доступа к пользователю.
- Автоматизированные скрипты и задания cron, которым нужен безпарольный доступ.
## Восстановление и план инцидента (Incidents & rollback)
Сценарий: потеряли телефон с приложением TOTP.
Шаги восстановления:
1. Используйте резервный код, сохранённый при setup. Один код действует как одноразовый пароль.
2. Если резервные коды недоступны, используйте физический доступ к Raspberry Pi и выполните:
sudo pkill -f sshd
3. После восстановления доступа сгенерируйте новый секрет: google-authenticator и обновите приложение.
4. Удалите устаревшие backup-коды.
Рекомендация: храните резервные коды в надёжном менеджере паролей и заведите процесс ротации ключей при смене сотрудников.
## Рольные чек-листы
Для администратора (настраивает Pi):
- [ ] Обновил систему.
- [ ] Включил SSH и проверил статус.
- [ ] Установил libpam-google-authenticator.
- [ ] Запустил google-authenticator и сохранил резервные коды.
- [ ] Внёс изменения в /etc/pam.d/sshd и /etc/ssh/sshd_config.
- [ ] Перезапустил sshd и проверил вход в новой сессии.
- [ ] Настроил Fail2Ban и ограничил доступ по IP/пользователям.
Для пользователя (подключается по SSH):
- [ ] Установил приложение-генератор на смартфон.
- [ ] Сканировал QR-код и проверил генерацию кодов.
- [ ] Сохранил резервные коды в менеджере паролей или безопасном месте.
## Краткие ключевые числа (фактбокс)
- TOTP обычно: 6 цифр, интервал 30 секунд.
- Rate-limiting в google-authenticator: по умолчанию ограничение примерно 3 попытки/30 секунд (зависит от конфигурации).
- Резервные коды: обычно 8 штук, каждый одноразовый.
## Критерии приёмки
- Пользователь может подключиться по SSH, вводя ожидаемые факторы в правильной последовательности.
- В логах /var/log/auth.log нет ошибок pam_google_authenticator при успешной аутентификации.
- Резервный доступ подтверждён (локальный логин или сохранённые коды работают).
## Частые ошибки и отладка
- Ошибка времени: проверьте timedatectl и NTP.
- Неверный порядок правил PAM: код запрашивается до/после пароля — проверьте расположение строки в /etc/pam.d/sshd.
- SSH перестаёт принимать подключения: проверьте, что у вас остаётся активная сессия и логи sshd.
## Пример простой политики SSH (cheat sheet)
В /etc/ssh/sshd_config:
PermitRootLogin no PasswordAuthentication yes # временно при настройке; позже можно выключить ChallengeResponseAuthentication yes AuthenticationMethods password,keyboard-interactive AllowUsers pi youruser Port 2222
В /etc/pam.d/sshd добавьте:
auth required pam_google_authenticator.so nullok
## Заключение
Двухфакторная аутентификация с TOTP даёт значительное улучшение безопасности для SSH на Raspberry Pi. Обязательно сохраните резервные коды, протестируйте изменения в отдельной сессии и подумайте о более надёжных альтернативах (U2F, SSH-ключи). Наладьте процесс восстановления и ротации секретов, и внедрите дополнительные меры (Fail2Ban, ограничение по IP, запрет root).
Короткая инструкция в 3 шага для быстрой проверки:
1. Установите libpam-google-authenticator и запустите google-authenticator.
2. Включите ChallengeResponseAuthentication и вставьте pam_google_authenticator.so в /etc/pam.d/sshd.
3. Перезапустите sshd и проверьте вход из новой терминальной сессии.
Если необходимо, предоставлю чек-лист для вашей корпоративной политики доступа, шаблон для хранения резервных кодов или схему переключения на U2F.Похожие материалы
Stacks на Mac: упорядочьте рабочий стол быстро
Добавить Take Ownership в контекстное меню
Голосовой ввод в Windows 11 — включение и советы
Уведомления Google Форм на email — настройка
Petey на Apple Watch — ChatGPT на запястье