36 Jan. 3, 2025, 5:43 p.m.

Авторизация пользователя по аппаратному ключу (Debian 12)

Задача: настроить альтернативную авторизацию по ключу Yubico Security Series по протоколу U2F (DEBIAN + GNOME).

ПЕРЕД НАЧАЛОМ РЕКОМЕНДУЕТСЯ ПОТРЕНИРОВАТЬСЯ НА ВИРТУАЛЬНОЙ МАШИНЕ

Предупреждение перед началом

Некоторые приложения не умеют работать с ключами, поэтому система может запращивать пароль при первом входе в систему (после включения ПК), например:

GNOME Keyring — это система хранения паролей и ключей шифрования, которая входит в состав рабочего окружения GNOME. Она упрощает управление конфиденциальными данными (логины, пароли к сайтам и приложениям, SSH-ключи и пр.), сохраняя их в зашифрованном виде. Когда вы входите в систему под GNOME, по умолчанию ваш паролЬ на вход (или пароль к пользовательской учётной записи) автоматически используется для разблокировки «ключницы» GNOME Keyring. Таким образом, приложения могут безопасно получать сохранённые пароли или ключи шифрования из централизованного хранилища, не запрашивая у вас пароль каждый раз.

В случае с GNOME Keyring можно установить пустой пароль введя:

sudo apt install seahorse
seahorse

В этом случае пароли будут в нешифрованном виде постоянно.


Настройка ключа

Установка зависимостей:

sudo apt update
sudo apt install libpam-u2f pamu2fcfg

где libpam-u2f модуль PAM для аутентификации с помощью U2F/FIDO2, pamu2fcfg утилита для регистрации ключей и генерации конфигурации.

Создание папки для хранения ключей:

mkdir -p ~/.config/Yubico

Генерация конфига:

pamu2fcfg > ~/.config/Yubico/u2f_keys

В получившемся файле cat ~/.config/Yubico/u2f_keys должна быть запись вида:

<USER>:<KEY>

Редактирование файла pam:

sudo nano /etc/pam.d/gdm-password

Чтобы ключ работал как 2FA тогда строку auth sufficient pam_u2f.so cue нужно поставить ПОСЛЕ @include common-auth. Если нужно чтобы работал ЛИБО пароль ЛЮБО ключ тогда ДО @include common-auth.

Обратите внимание что параметр sufficient - мягкое требование если ключа нет то и требоваться он не будет. Чтобы сделать жесткое требование тогда нужно указывать required.