ИБ (Информационная Безопасность)
October 16

PAM_USB - 2FA-аутентификация в Linux по USB-ключу

Ввод пользовательского пароля - это стандартный способ аутентификации в Linux, который имеет свои недостатки. Чтобы улучшить защиту, можно сделать аутентификацию двухфакторной, например помимо ввода логина и пароля использовать USB-ключ. Таким образом, даже если кому-то удастся узнать логин и пароль, выполнить вход все равно не получится, пока не будет подключен специальный USB-носитель к компьютеру.

Реализовать такой метод аутентификации можно с помощью pam_usb. Это модуль, который обеспечивает аппаратную аутентификацию с использованием обычных съемных носителей. Монтировать в систему ничего не нужно, достаточно просто подключения к USB-порту.

Установка

Оригинальное руководство по установке здесь.
Рекомендуется устанавливать с помощью одного из пакетов, в зависимости от вашего дистрибутива. Для Fedora и Arch придется вручную настроить pam_usb, так как нет ничего похожего на debconfin в rpm, и пока нет автоконфигурации для Arch.

Пользователи Arch могут выбирать между двумя различными пакетами AUR - pam_usb (стабильная последняя версия) и pam_usb-git. Установим стабильную версию:
sudo pacman -S pkgconf gcc make patch pam dbus python python-dbus python-lxml python-gobject udisks2 base-devel pacman-contrib
yay -S pam_usb

Настройка

Нужно выполнить первоначальную настройку pam_usb.

Подключаем USB-носитель к компьютеру. Обратите внимание, что монтировать его необязательно, но если вы используете USBGuard, то устройству обязательно должен быть разрешен доступ. Абсолютно неважно, как отформатирован носитель и какие файлы на нем хранятся. Pam_usb не требует никаких вмешательств в содержимое носителя и вы сможете свободно его использовать для передачи и хранения файлов. Кроме того, вы можете добавить столько устройств, сколько хотите. После того, как носитель подключен, выполните команду в терминале:
pamusb-conf --add-device <Name>, - где <Name> замените на любое имя, которое вы хотите (но придерживайтесь использованию символов A-Z)

Далее настраиваем пользователей, чтобы определить, кому разрешена аутентификация с помощью pam_sub:
pamusb-conf --add-user <username>, - где <username> замените на свое имя пользователя

Проверьте конфигурацию:
pamusb_check <username>

Далее самое ответственное - настройка модуля PAM. Прежде, чем это сделать, прочитайте как работает конфигурация pam.d. Если вы внесете неправильные изменения, можете получить систему, в которой аутентификация вообще работать не будет.

См. manpages.ubuntu.com/cgi-bin/search.py?cx=003883529982892832976%3A5zl6o8w6f0s&cof=FORID%3A9&ie=UTF-8&titles=404&lr=lang_en&q=PAM.7 и manpages.ubuntu.com/manpages/impish/man5/pam.d.5.html

Чтобы добавить pam_usb в процесс аутентификации, нам нужно отредактировать /etc/pam.d/system-auth. Найдите строку auth [success=2 default=ignore] pam_unix.so try_first_pass nullok_secure и замените ее на

auth    sufficient                    pam_usb.so
auth    [success=2 default=ignore]    pam_unix.so nullok_secure

sufficient означает, что если возможна аутентификация с помощью pam_usb, то пароль запрашиваться не будет. Если вы хотите сделать аутентификацию двухфакторной, то вместо sufficient используйте required и тогда будет запрашиваться как пароль, так и USB-ключ. Для первого теста рекомендую использовать sufficient, чтобы убедиться, что все работает. Даже если что-то пойдет не так, вы всегда сможете ввести пароль для аутентификации и не потеряете доступ к системе. Позже вы сможете изменить это на required.

Тестируем

Проверим, какая будет реакция на запрос аутентификации:

Отключаем USB-носитель и проверяем еще раз:

Как видно на скриншоте, теперь у нас запрашивается пароль.

Предлагаю изменить sufficient на required:

И проверим еще раз:

Запрашивается и пароль, и USB-ключ.

Попробуем отключить носитель и проверить еще разок:

Даже если мы вводим правильный пароль, у нас все равно не получится выполнить аутентификацию без USB-ключа. Двухфакторная аутентификация готова. Сделайте тоже самое для пользователя root, чтобы защитить свою систему еще лучше.

Реакция на отключение USB-ключа

Мы можем установить дополнительную защиту. Сделаем так, чтобы если USB-ключ отключается от компьютера во время его работы, сразу происходила блокировка системы. Pam_usb позволяет автоматически выполнять команды при блокировке и разблокировке событий. Например, мы можем добавить в /etc/security/pam_usb.conf действия, которые будут выполнятся при отключении и подключении USB-ключа:

<user id="auser">
    <device>MyUSBKey</device>
    <agent event="lock">
      <cmd>xfce4-screensaver-command --lock</cmd>
      <env>DISPLAY=:0.0</env>
      <env>DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus</env>
    </agent>
    <agent event="unlock">
      <cmd>xfce4-screensaver-command --deactivate</cmd>
      <env>DISPLAY=:0.0</env>
      <env>DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus</env>
    </agent>
</user>

Так как я использую xsecurelock, для меня код будет следующим:

Теперь нам нужно выполнить проверку конфига через pamusb-check. Далее запускаем pamusb-agent:
sudo pamusb-agent

Pamusb-agent будет мгновенно выполнять действия, как только он обнаружит, что USB-ключ отключен. Добавим его в автозагрузку:
systemctl enable pamusb-agent.service --now


Мой Telegram

Мой GitHub

Поддержать автора донатом