Как защитить сервер от взлома: Настройка 2FA через Google Authenticator PAM

Giteqa

Приветствую, друзья!

В современных реалиях классической парольной защиты или авторизации по SSH-ключам становится недостаточно, если учетная запись администратора будет скомпрометирована. Внедрение двухфакторной аутентификации (2FA) на базе одноразовых временных паролей (TOTP) создаёт дополнительный рубеж обороны: даже если злоумышленник перехватит ваш private key или пароль, он не сможет войти на сервер без физического доступа к вашему генератору кодов.

Как пример хочется сразу привести Steam Guard, благодаря которому никто так и не смог взломать аккаунт Гейба Ньюэлла, хотя тот сообщил всему миру свою почту и пароль от аккаунта. Так что включение двухфакторной аутентификации обеспечивает максимальную защиту вашего аккаунта.

В этом пошаговом руководстве мы настроим 2FA для SSH-подключений на базе модуля Google Authenticator PAM для операционных систем Ubuntu / Debian и CentOS / AlmaLinux. Кстати говоря, многие сайты стали внедрять Google Authenticator для входа в аккаунт, чтобы пользователи не теряли свои аккаунты.

Key Takeaways: Ключевые выводы

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

  • Гибкость политики авторизации: Модуль PAM позволяет настроить как связку «Пароль + 2FA», так и максимально защищенную комбинацию «SSH-ключ + 2FA».

  • Важность резервных кодов: Перед перезапуском демона SSH обязательно сохраните одноразовые аварийные коды (Emergency Recovery Codes), чтобы не потерять доступ к инфраструктуре при утере смартфона.

Архитектура работы TOTP 2FA в Linux

Двухфакторная аутентификация в Linux реализуется через подсистему PAM (Pluggable Authentication Modules). Когда клиент инициирует соединение через sshd, подсистема PAM перехватывает запрос и обращается к модулю pam_google_authenticator.so.

Модуль считывает секретный ключ из домашней директории пользователя (~/.google_authenticator), сверяет сгенерированный вашим смартфоном код с текущим временем сервера и принимает решение о предоставлении доступа.

Правда ли двухфакторная аутентификация надежна?

Да. Лично я неоднократно подвергался нападкам мошенников, которые связаны со Steam-аккаунтом, и более того, я даже вводил данные логина и пароля на сайтах данных мошенников, но не вводил код из самого Steam Guard. Именно благодаря нему я до сих пор владею своим аккаунтом и рекомендую всем использовать двухфакторную аутентификацию.

Пошаговое руководство по настройке

Шаг 1: Установка модуля PAM Зайдите на сервер под пользователем, для которого настраивается 2FA (с правами sudo).

Для Ubuntu / Debian:

Bash
sudo apt update && sudo apt install libpam-google-authenticator -y

Для RHEL / AlmaLinux / Rocky Linux:

Bash
sudo dnf install epel-release -y
sudo dnf install google-authenticator -y

Шаг 2: Генерация секретного ключа и QR-кода Выполните команду генерации от имени целевого пользователя:

Bash
google-authenticator

Мастер настройки задаст вам несколько вопросов. Рекомендуемые ответы:

  • Do you want authentication tokens to be time-based? (y) — активирует генерацию кодов на основе времени (TOTP). Правильно выбрать yes, т.к. если генерация кодов основана на времени, то каждый раз код будет случайным.

  • Появится крупный QR-код и секретный ключ. Отсканируйте QR-код в вашем приложении 2FA (Google Authenticator, Bitwarden, 2FA LassPass, Aegis).

  • ОБЯЗАТЕЛЬНО скопируйте и сохраните emergency recovery codes в надежное место.

  • Do you want me to update your "~/.google_authenticator" file? (y) — сохранит настройки в профиль.

  • Disallow multiple uses of the same authentication token? (y) — защитит от атак повторного воспроизведения (Replay Attacks).

  • Increase window size? (n) — оставляет окно валидности в 30 секунд (выберите y, если на сервере и смартфоне часто рассинхронизируются часы).

  • Enable rate-limiting? (y) — защищает от брутфорса (ограничивает до 3 попыток каждые 30 секунд).

