В современном мире пароль — это уже недостаточная защита. Двухфакторная аутентификация (2FA) добавляет второй уровень безопасности: даже если злоумышленник узнает ваш пароль, без одноразового кода из приложения-аутентификатора он не сможет войти в систему. В этом руководстве мы подробно разберём, как настроить 2FA в Linux для входа в систему (локально и через SSH) и для выполнения команд с повышенными привилегиями (sudo).
Что потребуется
-
Приложение-аутентификатор: Google Authenticator, Authy, FreeOTP или любой другой, поддерживающий TOTP (Time-based One-Time Password).
-
Утилита google-authenticator в системе Linux (доступна в репозиториях).
-
Права суперпользователя для установки и изменения конфигурации PAM.
Часть 1: Установка и настройка google-authenticator
Установка
Настройка для пользователя
Выполните команду от имени пользователя, для которого нужно настроить 2FA:
Утилита задаст несколько вопросов:
-
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 с секретным ключом и настройками.

Часть 2: Настройка PAM для входа в систему
PAM (Pluggable Authentication Modules) управляет процессом аутентификации в Linux. Мы добавим модуль pam_google_authenticator.so в цепочку аутентификации.
Резервное копирование конфигурационных файлов
Перед изменениями всегда создавайте копии:
Настройка локального входа (через консоль или менеджер входа)
Редактируем файл /etc/pam.d/common-auth (в Debian/Ubuntu) или /etc/pam.d/login (в Fedora/RHEL). В Debian/Ubuntu в начало файла добавьте строку:
В итоге блок должен выглядеть примерно так:
Важно: Порядок строк имеет значение. Если поставить модуль 2FA после pam_unix, сначала будет запрашиваться пароль, затем код. Если перед — сначала код, затем пароль. Рекомендуется сначала пароль, затем код (безопаснее, так как пароль не передаётся в случае неправильного кода).
Настройка для SSH (если используете)
Редактируем /etc/pam.d/sshd и добавляем ту же строку в начало или после строки с pam_unix:
Также необходимо разрешить использование 2FA в конфигурации SSH: в файле /etc/ssh/sshd_config установите:
И перезапустите SSH:

Часть 3: Настройка двухфакторной аутентификации для sudo
Теперь настроим требование 2FA при выполнении команд с правами суперпользователя (sudo). Это добавляет дополнительный уровень защиты даже для уже вошедших пользователей.
Редактируем /etc/pam.d/sudo и добавляем перед строкой auth include system-auth (или аналогичной) строку:
Итоговый файл может выглядеть так:
Теперь при каждом вызове sudo система сначала запросит одноразовый код из аутентификатора, а затем пароль пользователя.
Совет: Если вы используете 2FA для sudo, обязательно имейте под рукой резервные коды на случай, если телефон разрядится.
Часть 4: Резервные коды и восстановление доступа
При настройке google-authenticator вы получили 5 резервных кодов. Они нужны, если вы потеряли телефон или приложение-аутентификатор. Храните их в надёжном месте (например, в зашифрованном файле или менеджере паролей).
Если вы потеряли доступ, войти можно с использованием одного из резервных кодов (каждый код действует один раз). После входа вы можете заново настроить 2FA.
Часть 5: Отключение двухфакторной аутентификации
Если 2FA больше не нужна или вы хотите её временно отключить, удалите (закомментируйте) добавленные строки в файлах PAM и, при необходимости, удалите файл ~/.google_authenticator пользователя.
Восстановите конфигурацию из резервных копий:

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.
Не забывайте хранить резервные коды в безопасном месте и тестировать настройки на тестовом пользователе, чтобы случайно не заблокировать себе доступ.
