FIDO2-ключ (наприклад, YubiKey) додає апаратне підтвердження до локального входу, sudo і навіть розблокування LUKS. Нижче — мій дружній, але технічно акуратний гайд: налаштуємо PAM для GDM/LightDM, TTY та sudo, підв’яжемо LUKS через systemd-cryptenroll і обов’язково сплануємо безпечний відкат 🔐

Підготовка: пакети, ключ і безпечний план

Ми працюватимемо у термінал Linux. Перед змінами зробіть резервні копії PAM-файлів і тримайте відкриту другорядну консоль (Ctrl+Alt+F3) на випадок помилок. Не прибирайте парольні методи, доки все не перевірите.

Встановлення потрібних пакетів

# Ubuntu/Debian
sudo apt update
sudo apt install libpam-u2f libfido2-1 yubikey-manager

# Fedora
sudo dnf install pam_u2f libfido2 ykman

# Arch Linux
sudo pacman -Syu pam-u2f libfido2 yubikey-manager

Перевірте, що ваш ключ бачиться системою (після підключення):

ykman info

Генеруємо зв’язування для PAM (pam_u2f)

PAM-модуль pam_u2f шукає файл зі зв’язуваннями «користувач ↔ ключ». Можна зберегти його в домашній теці користувача або глобально для всіх. Тут покажу глобальний варіант (зручніший для адміністраторів і коли багато користувачів та групи Linux).

Створення глобального файлу мапінгу

# Створіть теку і файл мапінгу
sudo mkdir -p /etc/Yubico

# Додайте зв’язування для свого користувача (торкніться ключа, коли попросить)
pamu2fcfg -u "$USER" | sudo tee -a /etc/Yubico/u2f_keys

# (Необов’язково) Додайте другий ключ як резервний
pamu2fcfg -n -u "$USER" | sudo tee -a /etc/Yubico/u2f_keys

# Права доступу Linux для безпеки
sudo chown root:root /etc/Yubico/u2f_keys
sudo chmod 644 /etc/Yubico/u2f_keys

Альтернатива: зберегти локально у користувача (без sudo):

mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys
chmod 600 ~/.config/Yubico/u2f_keys

Налаштування PAM: sudo, GDM/LightDM і TTY

Завжди робіть резервну копію файлів у /etc/pam.d/ перед змінами. Поки тестуєте — використовуйте sufficient, щоб зберегти відкат до пароля.

sudo

# Резервна копія
sudo cp /etc/pam.d/sudo /etc/pam.d/sudo.bak

# Відкрийте файл
sudoedit /etc/pam.d/sudo

Додайте рядок на початок секції auth:

auth sufficient pam_u2f.so cue authfile=/etc/Yubico/u2f_keys

Тест:

sudo -K   # скид сесії аутентифікації sudo
sudo true # спробуйте — має попросити торкнутися ключа

Щоб вимагати і ключ, і пароль, замініть sufficient на required.

GDM (GNOME)

sudo cp /etc/pam.d/gdm-password /etc/pam.d/gdm-password.bak
sudoedit /etc/pam.d/gdm-password

Додайте ближче до верху:

auth sufficient pam_u2f.so cue authfile=/etc/Yubico/u2f_keys

LightDM

sudo cp /etc/pam.d/lightdm /etc/pam.d/lightdm.bak
sudoedit /etc/pam.d/lightdm

Додайте той самий рядок у секцію auth:

auth sufficient pam_u2f.so cue authfile=/etc/Yubico/u2f_keys

TTY/консоль (login)

sudo cp /etc/pam.d/login /etc/pam.d/login.bak
sudoedit /etc/pam.d/login

Додайте:

auth sufficient pam_u2f.so cue authfile=/etc/Yubico/u2f_keys

Після цього ви зможете входити, торкнувшись ключа; якщо ключа немає — спрацює пароль (поки стоїть sufficient).

FIDO2 для LUKS: розблокування диска

Сучасний спосіб — systemd-cryptenroll. Він додає FIDO2-токен у LUKS, а initramfs запитує торкання при старті.

1) Дізнайтеся свій LUKS-розділ

lsblk -f   # знайдіть розділ з "crypto_LUKS" і його UUID

2) Додайте FIDO2-токен

