YubiKey для SSH: как сделать доступ на серверы невзламываемым
Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш. С 2019 года весь админский доступ в нашей компании привязан к YubiKey — 12 человек, 140+ серверов, ни одного инцидента с компрометацией ключей. Когда я беседую с новыми клиентами и вижу у их админов ~/.ssh/id_rsa без пароля, скопированный на десяток машин — сразу предлагаю переход на аппаратные ключи. Потерять ноутбук больно, но не смертельно. Украсть ключ, который физически лежит в кармане и требует касания для каждой подписи — нельзя. В этой статье расскажу, как настроить YubiKey для SSH двумя основными способами.
Почему SSH-ключи на диске — плохо
Классическая схема — ssh-keygen -t ed25519, публичный в authorized_keys на сервере, приватный в ~/.ssh/id_ed25519 на ноутбуке. Проблем с этим сценарием несколько:
- Ключ — обычный файл. Любая вредоносная программа с правами пользователя может его прочитать и скопировать на сервер атакующего.
- Пароль на ключе не спасает. Атакующий утаскивает файл, потом брутит оффлайн без ограничения попыток.
- Нет подтверждения действия. Вы ушли пообедать, не заблокировав экран — кто-то за вашим компьютером зашёл на production и всё удалил.
- Сложно отозвать. Нет централизованного механизма, надо лезть на каждый сервер и править authorized_keys.
YubiKey решает все четыре проблемы: приватный ключ никогда не покидает чип, для каждой подписи требуется физическое касание (или отпечаток на Bio-версиях), а при PIN-подтверждении получается полноценная двухфакторка.
Какой YubiKey брать
| Модель | FIDO2 | PIV | Форм-фактор | Цена, руб. |
|---|---|---|---|---|
| YubiKey 5 NFC | Да | Да | USB-A + NFC | 5500–6500 |
| YubiKey 5C NFC | Да | Да | USB-C + NFC | 6000–7000 |
| YubiKey 5Ci | Да | Да | USB-C + Lightning | 7500–8500 |
| YubiKey Bio | Да | Нет | USB-A/C, отпечаток | 7000–8500 |
| YubiKey 5 FIPS | Да | Да | USB-A/C | 13000+ |
Я рекомендую сразу брать пару 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, публичные ключи обоих прописаны на всех серверах. Резервный — в сейфе компании. При потере основного:
- Берём резервный и запускаем на нём генерацию нового ключа (с разными именами — не удаляем друг друга).
- Удаляем публичный ключ утерянного YubiKey со всех серверов (скрипт + Ansible).
- Заказываем новый YubiKey, генерируем на нём ключ.
- Прописываем публичный ключ нового на сервера через резервный.
- Новый становится основным, резервный возвращается в сейф.
Для управления authorized_keys на сотне серверов удобно использовать Ansible с шаблоном:
- name: SSH ключи админов
authorized_key:
user: admin
state: present
key: "{{ item }}"
loop: "{{ admin_ssh_keys }}"
# admin_ssh_keys = список всех публичных ключей команды
Типичные ошибки
- Только один YubiKey без резерва. При потере — полный локаут. Всегда два, всегда в разных местах.
- PIN не установлен. Без PIN касание кнопки — единственный фактор. Ноутбук украли с воткнутым ключом — атакующий подключается по SSH, имитируя касание случайным нажатием.
- Забыли -O resident. Handle-файл потерян при переустановке ОС → ключ на YubiKey остаётся, но использовать нельзя. Флаг resident позволяет восстановить через
ssh-keygen -K. - Старый OpenSSH на сервере. FIDO2-ключи не работают на OpenSSH < 8.2. Обновляемся до актуального.
- Оставили PasswordAuthentication=yes. Смысл YubiKey пропадает — можно зайти обычным паролем.
- Держим id_rsa рядом с YubiKey. Если оставили старые ключи в ~/.ssh — атакующий может использовать их. Удалите всё, кроме YubiKey-ключей.
Внедрим 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.