Хочете зробити SSH підключення до вашого сервера Linux по-справжньому надійним? Давайте додамо двофакторну аутентифікацію (2FA) з YubiKey. Я покажу, як поєднати апаратний ключ FIDO2/U2F для SSH та одноразові паролі Yubico OTP через PAM. Буде просто, зрозуміло і без небезпечних пасток. Поїхали! 🙂
Що підготуйте заздалегідь
- YubiKey (серії 5 або Neo) з підтримкою FIDO2/U2F та OTP.
- Доступ з правами sudo на сервер Linux.
- Клієнт OpenSSH 8.2+ на вашому комп’ютері (для FIDO2-ключів).
- Відкритий термінал Linux з існуючим робочим SSH-доступом (не закривайте стару сесію, поки не перевірите нову конфігурацію).
В статті я буду посилатися на налаштування SSH на сервері Linux, користуватися термінал Linux та уважно згадувати про права доступу Linux, щоби ви нічого не зламали випадково.
Варіант A (рекомендовано): FIDO2/U2F як апаратний SSH-ключ + OTP як другий фактор
Ідея проста: для входу вимагаємо 1) апаратний SSH-ключ на базі FIDO2/U2F і 2) одноразовий пароль Yubico OTP через PAM.
Крок 1. Згенеруйте FIDO2 SSH-ключ на клієнті
Виконайте на вашій робочій машині з підключеним YubiKey:
# Перевірте версію OpenSSH (має бути 8.2+)
ssh -V
# Згенеруйте ключ (попросять доторкнутися до YubiKey)
ssh-keygen -t ed25519-sk -C "you@server"
# Завантажте публічний ключ на сервер
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server.example.com
Тепер можете протестувати звичайний вхід ключем:
ssh -i ~/.ssh/id_ed25519_sk user@server.example.com
Крок 2. Увімкніть двофакторність на сервері через PAM
Налаштуємо SSH так, щоб для входу були потрібні два фактори: publickey (наш FIDO2-ключ) і keyboard-interactive (PAM).
# Резервна копія конфіга SSH
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
# Відкрийте файл у редакторі (nano/vi) і переконайтеся, що є такі рядки:
# UsePAM yes
# KbdInteractiveAuthentication yes
# AuthenticationMethods publickey,keyboard-interactive
sudo nano /etc/ssh/sshd_config
# Перезапустіть SSHD (назва сервісу може бути ssh або sshd)
sudo systemctl reload sshd 2>/dev/null || sudo systemctl reload ssh
Порада: тримайте відкритою стару сесію SSH, а нову тестову — відкрийте у новому вікні. Якщо щось піде не так, ви зможете повернути зміни.
Крок 3. Додаємо Yubico OTP через PAM
Цей спосіб працює для віддаленого SSH, бо ви вводите одноразовий пароль (OTP), згенерований YubiKey, а сервер перевіряє його через валідаційні сервери Yubico (потрібен вихід в інтернет на порт 443). Якщо у вас суворий firewall Linux — дозвольте вихід назовні на api.yubico.com.
- Отримайте Client ID і Secret Key тут: https://upgrade.yubico.com/getapikey/. Знадобиться будь-який OTP від вашого ключа (натисніть кнопку — він надрукується курсором).
- Встановіть PAM-модуль:
# Debian/Ubuntu
sudo apt update && sudo apt install -y libpam-yubico
# RHEL/CentOS/Fedora
sudo dnf install -y pam_yubico
- Створіть мапінг користувач → YubiKey. Публічний ID — це перші 12 символів з будь-якого OTP вашого ключа.
# Натисніть кнопку YubiKey у фокусі термінала — отримаєте довгий OTP.
# Витягніть перші 12 символів і додайте у файл мапінгу:
echo "youruser:ccccccbfhjdk" | sudo tee -a /etc/yubikey_mappings
- Додайте правило в PAM для SSH:
# Вставте РЯДОК НИЖЧЕ на початок /etc/pam.d/sshd
# (до інших рядків 'auth', щоб воно спрацювало першим)
sudo nano /etc/pam.d/sshd
# Додайте:
# auth required pam_yubico.so id=YOUR_CLIENT_ID key=YOUR_SECRET_KEY authfile=/etc/yubikey_mappings
# Збережіть файл і перевірте синтаксис, потім перезавантажте SSHD
sudo systemctl reload sshd 2>/dev/null || sudo systemctl reload ssh
Тепер під час входу з апаратним SSH-ключем (перший фактор) система додатково запитає OTP (другий фактор). Саме так реалізується повноцінна 2FA для SSH підключення.
Альтернативні способи
- Тільки OTP (без FIDO2-ключа): залишаєте стандартний SSH-ключ ed25519 як перший фактор і додаєте Yubico OTP через PAM. Простіше, але без апаратного підпису для SSH.
- FIDO2/U2F як єдиний фактор: дуже сильний варіант (апаратний підпис кожного логіну), але формально це не 2FA. Можна поєднати з паролем, якщо не хочете OTP.
- Самостійна валідація OTP: замість Yubico Cloud підніміть власний Validation Server (для середовищ без інтернету). Це складніше, але автономно.
- Challenge-Response офлайн: зручно для локальної консолі або sudo, але не підходить для віддаленого SSH, бо ключ має бути фізично на сервері.
GUI-спосіб з YubiKey Manager
Якщо вам зручно через графіку, встановіть YubiKey Manager (ykman GUI) на ваш робочий ПК. Там ви можете:
- Перевірити, що FIDO2 ввімкнено, задати або змінити PIN для FIDO2.
- Подивитися серійний номер ключа та статус слотів OTP.
- Перегенерувати конфігурацію OTP-слота (якщо потрібно) — для роботи з PAM зазвичай нічого міняти не треба.
Після цього всі серверні кроки (PAM і sshd) однаково актуальні. GUI допомагає лише керувати самим токеном.
FAQ
Чи працює це без інтернету?
Якщо ви використовуєте Yubico OTP через хмарні валідаційні сервери — ні, потрібен вихід на 443/tcp з сервера. Без інтернету використовуйте або self-hosted validation, або замініть другий фактор на пароль чи TOTP.
У мене OpenSSH нижче 8.2. Що робити?
Оновіть OpenSSH на клієнті. FIDO2 SSH-ключі потребують 8.2+. На сервері спеціальної підтримки не треба — він бачить звичайний публічний ключ.
Після налаштування не бачу запиту OTP
Перевірте, що в sshd_config є AuthenticationMethods publickey,keyboard-interactive і UsePAM yes. Далі перевірте, що рядок із pam_yubico є на початку /etc/pam.d/sshd. Логи: journalctl -u sshd або /var/log/auth.log.
Як додати кілька YubiKey для одного користувача?
У файлі /etc/yubikey_mappings після імені користувача можна вказати кілька публічних ID, розділених двокрапкою, наприклад: user1:ccccccbfhjdk:vvvvvvtnrjgt.
Чи можна випадково заблокувати себе?
Так, тому тестуйте в паралельній сесії. Тримайте резервного адміністративного користувача без 2FA до завершення перевірок або дозвольте доступ по консолі. Також корисно додати другий запасний YubiKey.
Помилка "Too many authentication failures"
На клієнті спробуйте: ssh -o IdentitiesOnly=yes user@server. Це змусить SSH не перебирати всі ключі з агента.
Firewall блокує перевірку OTP
Дозвольте вихідні з’єднання з сервера на порт 443/tcp до пулу api.yubico.com (або вашого self-hosted validation).
Порада від Kernelka
Зареєструйте одразу два YubiKey: основний і резервний. Збережіть Client ID/Secret Key у менеджері паролів, а зміни в SSH завжди перевіряйте в окремій сесії. Це маленькі кроки, які рятують нерви 🧩
Підсумок
- Згенерували апаратний FIDO2/U2F SSH-ключ на клієнті й додали його на сервер.
- Увімкнули двофакторність через AuthenticationMethods у sshd_config.
- Під’єднали Yubico OTP у PAM і створили мапінг користувачів.
- Перевірили логи, відкрили firewall і протестували в новій сесії.
- Підготували резервний ключ і план відновлення доступу.
Все! Тепер ваше SSH підключення на сервер Linux значно надійніше, а ви спите спокійніше 🔐

Прокоментувати
На сайті відображається лише твоє ім'я та коментар. Електронна пошта зберігається виключно для зв'язку з тобою за потреби та в жодному разі не передається стороннім особам.