Шаг 3: Настройка подсистемы PAM для SSH Отредактируйте конфигурационный файл службы SSH в PAM:

Bash
sudo nano /etc/pam.d/sshd

Добавьте в конец файла следующую строку:

Plaintext
auth required pam_google_authenticator.so nullok

Важно: Параметр nullok позволяет пользователям, у которых еще не настроен google-authenticator, входить по стандартному паролю или ключу. Когда все администраторы настроят 2FA, удалите nullok, чтобы сделать 2FA строго обязательным для всех.

Шаг 4: Конфигурация OpenSSH Демона (sshd_config) Теперь необходимо указать демону SSH запрашивать интерактивный ввод двухфакторного кода.

Отредактируйте файл /etc/ssh/sshd_config:

Bash
sudo nano /etc/ssh/sshd_config

Найдите и установите следующие значения директив:

Plaintext
KbdInteractiveAuthentication yes
UsePAM yes

Сценарий А: Авторизация по SSH-ключам + 2FA (Рекомендуемый стандарт) Если вы хотите, чтобы сервер запрашивал SSH-ключ, а затем TOTP-код (без ввода системного пароля), добавьте в конец файла:

Plaintext
AuthenticationMethods publickey,keyboard-interactive

Перезапустите службу SSH для применения настроек:

Bash
# Для Ubuntu / Debian
sudo systemctl restart ssh

# Для AlmaLinux / Rocky Linux / RHEL
sudo systemctl restart sshd

Чек-лист проверки доступа (Важно!)

НЕ ЗАКРЫВАЙТЕ текущую сессию SSH. Откройте новое окно терминала и проверьте подключение:

Bash
ssh -i ~/.ssh/id_rsa user@your_server_ip

Вы должны увидеть запрос:

Plaintext
Authenticated with partial success.
Verification code:

Введите 6-значный код из мобильного приложения. При успешном вводе вы попадете в консоль сервера.

ЗАПОМНИТЕ: Отключать терминал можно только после успешной проверки, в противном случае вы можете потерять доступ к серверу через данного пользователя и придется обращаться за помощью к системному администратору или интернет-провайдеру.

FAQ: Часто задаваемые вопросы

  • Что делать, если потерян телефон с Google Authenticator? Используйте один из сохраненных одноразовых аварийных кодов (emergency recovery codes) вместо 6-значного временного кода. Если у вас есть доступ к root-консоли (через VNC/IPMI панель хостинга MivoCloud), вы можете временно отключить 2FA для пользователя, удалив файл ~/.google_authenticator.

  • Почему рассинхронизируются коды и сервер пишет "Invalid code"? Специфика TOTP завязана на точное системное время. Убедитесь, что на сервере включена и работает служба синхронизации времени chrony или systemd-timesyncd:

    Bash
    sudo timedatectl status
    
  • Можно ли настроить 2FA для пользователя root? Да, аналогичным запуском google-authenticator из-под учетной записи root. Однако с точки зрения безопасности рекомендуется полностью отключить прямой вход под root (PermitRootLogin no) и использовать авторизацию через рядового пользователя с sudo.

Заключение

Настройка двухфакторной аутентификации — это один из самых эффективных и недорогих способов защитить серверную инфраструктуру от несанкционированного доступа. Потратив всего 10 минут на интеграцию PAM-модуля Google Authenticator, вы сводите к минимуму риски компрометации ваших сервисов.

Однако сетевая безопасность требует комплексного подхода. Высокий уровень защиты SSH должен подкрепляться надежным аппаратным фундаментом, защитой от DDoS-атак и изолированной сетью.

Если вы ищете отказоустойчивую платформу для развертывания критически важных проектов, оцените NVMe VPS и Выделенные Серверы от MivoCloud. Мы предоставляем чистую KVM-виртуализацию с аппаратной изоляцией ресурсов, мгновенными снапшотами для безопасного проведения системных настроек и высокоскоростным подключением.


Автор статьи: Anatolie Cohaniuc