Гид по технологиям

Защитите SSH на Raspberry Pi с помощью двухфакторной аутентификации (TOTP)

4 min read Security Обновлено 30 Nov 2025
SSH 2FA для Raspberry Pi — настройка TOTP
SSH 2FA для 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-ключи как альтернативу.

Введение

Two Factor Authentication Raspberry Pi Mfa

На 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

Enable SSH on your Raspberry Pi.

Проверьте статус:

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-код через приложение на телефоне:

  1. Откройте Google Authenticator или другое приложение.
  2. Добавьте учётную запись -> Сканировать QR-код.
  3. Подтвердите, что на телефоне появились 6-значные коды, обновляющиеся каждые 30 секунд.

Сохраните набор резервных (emergency) кодов в надёжном месте: менеджер паролей или физическая копия в сейфе. Они нужны, если вы потеряете устройство.

You can download the Google Authenticator app for free, from Google Play.

It's recommended that you use Google Authenticator to generate time-sensitive tokens.

Настройка 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.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Stacks на Mac: упорядочьте рабочий стол быстро
macOS

Stacks на Mac: упорядочьте рабочий стол быстро

Добавить Take Ownership в контекстное меню
Windows

Добавить Take Ownership в контекстное меню

Голосовой ввод в Windows 11 — включение и советы
Windows

Голосовой ввод в Windows 11 — включение и советы

Уведомления Google Форм на email — настройка
Google Forms

Уведомления Google Форм на email — настройка

Petey на Apple Watch — ChatGPT на запястье
Приложения

Petey на Apple Watch — ChatGPT на запястье

Искать по содержимому в Windows: добавить типы файлов
Windows

Искать по содержимому в Windows: добавить типы файлов