Авторизация по флешке в Linux

После прочтения поста Вход в систему по подключению определенной флешки стало интересно, а можно ли так сделать в Linux?

Оказывается, можно, и очень легко! Для этого надо:
1. Установить модуль для аутентификации по usb
2. Настроить модуль для аутентификации по usb
3. Настроить механизм аутентификации на использование необходимого нам модуля
Вся процедура настройки — от силы 15 минут.

Кратко о механизме аутентификации

Для начала нам следует знать, что за все, что относится к аутентификации отвечает PAM (pluggable authentication modules) — механизм, отслеживающий, способен ли пользователь получить доступ в существующих условиях.
Например, способен ли он получить права root через sudo по отпечатку пальца, если истек срок действия его пароля.

Для каждого типа аутентификации существует свой модуль. Вот некоторые из них:

pam_fprint отпечаток пальца
pam_blue устройство bluetooth
pam-face-authentication лицо
pam_usb usb накопитель

Как уже, вероятно, очевидно, для аутентификации по флешке нам необходим модуль pam_usb.
Возможно, он уже есть в репозитории вашего дистрибутива; если нет, скачать его можно на странице проекта pam_usb. Там же можно найти информацию на английском по использованию модуля.

Настройка pam_usb

Все настройки данного модуля, как то список usb накопителей, список ассоциированных с ними пользователей хранятся в файле /etc/pamusb.conf. Однако для более простого редактирования данного файла, вместе с модулем поставляется утилита pamusb-conf. Для редактирования файла pamusb.conf необходимы права root.

1. Добавление usb накопителя

Для добавления накопителя необходимо выполнить команду
# pamusb-conf --add-device name_of_device

name_of_device — любой удобный для вас идентификатор.
Здесь вам будет предложено выбрать устройство из списка присутствующих в вашей системе. Поскольку у меня была одна всего флешка, выбирать мне не пришлось 🙂

2. Добавление пользователя

# pamusb-conf --add-user username

Я, например, добавил пользователя root

Which device would you like to use for authentication?
* Using «rootflash» (only option)

User: root
Device: rootflash

Save to /etc/pamusb.conf?
[Y/n] y
Done.

3. Проверка настройки

# pamusb-check root

* Authentication request for user «root» (pamusb-check)
* Device «rootflash» is connected (good).
* Performing one time pad verification…
* Regenerating new pads…
* Access granted.

Всё отлично, можно переходить к следующему этапу.

Настройка pam

После настройки pam_usb, нам необходимо сделать так, чтоб аутентификация происходила с использованием этого модуля. Делается это редактирования конфигурационных файлов pam. Находятся они в /etc/pam.d/. Если такой путь отсутсвует, наобходимо искать файл /etc/pam.conf, однако вариант с выделенной директорией гораздо проще для понимания. В случае существования /etc/pam.d/ настройки в /etc/pam.conf игнорируются.

Содрежимое /etc/pam.d/

Здесь содержится набор конфигурационных файлов, по одному на каждую программу, для которой вы хотите задать правила аутентификации. Можно, например, задать правила для xscreensaver, su, sudo, kscreensaver, gnome-screensaver… Тогда конфигурационные файлы должны иметь имена вида xkscreensaver, su, sudo, kscreensaver (без расширения).

Редактирование правил аутентификации

Для примера отредактируем правила для su.
Изначально, правила на моей системе имели следующий вид

#%PAM-1.0
auth sufficient pam_rootok.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so

Каждое правило авторизации начинается ключевым словом auth.
За ним следует либо sufficient, либо required. Использование одного из них определяет, является ли правило достаточным (sufficient) или же необходимым (required).
Затем следует имя модуля, используемого для аутентификации.
Например, в данном случае выполняется ряд проверок по порядку
1. если пользователь вызывающий su — уже root, то этого достаточно. Ничего больше спрашивать эта программа при выполнении не будет.
2. если же предыдущее правило не сработало, выполняется стандартная аутентификация с паролем.

В случае, если мы заменим в первом правиле sufficient на required, вызывать su не сможет ни один рядовой пользователь, т.к. для вызова будут необходимы права root.

Таким образом, для опциональной аутентификации по флешке (если присутствует — дать права, если отсутствует — спросить пароль), нам надо в файл /etc/pam.d/su вписать следующее:

#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_usb.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so

После сказанного, думаю, анализ столь простого набора правил не составит труда.

Маленькие приятности

1. В качестве очень интересного варианта использования можно предложить аутентификацию по флешке с домашним разделом на ней же.
2. На появления флешки в системе можно реагировать выполнением скрипта. Также можно отреагировать и на исчезновение флешки. (см. man pamusb-agent)

Всем удачного флешко-логина 😉

UPD: Перенес в «Linux для всех». Спасибо.

автор:  Костюченко Дмитрий http://edio.habrahabr.ru/