· 15 мин чтения

YubiKey для SSH: как сделать доступ на серверы невзламываемым

Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш. С 2019 года весь админский доступ в нашей компании привязан к YubiKey — 12 человек, 140+ серверов, ни одного инцидента с компрометацией ключей. Когда я беседую с новыми клиентами и вижу у их админов ~/.ssh/id_rsa без пароля, скопированный на десяток машин — сразу предлагаю переход на аппаратные ключи. Потерять ноутбук больно, но не смертельно. Украсть ключ, который физически лежит в кармане и требует касания для каждой подписи — нельзя. В этой статье расскажу, как настроить YubiKey для SSH двумя основными способами.

Почему SSH-ключи на диске — плохо

Классическая схема — ssh-keygen -t ed25519, публичный в authorized_keys на сервере, приватный в ~/.ssh/id_ed25519 на ноутбуке. Проблем с этим сценарием несколько:

YubiKey решает все четыре проблемы: приватный ключ никогда не покидает чип, для каждой подписи требуется физическое касание (или отпечаток на Bio-версиях), а при PIN-подтверждении получается полноценная двухфакторка.

Какой YubiKey брать

МодельFIDO2PIVФорм-факторЦена, руб.
YubiKey 5 NFCДаДаUSB-A + NFC5500–6500
YubiKey 5C NFCДаДаUSB-C + NFC6000–7000
YubiKey 5CiДаДаUSB-C + Lightning7500–8500
YubiKey BioДаНетUSB-A/C, отпечаток7000–8500
YubiKey 5 FIPSДаДаUSB-A/C13000+

Я рекомендую сразу брать пару YubiKey 5C NFC: основной в ключницу, резервный в сейф. Стоимость пары — около 14 000 руб., это дешевле одного часа простоя при компрометации админского SSH-ключа.

Способ 1: FIDO2 / ed25519-sk — самый простой

Начиная с OpenSSH 8.2 (2020 год) поддерживаются резидентные и нерезидентные ключи, где приватная часть хранится на FIDO2-устройстве. Проверяем версию:

ssh -V
# OpenSSH_8.9p1 Ubuntu-3ubuntu0.4, OpenSSL 3.0.2

Генерируем ключ, привязанный к YubiKey:

# Вставляем YubiKey, затем
ssh-keygen -t ed25519-sk -O resident -O verify-required \
  -C "admin@itfresh-yubikey-main"

# YubiKey замигает - касаемся кнопки
# Вводим PIN устройства (если уже настроен)

Флаги: -O resident хранит handle ключа в памяти YubiKey (можно восстановить на другом компьютере), -O verify-required делает обязательным PIN-ввод при каждом использовании.

Получаем два файла: ~/.ssh/id_ed25519_sk и id_ed25519_sk.pub. Первый — это «handle», без YubiKey бесполезен. Второй — публичный, его кладём на сервера.

# Копируем публичный на сервер
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub admin@server.example.ru

# Пробуем подключиться
ssh admin@server.example.ru
# YubiKey мигает, касаемся, PIN - вход

Способ 2: PIV с Yubico-Piv-Tool

PIV (Personal Identity Verification) — стандарт смарт-карт, поддерживаемый YubiKey 5. В нём у карты несколько слотов, и в слоте 9a хранится приватный ключ для аутентификации. Минус — сложнее в настройке, плюс — работает со старыми серверами, которые не поддерживают FIDO2.

# Устанавливаем инструменты
apt install yubico-piv-tool opensc-pkcs11

# Генерируем ключ RSA 2048 в слоте 9a
yubico-piv-tool -s 9a -a generate -o pubkey.pem

# Создаём самоподписанный сертификат и записываем
yubico-piv-tool -a verify-pin -a selfsign -s 9a \
  -S "/CN=admin-itfresh/" -i pubkey.pem -o cert.pem
yubico-piv-tool -a import-certificate -s 9a -i cert.pem

# Извлекаем публичный SSH-ключ
ssh-keygen -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so -e

В ~/.ssh/config настраиваем PKCS11:

Host production
  HostName 10.0.0.10
  User admin
  PKCS11Provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
  IdentitiesOnly yes

Способ 3: GPG-агент + SSH

Если вы уже используете GPG для подписи коммитов — можно сделать ключ аутентификации в OpenPGP-слоте YubiKey и проксировать через gpg-agent. Это редкий сценарий, но иногда полезен, если нужна одна смарт-карта на всё.

# Настройка gpg-agent для SSH
echo 'enable-ssh-support' >> ~/.gnupg/gpg-agent.conf
echo 'export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)' >> ~/.bashrc

