Как установить и настроить двухфакторную аутентификацию SSH на VPS
Даже украденный SSH-ключ или подобранный пароль не откроет сервер, если на входе стоит второй фактор. Настроить двухфакторную аутентификацию SSH на VPS можно за пятнадцать минут: вход будет требовать одноразовый код из приложения на телефоне вдобавок к ключу. Разберём установку по шагам и, что важнее, покажем, как не заблокировать самого себя.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем вообще второй фактор для SSH
Обычный вход по паролю или даже по ключу опирается на один секрет. Пароль можно подобрать или выудить фишингом, ключ — украсть вместе с ноутбуком или скопировать с плохо защищённой машины. Второй фактор ломает эту логику: чтобы войти, нужно не только знать секрет, но и физически держать в руках устройство, генерирующее одноразовый код. Даже полная компрометация ключа не даёт доступа без телефона.
Работает это по стандарту TOTP — временных одноразовых паролей. Приложение на телефоне и сервер хранят общий секрет и независимо вычисляют по нему шестизначный код, который меняется каждые тридцать секунд. Никакой связи между телефоном и сервером в момент входа не нужно — коды совпадают за счёт синхронизированного времени. Именно поэтому TOTP работает даже без интернета на телефоне.
Честно о том, кому это нужно. Для домашнего пет-проекта второй фактор часто избыточен. Но для сервера с реальными данными, доступами клиентов или платёжной логикой это дешёвая и мощная страховка. Особенно если к серверу подключается несколько человек.
Шаг 1. Подготовка и страховка от блокировки
Прежде чем что-либо менять, откройте вторую SSH-сессию к серверу и держите её открытой до самого конца. Это ваш спасательный выход: если новая конфигурация окажется неверной и вход сломается, у вас останется живая консоль, чтобы всё откатить. Пренебрежение этим правилом — причина большинства историй про «сам себя запер».
Работаем на Ubuntu 24.04. Установите модуль PAM для генерации и проверки TOTP:
apt update
apt install -y libpam-google-authenticator
Полезно, чтобы у вас уже был настроен вход по SSH-ключу — второй фактор мы добавим поверх него, а не вместо. И убедитесь, что провайдер даёт запасной путь на сервер. У MAATRIX кроме SSH есть доступ через панель управления и консоль, так что даже при неверной настройке вы не окажетесь заперты снаружи.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPSШаг 2. Генерация секрета пользователя
Второй фактор привязывается к конкретному пользователю. Зайдите под тем аккаунтом, для которого настраиваете вход, и запустите генератор:
google-authenticator
Утилита задаст несколько вопросов. На «Do you want authentication tokens to be time-based» отвечайте yes — это и есть TOTP. Программа покажет QR-код, который нужно отсканировать приложением (Google Authenticator, Aegis, любое TOTP-совместимое), и выдаст список одноразовых резервных кодов. Эти резервные коды — ваш второй спасательный круг: сохраните их в надёжном месте вне сервера, каждый сработает один раз, если телефон окажется недоступен.
На остальные вопросы в большинстве случаев отвечайте yes: обновлять файл настроек, запрещать повторное использование одного кода, разрешать небольшой сдвиг по времени для компенсации рассинхронизации часов. Секрет сохранится в файле ~/.google_authenticator в домашней папке пользователя.
Шаг 3. Подключение модуля к PAM
Теперь нужно объяснить системе аутентификации, что при входе по SSH требуется второй фактор. Откройте файл конфигурации PAM для SSH:
nano /etc/pam.d/sshd
Добавьте строку подключения модуля. Ключевой момент — параметр, который решает судьбу пользователей без настроенного второго фактора. С опцией nullok те, кто ещё не прошёл генерацию, смогут войти без кода; без неё вход без секрета будет запрещён. На этапе внедрения удобно оставить nullok, чтобы не заблокировать коллег, а потом убрать:
auth required pam_google_authenticator.so nullok
Обдуманно решите, оставлять ли строку @include common-auth — она отвечает за проверку пароля. Комбинация «ключ плюс код» надёжнее и удобнее, чем «пароль плюс код».
Шаг 4. Настройка демона SSH
Осталось разрешить SSH использовать интерактивную проверку и связать факторы. Откройте /etc/ssh/sshd_config и приведите ключевые параметры к нужному виду:
KbdInteractiveAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Последняя строка — самая важная. Она требует одновременно и SSH-ключ, и второй фактор: сначала ключ, затем код. Именно такая связка даёт настоящую двухфакторность. Если оставить только keyboard-interactive, вход будет по паролю плюс коду, что слабее.
Перезапустите демон и, не закрывая страховочную сессию, войдите из нового окна терминала:
systemctl restart ssh
Система должна принять ключ, а затем спросить код подтверждения. Ввели шестизначное число из приложения — вы внутри. Только убедившись, что новый вход стабильно работает, закрывайте запасную сессию.
Шаг 5. Подключение остальных пользователей
Если к серверу ходит команда, каждый участник проходит шаг с генерацией секрета под своим аккаунтом самостоятельно. Пока не все настроились, держите nullok, чтобы никого не заблокировать. Когда все получили свои QR-коды и проверили вход, уберите nullok из конфигурации PAM — с этого момента вход без второго фактора будет невозможен ни для кого.
Отдельно продумайте сервисные и автоматические подключения: деплой, бэкапы, мониторинг. Для них интерактивный ввод кода не подходит. Такие подключения обычно выносят на отдельный ограниченный ключ и отдельного пользователя, для которого второй фактор не требуется, но доступ жёстко урезан по командам и адресам.
Шаг 6. Что делать при потере телефона
Главный страх при внедрении 2FA — потерять доступ вместе с телефоном. Именно для этого существуют резервные коды из шага 2. Каждый из них одноразово заменяет код из приложения. Держите их отдельно от сервера — в менеджере паролей или на бумаге в надёжном месте.
Если и резервные коды недоступны, вас выручит запасной путь провайдера: через панель управления или консоль восстановления можно зайти на сервер в обход SSH и либо перенастроить второй фактор, либо временно вернуть nullok. Поэтому выбор хостинга с полноценным аварийным доступом — часть той же защиты. У MAATRIX такой доступ есть, а оплатить сервер можно из России картой, по СБП, криптой или токеном MAAT.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPSОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Заменяет ли второй фактор SSH-ключ?
Нет, лучшая схема — ключ плюс код через AuthenticationMethods publickey,keyboard-interactive. Так вход требует и файл ключа, и одноразовый код.
Что будет при потере телефона?
Используйте резервные коды, выданные при генерации, или запасной доступ провайдера через панель. Поэтому храните резервные коды вне сервера.
Нужен ли интернет на телефоне для кода?
Нет. TOTP-коды вычисляются по времени и общему секрету, связь с сервером в момент входа не нужна.
Как не заблокировать себя при настройке?
Держите вторую SSH-сессию открытой до конца и используйте nullok на этапе внедрения. У MAATRIX есть аварийный доступ через панель на случай ошибки.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.