Опубликовано 9 октября 2026 г. · Обновлено 9 октября 2026 г.
Двухфакторная аутентификация SSH: аппаратные ключи и TOTP без риска потерять доступ
Аутентификация по ключам SSH это лучший отдельный шаг для VPS, но ключ всего лишь один фактор: нечто, что у вас есть, хранящееся в виде файла. Если файл скопируют с ноутбука, из резервной копии или со взломанной рабочей станции, у атакующего есть всё необходимое. Двухфакторная аутентификация закрывает этот разрыв, требуя при входе что-то ещё. Определение простое; риск в внедрении, потому что ошибка в sshd_config может лишить вас доступа к собственному серверу. Это руководство показывает два подхода, аппаратный ключ FIDO2 и код TOTP через PAM, и порядок внедрения, который сохраняет путь назад на каждом шаге. Оно опирается на руководство по защите SSH, поэтому сначала сделайте его.
В этой статье
Почему одного ключа недостаточно Выбор второго фактора Вариант A: аппаратный ключ FIDO2 Вариант B: TOTP через PAM Внедрение без потери доступа Ограничения и с чем сочетать Часто задаваемые вопросыБыстрый результат (10 минут)
- Проверьте версию OpenSSH на обеих сторонах командой
ssh -V. Ключам FIDO нужны клиент и сервер с их поддержкой. - Откройте вторую сессию SSH к серверу и оставьте её подключённой на всё время работы.
- Убедитесь, что у вашего провайдера VPS есть веб-консоль или режим восстановления на случай поломки SSH.
- Убедитесь, что вы можете выполнить
sudo sshd -tдля проверки конфигурации перед перезагрузкой. - Решите, кому второй фактор нужен в первую очередь: начните с учётных записей, которым доступен sudo.
Почему одного ключа недостаточно
Файл закрытого ключа можно скопировать незаметно. Вредоносное ПО на машине разработчика, незашифрованная резервная копия или утёкший образ диска дают атакующему рабочий вход без неудачных попыток, которые вы могли бы увидеть. Парольная фраза на ключе помогает, но защищает файл, а не вход. Второй фактор означает, что украденного файла самого по себе недостаточно. CISA утверждает, что пользователи, включившие MFA, значительно реже оказываются взломанными, и, что полезнее для выбора метода, что любая MFA лучше, чем её отсутствие, а устойчивая к фишингу MFA это стандарт, к которому стоит стремиться всем лидерам отрасли. Там же отмечено, что единственная широко доступная устойчивая к фишингу аутентификация это FIDO/WebAuthn.
Эта рамка подсказывает выбор для SSH. Ключ безопасности FIDO2 сильнее, потому что закрытый ключ никогда не покидает устройство, а каждый вход требует физического касания. Код TOTP слабее, так как код можно ввести в поддельный запрос, но он намного лучше отсутствия второго фактора, работает на любом сервере и ничего не стоит. Если вы читали о том, как атакующие попадают на небольшие серверы, вы знаете, что украденные учётные данные остаются одним из главных путей.
Выбор второго фактора
Сравним оба варианта по тому, что важно для небольшого сервера:
- Ключ FIDO2 (
ed25519-sk): аппаратная защита, требуется касание, не нужно вводить коды, не нужно дополнительное ПО на сервере. Нужен OpenSSH 8.2 или новее и физический ключ безопасности каждому администратору. Лучший выбор, если вы можете купить два ключа, один запасной. - TOTP через PAM: работает с любым приложением-аутентификатором, не требует оборудования, подходит для старых систем. Добавляет на сервер модуль PAM и шаг настройки для каждого пользователя. Код могут выманить фишингом или передать в реальном времени.
Можно сочетать оба, но для одного-двух администраторов выберите один и сделайте его качественно. Что бы вы ни выбрали, оставьте вход по ключам первым фактором, а вход по паролю отключённым.
Вариант A: аппаратный ключ FIDO2
В OpenSSH 8.2 появилась поддержка аппаратных аутентификаторов FIDO/U2F. Согласно заметкам к релизу, устройства FIDO поддерживаются новыми типами открытых ключей ecdsa-sk и ed25519-sk через встроенный промежуточный слой, зависящий от libfido2. Сгенерируйте ключ на своей машине при подключённом ключе безопасности:
ssh-keygen -t ed25519-sk -O verify-required -C "admin-yubikey-1"
Опции объясняет руководство ssh-keygen. Аутентификаторы FIDO, как правило, требуют, чтобы пользователь подтверждал операции касанием. verify-required означает, что закрытый ключ должен требовать проверки пользователя для каждой подписи, и сейчас единственный поддерживаемый способ это PIN. Если добавить -O resident, дескриптор ключа хранится на самом аутентификаторе, для чего обычно сначала нужно задать PIN. Избегайте no-touch-required, который убирает проверку присутствия; sshd по умолчанию отклоняет такие подписи.
Скопируйте открытый ключ (id_ed25519_sk.pub) в ~/.ssh/authorized_keys на сервере. Чтобы сервер требовал проверку пользователя для ключей FIDO, задайте в sshd_config:
PubkeyAuthOptions verify-required
В руководстве по sshd_config сказано, что verify-required требует, чтобы подпись ключа FIDO подтверждала проверку пользователя, например через PIN, и что на другие типы ключей опция не влияет. Последнее важно: одна эта настройка не мешает войти с обычным ключом, который всё ещё в authorized_keys. Когда ваш ключ FIDO заработает, удалите обычные ключи администраторов. Зарегистрируйте второй аппаратный ключ как запасной и храните в надёжном месте.
Хотите, чтобы настройку SSH проверили?
Бесплатная проверка в режиме только чтения смотрит, как настроен и открыт SSH, не трогая ваши параметры.
Получить бесплатную проверку сервера Связаться с инженером по безопасностиВариант B: TOTP через PAM
Модуль PAM Google Authenticator формирует коды на основе времени, которые умеет генерировать любое стандартное приложение-аутентификатор. Установите его (в Debian и Ubuntu пакет называется libpam-google-authenticator), затем каждый пользователь один раз запускает google-authenticator, чтобы создать секрет в домашнем каталоге и отсканировать QR-код. Сохраните аварийные коды, которые он выводит, в офлайн-месте.
В документации проекта строка PAM показана как auth required pam_google_authenticator.so. Опция nullok разрешает вход без кода тем, кто ещё не настроил его, что удобно при внедрении, но потом её нужно убрать. Модуль пытается компенсировать рассинхронизацию времени, а если код не подходит, в README советуют подождать 30 секунд (но не дольше), чтобы получить три разных кода. Держите часы сервера синхронизированными.
Затем велите sshd требовать ключ и после него код. В руководстве по sshd_config AuthenticationMethods определён как методы, которые должны быть успешно пройдены для предоставления доступа, с замечанием, что каждый указанный метод должен быть также явно включён. Поэтому включите keyboard-interactive и потребуйте оба:
KbdInteractiveAuthentication yes
UsePAM yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
С запятой сначала проверяется ключ, затем код. В Debian и Ubuntu /etc/pam.d/sshd обычно подключает и системный парольный стек, поэтому закомментируйте там строку @include common-auth, если нужен только проверочный код, без дополнительного запроса пароля. Проверяйте каждое изменение так, как описано далее.
Внедрение без потери доступа
Изменение аутентификации единственное место, где опечатка стоит доступа к серверу. Каждый раз следуйте такому порядку:
- Держите текущую сессию SSH открытой и подключите вторую.
- Сделайте копию конфигурации:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak. Проверьте и файлы в/etc/ssh/sshd_config.d/, потому что они могут переопределить вашу настройку. - Проверьте синтаксис командой
sudo sshd -tи только потом перезагрузите конфигурацию:sudo systemctl reload ssh(в некоторых дистрибутивах юнит называетсяsshd). - С третьего терминала откройте совершенно новое подключение и убедитесь, что оно работает. Не закрывайте старые сессии, пока это не подтвердится.
- Внедряйте по одному администратору. Для TOTP временно используйте
nullok, затем уберите, когда все подключены. - Сохраните запасной путь: веб-консоль провайдера или режим восстановления, а также аварийные коды или запасной аппаратный ключ.
Задокументируйте, как подключается новый администратор и как вы отзываете доступ уходящего. Файл authorized_keys это список тех, кто может войти, поэтому регулярно проверяйте его; см. статью об authorized_keys.
Ограничения и с чем сочетать
Второй фактор защищает вход, а не сервер. Он не поможет, если уязвим какой-то сервис, если у атакующего уже есть сессия или если учётная запись администратора после входа может всё. Сочетайте его с остальной защитой: оставьте fail2ban и ограничения частоты для SSH, ограничьте круг входящих через AllowUsers и ограничьте возможности каждой учётной записи после входа, как описано в руководстве пользователи, sudo и минимальные привилегии.
Помните и то, что автоматизация ломается, если ей нужно предоставлять второй фактор. Задания развёртывания и забор бэкапов должны использовать отдельные ограниченные ключи с принудительными командами, и никогда не делите аппаратный ключ администратора. Если что-то пошло не так и вы подозреваете украденный ключ или сессию, следуйте руководству по реагированию на взлом и держите это изменение в своём чек-листе безопасности.
Если после смены аутентификации вы не можете войти, используйте руководство потеряли доступ к VPS после смены SSH. Справка: TOTP (одноразовый пароль по времени), FIDO2 и WebAuthn (вход с аппаратным ключом) и PAM (подключаемые модули аутентификации).
Часто задаваемые вопросы
Нужна ли двухфакторная аутентификация для SSH, если я уже использую ключи?
Добавить её очень стоит. Ключ это файл, который можно скопировать без малейших следов, а второй фактор означает, что одного украденного файла для доступа недостаточно. Ключи без второго фактора всё равно намного лучше паролей.
Чем отличаются FIDO2 и TOTP для SSH?
Ключ FIDO2 хранит закрытый ключ на аппаратном устройстве и требует физического касания при каждом входе, что делает его устойчивым к фишингу. TOTP использует вводимый код, он слабее, потому что его можно ввести в поддельный запрос, но работает везде и не требует оборудования.
Какая версия OpenSSH поддерживает аппаратные ключи безопасности?
В OpenSSH 8.2 появилась поддержка аппаратных аутентификаторов FIDO/U2F с типами ключей ecdsa-sk и ed25519-sk. Встроенному промежуточному слою нужен libfido2, а клиент и сервер должны поддерживать эти типы ключей.
Как не потерять доступ при включении 2FA?
Держите открытой существующую сессию, проверяйте конфигурацию через sshd -t, проверяйте новое подключение из отдельного терминала, прежде чем что-либо закрывать, и убедитесь, что у вас есть консоль провайдера или режим восстановления, а также аварийные коды или запасной ключ.
Что делает AuthenticationMethods publickey,keyboard-interactive?
Требует от пользователя сначала пройти аутентификацию по открытому ключу, а затем keyboard-interactive, что при использовании PAM означает запрос кода TOTP. Каждый указанный метод должен быть также включён в конфигурации.
Есть ли смысл в TOTP для SSH, если у меня есть fail2ban?
Да. fail2ban замедляет подбор, но ничего не делает против украденного ключа или перехваченных учётных данных. Второй фактор защищает именно от этого, так что они закрывают разные риски.
Не уверены, в каком состоянии ваш сервер?
Получите бесплатную проверку безопасности в режиме только чтения или поговорите с инженером по безопасности об управляемой защите.
Получить бесплатную проверку сервера Связаться с инженером по безопасности