gpg --card-edit
# admin, key-attr, generate ключа в слоте A (Authentication)
# keytocard

gpgconf --reload gpg-agent
ssh-add -L  # Публичный ключ в SSH-формате

Настройка сервера под YubiKey

На стороне сервера ничего экстраординарного. OpenSSH 8.2+ достаточно. В /etc/ssh/sshd_config:

PubkeyAuthentication yes
PasswordAuthentication no          # Полностью отключаем пароли
ChallengeResponseAuthentication no
UsePAM yes
AuthenticationMethods publickey
PubkeyAcceptedAlgorithms +ssh-ed25519,sk-ssh-ed25519@openssh.com

# Дополнительно - только с доверенной подсети
AllowUsers admin@10.0.0.* admin@192.168.88.*

Для старых серверов, где версия OpenSSH 7.x, FIDO2 не работает — используйте PIV или обновите SSH. Backport для Ubuntu 18.04 был последним из нормальных, дальше проще обновить ОС.

Реальный кейс: миграция команды из 8 админов

В октябре 2025 клиент — IT-отдел банковской структуры на 8 админов, 230 серверов Linux и 40 Windows — попросил полностью отказаться от паролей и password-less SSH-ключей. За 10 дней мы реализовали следующую схему: каждый админ получил два YubiKey 5C NFC (основной и резервный), прописали FIDO2 ключи на всех Linux, PIV — на трёх старых серверах с OpenSSH 7.x, настроили CA-подписанные сертификаты SSH для массовых ротаций. Бюджет железа — 128 000 руб., работ — 85 000 руб. За 4 месяца после внедрения ноль инцидентов с попытками входа, пропала необходимость в ежеквартальной ротации паролей, админы перестали терять время на ввод. У нас на практике YubiKey окупается через 3–4 месяца за счёт экономии времени и снятия риска утечки.

Резервирование и восстановление

Главный принцип: всегда два YubiKey, публичные ключи обоих прописаны на всех серверах. Резервный — в сейфе компании. При потере основного:

  1. Берём резервный и запускаем на нём генерацию нового ключа (с разными именами — не удаляем друг друга).
  2. Удаляем публичный ключ утерянного YubiKey со всех серверов (скрипт + Ansible).
  3. Заказываем новый YubiKey, генерируем на нём ключ.
  4. Прописываем публичный ключ нового на сервера через резервный.
  5. Новый становится основным, резервный возвращается в сейф.

Для управления authorized_keys на сотне серверов удобно использовать Ansible с шаблоном:

- name: SSH ключи админов
  authorized_key:
    user: admin
    state: present
    key: "{{ item }}"
  loop: "{{ admin_ssh_keys }}"
  # admin_ssh_keys = список всех публичных ключей команды

Типичные ошибки

Внедрим YubiKey в вашу админскую команду

Я лично провожу миграцию SSH-доступа на аппаратные ключи в командах от 3 до 30 админов. Закупка YubiKey, настройка FIDO2/PIV, миграция authorized_keys через Ansible, обучение команды, регламент резервирования. Для банков и финансовых организаций — отдельно опциональный FIPS-вариант. От 4 рабочих дней, цена под количество админов и серверов.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы по YubiKey + SSH

Какой YubiKey нужен для SSH?
YubiKey 5 серии — минимум. Это YubiKey 5 NFC, 5C NFC, 5Ci или 5 FIPS. Все они поддерживают FIDO2/WebAuthn, PIV и OpenPGP — три способа привязать к SSH. YubiKey Bio добавляет биометрию.
Что лучше: FIDO2 или PIV для SSH?
FIDO2 (ed25519-sk) проще в настройке и не требует PIN-кода по умолчанию, но требует OpenSSH 8.2+. PIV сложнее, но даёт RSA/ECC-ключи на слоте карты и работает со старыми серверами. Я выбираю FIDO2 везде, где это возможно.
Что делать, если YubiKey потерян?
Всегда держим резервный YubiKey — физическую копию. Прописываем на серверах оба публичных ключа. При потере — удаляем публичный ключ основного с серверов, пользуемся резервом, заказываем новый и прописываем его заново.
Работает ли YubiKey на Windows Server?
Да. OpenSSH for Windows с версии Windows 10 1809 поддерживает FIDO2 ключи в PowerShell. На Windows Server 2019/2022 устанавливаем OpenSSH-Client и OpenSSH-Server, прописываем публичный ключ — работает.
Нужен ли PIN для YubiKey при SSH?
По умолчанию — нет, достаточно касания кнопки. Можно включить обязательный PIN флагом -O verify-required при генерации ключа, тогда каждое подключение потребует PIN + касание — это полноценный MFA.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.