# Приклад: через шлях by-uuid з попереднього кроку
sudo systemd-cryptenroll --fido2-device=auto /dev/disk/by-uuid/UUID-ВАШОГО-РОЗДІЛУ

# (Необов’язково) Вимагати PIN FIDO2 для сильнішої перевірки
# sudo systemd-cryptenroll --fido2-device=auto --fido2-with-client-pin=yes /dev/disk/by-uuid/UUID

Важливо: не видаляйте наявний слот з паролем — це ваш відкат.

3) Оновіть crypttab і initramfs

В /etc/crypttab додайте опцію для автопошуку ключа (ім’я мапінгу у вас може бути іншим, наприклад cryptroot):

sudoedit /etc/crypttab
# Приклад рядка (не стирайте існуючі опції):
# cryptroot UUID=<UUID> none luks,discard,fido2-device=auto

Перебудуйте initramfs:

# Ubuntu/Debian
sudo update-initramfs -u

# Fedora
sudo dracut -f

# Arch Linux
sudo mkinitcpio -P

Перезавантажтеся і торкніться ключа, коли попросять. Якщо ключа немає — можна ввести старий LUKS-пароль (відкат працює).

Альтернативні способи

  • pam_fido2 (з libfido2): новіший модуль, але pam_u2f ширше задокументований. Принцип схожий.
  • Смарт-карта/PIV через pam_pkcs11: складніше, підходить для корпоративних смарт-карт.
  • Стара U2F-схема теж працює, але FIDO2 дає PIN та кращу інтеграцію з системою.

GUI-спосіб (частково)

Повністю через GUI це не зробити, але YubiKey Manager (ykman GUI) допоможе:

  1. Встановіть YubiKey Manager (пакет yubikey-manager або ykman + GUI варіант).
  2. Задайте/змініть PIN FIDO2, перевірте функції ключа.
  3. PAM-конфіг лишається ручним через файли — це нормально для Linux і дає контроль над правами доступу Linux.

FAQ

Чому система не бачить ключ?

Перепід’єднайте ключ, перезавантажте правила udev і тригери:

sudo udevadm control --reload-rules && sudo udevadm trigger

Перевірте ykman info. Спробуйте інший порт або кабель/перехідник.

Заблокували вхід після правок PAM — що робити?

Завантажтеся в режим відновлення з GRUB (Recovery/Rescue), відкрийте шелл root і відкотіть резервні копії з /etc/pam.d/*.bak. Тримайте окрему TTY-консоль активною, доки тестуєте. Це — святий грааль безпечного відкату.

Як зробити, щоб sudo вимагав і ключ, і пароль?

Змініть у /etc/pam.d/sudo з sufficient на required для pam_u2f.so. Тоді PAM завершиться успіхом лише після U2F + звичайної перевірки пароля.

Як додати другий (резервний) ключ?

Запустіть повторно:

pamu2fcfg -n -u "$USER" | sudo tee -a /etc/Yubico/u2f_keys

Для LUKS — повторіть systemd-cryptenroll --fido2-device=auto з другим ключем. Подивіться, що додалося:

sudo systemd-cryptenroll --list /dev/disk/by-uuid/UUID

GDM чи LightDM у мене?

Перевірте активний дисплей-менеджер:

systemctl status display-manager.service

LUKS не просить торкнутися ключа на старті

Переконайтеся, що в /etc/crypttab є fido2-device=auto, перебудуйте initramfs і що у вас systemd у initramfs. У крайньому разі введіть LUKS-пароль — це ваш план B.

Порада від Kernelka

Додавайте FIDO2 поетапно: спершу sudo, потім логін-екран (GDM/LightDM), і лише після успішного тесту — LUKS. Тримайте другий ключ, а в мапінгу — кілька записів. Це прості поради Linux, але вони рятують нерви і час 🚀

Підсумок

  • Встановили pam_u2f і libfido2, згенерували мапінг користувачів.
  • Додали FIDO2 до PAM для sudo, GDM/LightDM і TTY з безпечним відкатом через sufficient.
  • Налаштували розблокування LUKS через systemd-cryptenroll і оновили initramfs.
  • Залишили парольні слоти й резервні копії PAM для аварійного доступу.
  • Перевірили все покроково — спершу локально, потім на продуктивних машинах.

Якщо застрягли — не хвилюйтеся: методично відкотіть останній крок і перевірте журнали journalctl. Ви все зможете!