Настройка двухфакторной аутентификации (2FA) в Linux для входа в систему и sudo

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

Что потребуется

  • Приложение-аутентификатор: Google Authenticator, Authy, FreeOTP или любой другой, поддерживающий TOTP (Time-based One-Time Password).

  • Утилита google-authenticator в системе Linux (доступна в репозиториях).

  • Права суперпользователя для установки и изменения конфигурации PAM.

Часть 1: Установка и настройка google-authenticator

Установка

# Ubuntu/Debian

sudo apt install libpam-google-authenticator

# Fedora/RHEL

sudo dnf install google-authenticator

# Arch Linux

sudo pacman -S libpam-google-authenticator

Настройка для пользователя

Выполните команду от имени пользователя, для которого нужно настроить 2FA:

google-authenticator

Утилита задаст несколько вопросов:

  • Do you want authentication tokens to be time-based? — ответьте y (рекомендуется).

  • На экране появится QR-код, секретный ключ и несколько резервных кодов. Сохраните резервные коды в надёжном месте (например, в менеджере паролей) — они понадобятся, если вы потеряете доступ к приложению-аутентификатору.

  • Do you want me to update your «/home/username/.google_authenticator» file? — y.

  • Do you want to disallow multiple uses of the same authentication token? — y.

  • Do you want to increase the original time window for token validation? — n (по умолчанию).

  • Do you want to enable rate-limiting for this user? — y (защита от подбора).

Теперь у пользователя создан файл ~/.google_authenticator с секретным ключом и настройками.

QR-код, сгенерированный утилитой google-authenticator в терминале Linux для настройки 2FA
QR-код для добавления учётной записи в приложение-аутентификатор (Google Authenticator, Authy и др.)

Часть 2: Настройка PAM для входа в систему

PAM (Pluggable Authentication Modules) управляет процессом аутентификации в Linux. Мы добавим модуль pam_google_authenticator.so в цепочку аутентификации.

Резервное копирование конфигурационных файлов

Перед изменениями всегда создавайте копии:

sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup

sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup

Настройка локального входа (через консоль или менеджер входа)

Редактируем файл /etc/pam.d/common-auth (в Debian/Ubuntu) или /etc/pam.d/login (в Fedora/RHEL). В Debian/Ubuntu в начало файла добавьте строку:

auth required pam_google_authenticator.so

В итоге блок должен выглядеть примерно так:

auth required pam_google_authenticator.so

auth [success=1 default=ignore] pam_unix.so nullok_secure

…

Важно: Порядок строк имеет значение. Если поставить модуль 2FA после pam_unix, сначала будет запрашиваться пароль, затем код. Если перед — сначала код, затем пароль. Рекомендуется сначала пароль, затем код (безопаснее, так как пароль не передаётся в случае неправильного кода).

Настройка для SSH (если используете)

Редактируем /etc/pam.d/sshd и добавляем ту же строку в начало или после строки с pam_unix:

auth required pam_google_authenticator.so

Также необходимо разрешить использование 2FA в конфигурации SSH: в файле /etc/ssh/sshd_config установите:

ChallengeResponseAuthentication yes

И перезапустите SSH:

sudo systemctl restart sshd
Пример добавления строки auth required pam_google_authenticator.so в файл /etc/pam.d/common-auth
Включение модуля 2FA в PAM для входа в систему

Часть 3: Настройка двухфакторной аутентификации для sudo

Теперь настроим требование 2FA при выполнении команд с правами суперпользователя (sudo). Это добавляет дополнительный уровень защиты даже для уже вошедших пользователей.

Редактируем /etc/pam.d/sudo и добавляем перед строкой auth include system-auth (или аналогичной) строку:

auth required pam_google_authenticator.so

Итоговый файл может выглядеть так:

#%PAM-1.0

auth required pam_google_authenticator.so

auth include system-auth

…

Теперь при каждом вызове sudo система сначала запросит одноразовый код из аутентификатора, а затем пароль пользователя.

Совет: Если вы используете 2FA для sudo, обязательно имейте под рукой резервные коды на случай, если телефон разрядится.

Часть 4: Резервные коды и восстановление доступа

При настройке google-authenticator вы получили 5 резервных кодов. Они нужны, если вы потеряли телефон или приложение-аутентификатор. Храните их в надёжном месте (например, в зашифрованном файле или менеджере паролей).

Если вы потеряли доступ, войти можно с использованием одного из резервных кодов (каждый код действует один раз). После входа вы можете заново настроить 2FA.

Часть 5: Отключение двухфакторной аутентификации

Если 2FA больше не нужна или вы хотите её временно отключить, удалите (закомментируйте) добавленные строки в файлах PAM и, при необходимости, удалите файл ~/.google_authenticator пользователя.

Восстановите конфигурацию из резервных копий:

sudo cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth

sudo cp /etc/pam.d/sshd.backup /etc/pam.d/sshd

Запрос одноразового кода при использовании sudo после настройки двухфакторной аутентификации.
После настройки 2FA для sudo, перед вводом пароля система запросит код из аутентификатора

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

Что делать, если я потерял телефон с аутентификатором?

Используйте один из сохранённых резервных кодов. Если их нет, вам потребуется зайти в систему через консоль (физический доступ) и удалить файл ~/.google_authenticator для своего пользователя.

Можно ли настроить 2FA для всех пользователей сразу?

Да, но каждому пользователю нужно запустить google-authenticator и создать свой файл. Модуль PAM автоматически использует файл в домашней директории пользователя.

Как отключить 2FA для определённого пользователя (например, root)?

Для этого нужно удалить файл ~/.google_authenticator у этого пользователя или закомментировать строку в PAM и использовать условное включение модуля (например, через pam_access или pam_succeed_if).

Поддерживает ли это решение вход по SSH без пароля?

Если используется ключ SSH, 2FA всё равно запросит код, если включена ChallengeResponseAuthentication. Можно настроить два этапа: ключ SSH + 2FA, что является очень безопасным вариантом.

Как проверить, что 2FA работает?

Откройте новое окно терминала или попробуйте подключиться по SSH. Вам будет предложено ввести сначала пароль, а затем одноразовый код (или наоборот, в зависимости от порядка строк).

Почему после настройки 2FA я не могу войти через SSH?

Проверьте, что в /etc/ssh/sshd_config установлено ChallengeResponseAuthentication yes, и что вы перезапустили службу SSH. Также убедитесь, что в логах (/var/log/auth.log или journalctl -u sshd) нет ошибок.

Можно ли использовать аппаратный ключ (YubiKey) вместо TOTP?

Да, PAM поддерживает и другие методы. Для YubiKey используется модуль pam_yubico, настройка аналогична, но требует дополнительных шагов.

Заключение

Настройка двухфакторной аутентификации в Linux — это эффективный способ значительно повысить безопасность системы. Даже если пароль будет скомпрометирован, без второго фактора доступ к системе останется закрыт. Следуя этому руководству, вы сможете защитить как локальный вход, так и выполнение команд с правами sudo, а также настроить 2FA для SSH.

Не забывайте хранить резервные коды в безопасном месте и тестировать настройки на тестовом пользователе, чтобы случайно не заблокировать себе доступ.