MFA для SSH и WireGuard без вендорского PAM

Украденный SSH-ключ даёт доступ к серверу целиком. Второй фактор ограничивает ущерб. Ниже два способа для SSH и честный ответ, что делать с WireGuard, у которого собственного MFA нет.
Вариант 1. Аппаратный ключ FIDO2 для SSH
Начиная с OpenSSH 8.2 поддерживаются ключи, привязанные к физическому токену (YubiKey и аналоги):
ssh-keygen -t ed25519-sk -C "admin1-yubikey"
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub admin1@SERVER
Для входа нужно прикоснуться к токену. Закрытый ключ без токена бесполезен. Нужны OpenSSH 8.2 и выше на обеих сторонах и токен с поддержкой FIDO2. Это самый надёжный способ из описанных здесь.
Вариант 2. Ключ плюс одноразовый код (TOTP)
Подходит, если токенов нет. Установите модуль и настройте код для пользователя:
sudo apt install libpam-google-authenticator
google-authenticator # от имени пользователя, отсканируйте QR, сохраните резервные коды
В /etc/pam.d/sshd добавьте строку и закомментируйте запрос пароля:
auth required pam_google_authenticator.so
#@include common-auth
В /etc/ssh/sshd_config:
UsePAM yes
KbdInteractiveAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
Директива AuthenticationMethods требует и ключ, и код. Не закрывайте текущую сессию, пока не проверите вход с новой. Ошибка здесь блокирует вход на сервер для всех. Сохраните запасной доступ (консоль хостера). Проверка и применение:
sudo sshd -t && sudo systemctl reload ssh
Название директивы KbdInteractiveAuthentication появилось в новых версиях OpenSSH, в старых оно называется ChallengeResponseAuthentication. Общую настройку SSH см. в статье включение SSH.
WireGuard и второй фактор
В WireGuard нет учётных записей и кодов: доступ определяется ключом устройства. Доступны три подхода:
| Подход | Что даёт | Ограничение |
|---|---|---|
| MFA на сервисах за VPN | Для входа на SSH и в админки за туннелем нужен второй фактор (варианты выше) | Сам туннель остаётся доступным по ключу |
| Отдельный ключ на устройство и отзыв | Утерянное устройство отключают одной командой | Не защищает от копирования ключа |
| Шлюз с учётными записями поверх WireGuard | Вход через SSO и MFA, профили на пользователя | Отдельный продукт и сопровождение |
Для небольшой инфраструктуры разумно сочетание первых двух: ключ на устройство и MFA на SSH. Как поднять туннель: WireGuard. Отзыв ключа: wg set wg0 peer CLIENT_PUBLIC_KEY remove.
Как проверить
ssh -v admin1@SERVER # смотрите: Authentications that can continue
sudo sshd -T | grep -E 'authenticationmethods|passwordauthentication'
Вход с ключом без кода должен быть отклонён, вход с ключом и кодом — успешным, вход по паролю — отклонён. Если вход невозможен, откатите изменения из консоли хостера, восстановив прежние версии /etc/pam.d/sshd и sshd_config. Что ещё закрыть на сервере: hardening Linux.




















