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-contribyay -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