...
Для PAM существует проект pam_p11, развивающийся как часть OpenSC, позволяющий внедрить аутентификацию по токенам. Доступны два модуля аутентификацииВ старых версиях (ниже 0.2.0) модуль аутентификации разделен на два:
pam_p11_openssh
: позволяет аутентифицировать пользователя по открытым ключам ssh в~/.ssh/authorized_keys
pam_p11_opensc
: аутентификация по сертификатам из файла~/.eid/authorized_certificates
...
Создать файл
/usr/share/pam-configs/p11
со следующим содержанием:
- Для версий libpam-p11 ниже 0.2.0
Code Block |
---|
Name: Pam_p11
Default: yes
Priority: 800
Auth-Type: Primary
Auth: sufficient pam_p11_opensc.so /usr/lib/ |
...
librtpkcs11ecp.so |
- Для версий libpam-p11 выше или равных 0.2.0
Code Block |
---|
Name: Pam_p11 Default: yes Priority: 800 Auth-Type: Primary Auth: sufficient pam_p11.so /usr/lib/librtpkcs11ecp.so |
Tip |
---|
Если вы используете не Ubuntu 18.04, вам необходимо проверить местонахождение opensc-pkcs11.so. Он может находится, например, в /usr/lib/opensc-pkcs11.so. Если его найти не удается воспользуйтесь командой find |
Обновить конфигурацию PAM:
Code Block language bash sudo pam-auth-update
- В появившемся диалоге необходимо удостовериться, что выбран pam_p11. Если вы хотите отключить аутентификацию по паролям, то можно отключить Unix authentication.
Создание ключей на токене
Подготовим токен. Code Block language bash $ pkcs15-init -E $ pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk "" $ pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize
В параметрах pin и so-pin можно указать желаемые пин-коды пользователя и администратора.
Создаем ключевую пару RSA длины 2048 бит c ID "45" (id стоит запомнить, он понадобится при создании сертификата). Аутентификация на токене происходит под сущностью пользователя.
Code Block language bash $ pkcs11-tool pkcs15-init--module /usr/lib/librtpkcs11ecp.so --generatekeypairgen --key-type rsa/:2048 --auth-id 02 l --id 45 <вводим PIN пользователя>
Проверим сгенерированный ключ:
Code Block language bash $ pkcs15pkcs11-tool --list-keys Using reader with a card: Aktiv Rutoken ECP 00 00 Private RSA Key [Private Key] Object Flags : [0x3], private, modifiable Usage : [0x4], sign Access Flags : [0x1D], sensitive, alwaysSensitive, neverExtract, local ModLength : 2048 Key ref : 1 (0x1) Native : yes Path : 3f001000100060020001 Auth ID : 02 ID : 45module /usr/lib/librtpkcs11ecp.so -O
Создание сертификата и импорт его на токен
Запускаем
openssl
Code Block language bash $ sudo openssl
Подгружаем модуль поддержки pkcs11:
Code Block language bash OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/x86_64-linux-gnu/opensc-pkcs11librtpkcs11ecp.so (dynamic) Dynamic engine loading support [Success]: SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so [Success]: ID:pkcs11 [Success]: LIST_ADD:1 [Success]: LOAD [Success]: MODULE_PATH:/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so Loaded: (pkcs11) pkcs11 engine OpenSSL> ... OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"
Tip Если вы используете не Ubuntu 18.04, вам необходимо проверить местонахождение pkcs11.so. Он может располагаться, например, в /usr/lib/openssl/engines/ . Если его найти не удается воспользуйтесь командой find
Создаем самоподписанный сертификат в PEM-формате:
code
language bash OpenSSL> req -engine pkcs11 -new -key 0:45 -keyform engine -x509 -out cert.pem -text
Где 0:45 - это пара slot:id (который мы указывали в п.5). OpenSSL предложит ввести PIN-код и заполнить информацию о сертификате. Если у вас возникла ошибка, проверьте, не подключены ли другие USB-токены или считыватели смарт-карт к компьютеру.
Проверяем созданный сертификат. В текущем каталоге должен создаться файл самоподписанного сертификата с именем cert.pem.
Примечание: если при создании сертификата в OpenSSL убрать ключ-x509,
то на выходе получим заявку на сертификат.Code Block verify -CAfile cert.pem cert.pem certlanguage bash .
pem: OKВыйдем из OpenSSL.
Code Block exit
Сохраняем сертификат на токен:
Code Block language bash $ pkcs15pkcs11-inittool --store-certificate cert.pem --auth-id 02module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45 --format pem <Вводим PIN пользователя>
Занесение сертификата в список доверенных
Теперь нам необходимо прочитать с токена сертификат с нужным ID (в нашем случае - 45) и записать его в файл доверенных сертификатов:
Code Block language bash mkdir ~/.eid chmod 0755 ~/.eid pkcs15pkcs11-tool --module -r <certificate_id>--type cert --id 45 -l -p <PIN> > ~/.eid/authorized_certificates chmod 0644 ~/.eid/authorized_certificates
...