"Аутентификация по ключу" -- это способ аутентификации на
сервисе с использованием пары ключей. Подобная функциональность --
штатная в некоторых сервисах (например, в ssh), однако отсутствует в
подавляющем большинстве программ. Способ аутентификации по ключу
удобен тем, что не надо держать в голове множество (да даже если и
один) длинных паролей, а также и тем, что при удаленной регистрации
никаких данных, способных скомпрометировать тот или иной сервис, по
сети не передается.
В данной статье рассмотрен способ беcпарольной аутентификации по
ключу, находящемуся на USB flash-накопителе. Сам механизм
аутентификации по ключу обеспечивает PAM-модуль pam_usb.
Аутентификация через pam_usb может работать на любом сервисе,
скомпилированном с поддержкой PAM, например: login, xdm/kdm/gdm, su,
sshd.
Загрузить исходные коды последней версии pam_usb можно с его
домашней страницы http://www.pamusb.org/ (на момент написания статьи последней
была версия 0.3.2). Компиляция и установка данного модуля тривиальны:
$ tar -zxvf pam_usb-0.3.2.tar.gz
$ cd pam_usb-0.3.2
$ make
$ su -
# make install
Для основанных на RPM дистрибутивов лучше всего найти готовый
RPM-пакет с этим модулем и устанавливать штатным rpm. Например, для
дистрибутива SuSE 9.1, на котором производилась установка и настройка
pam_usb при написании статьи, соответствующий RPM-пакет можно
загрузить с сайта http://www.linux-administrator.com/
Если процесс установки не выявил ошибок, то в директории
/lib/security/ появится модуль pam_usb.so, имя которого необходимо
будет в дальнейшем указывать в конфигурационных файлах PAM-модулей
сервисов.
Список приложений, использующих PAM, находится в /etc/pam.d (хотя,
в некоторых дистрибутивах настройка PAM-модулей находится в
/etc/pam.conf). Аутентификацию через pam_usb можно сконфигурировать в
трех режимах, описанных ниже для сервиса xdm, взятого в качестве
примера (файл конфигурации PAM-модуля данного сервиса --
/etc/pam.d/xdm):
1. для того, чтобы была возможность логиниться как с
присоединенным накопителем, так и без него, необходимо перед строкой
auth required pam_unix2.so добавить:
3. для того, чтобы была возможность логиниться с помощью пароля и
одновременно с присоединенным накопителем, необходимо к строке auth
required pam_unix2.so добавить:
Примечание: в некоторых дистрибутивах, например в Debian, вместо
модуля pam_unix2.so присутствует pam_unix.so.
Примечание 2: значения параметров "force_device" и "fs"
выбраны для примера и поэтому могут отличаться в каждой конкретной
системе. Если их вообще не указывать, то аутентификация сработает,
однако будут опробованы по очереди устройства /dev/sda* и /dev/sdb*, а
также ФС ext2 и vfat, что, естественно, займет немного больше времени.
Механизм беспарольной аутентификации по ключу довольно-таки прост.
Сначала генерируется пара DSA-ключей: приватный и публичный. Приватный
помещается на USB-flash, а публичный -- в домашнюю директорию
пользователя. При попытке зарегистрироваться на каком-нибудь сервисе
под учетной записью пользователя считываются приватный ключ с носителя
и публичный из домашней директории этого пользователя. При помощи
публичного ключа генерируется случайная последовательность символов,
которая может быть расшифрована лишь приватным ключом, парным данному
публичному. Соответственно, если расшифровка удалась, то приватный
ключ считается валидным и процесс аутентификации завершается успешно.
В противном случае -- "от ворот поворот".
Генерируется пара аутентификационных DSA-ключей с помощью утилиты
usbadm, которая идет в составе пакета pam_usb. Синтаксис ее следующий:
usbadm <action> [arguments]
где <action> [arguments] -- это одно из доступных действий и его
аргументы:
help [comand] -- вывод справки. Если задано значение действия
[comand], то выводится справка по этому действию, иначе -- общая
справка.
keygen <mntpoint> <user> <bits> -- генерация пары DSA ключей.
Необходимые параметры: точка монтирования устройства, имя
пользователя, для которого генерируется пара ключей, длина ключа в
битах.
cipher <mntpoint> <user> [algorithm] -- управление шифрованием
ключей. Позволяет шифровать/расшифровывать/изменять пароль для
приватного ключа указанным алгоритмом для указанного пользователя.
addserial [serial number] -- установка серийного номера
устройства. Если в качестве [serial number] ничего не указано, то
будет произведена попытка считывания серийного номера присоединенного
устройства.
Для того, чтобы сгенерировать пару DSA-ключей длиной 2048 бит для
пользователя fly4life, необходимо смонтировать USB flash-накопитель (в
данном примере это /dev/sda) и воспользоваться утилитой usbadm с
ключом keygen:
Таким образом на flash-накопителе создастся директория .auth/, в
которой будет сгенерирован приватный ключ, а в одноименном подкаталоге
домашней директории пользователя (~/.auth/) -- публичный. После
размонтирования устройства USB flash-накопитель готов для
использования его в процессах аутентификации.
В заключение отмечу, что в качестве носителя информации для
хранения приватных ключей можно использовать floppy-дискеты и
CD-диски. Все, что необходимо добавить в настройках PAM-модулей, --
это опции !check_device, !check_if_mounted, и заменить значение
параметра force_device на /dev/fd0 и /dev/cdrom соответственно.
Например: