Содержание

Skip to end of metadata
Go to start of metadata

Стенд:



  • Сервер — Astra Linux Smolensk SE 1.6, Update 2, Bulletin 20190222SE16;
  • Клиент — Astra Linux Smolensk SE 1.6, Update 2, Bulletin 20190222SE16;
  • Рутокен ЭЦП;

Также применимо для Astra Linux: Орёл 2.12, Ленинград 8.1

Предполагается, что Astra Linux Directory (ALD) уже развернут, существует минимум один доменный пользователь, который может пройти  аутентификацию по паролю, время клиента и сервера совпадают (ntp).


Установка драйверов на сервер и клиент


Для обеспечения работы со смарт-картой Рутокен ЭЦП на клиенте и сервере установите следующие пакеты: libccid, pcscd, libpcsclite1, opensc.

Для обеспечения работы со смарт-картой подсистемы Kerberos добавочно к предустановленным пакетам ald/kerberos установите пакет krb5-pkinit, libpam-krb5 на клиенте и сервере.

Для обеспечения возможности выпуска ключей и сертификатов на Рутокен ЭЦП  на сервере также установите пакеты libengine-pkcs11-openssl1.1

Для обеспечения возможности обращения к смарт-карте Рутокен ЭЦП, на клиенте и сервере следует  установить библиотеку librtpkcs11ecp.so, которую следует скачать с официального сайта Актив-софта: https://www.rutoken.ru/support/download/pkcs/


user ~$
$ sudo apt-get install libccid pcscd libpcsclite1 pcsc-tools opensc krb5-pkinit libpam-krb5 libengine-pkcs11-openssl1.1

user ~$ 

$ sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb



Установка и настройка центра сертификации на сервере




Для работы модуля pkinit нам придется воспользоваться OpenSSL в качестве УЦ(CA), чтобы создать ключевые пары и сертификаты клиента и сервера.

OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA, ГОСТ и сертификаты X.509, подписывать их, формировать CSR и CRT.

Все настройки в руководстве выполняются для тестового домена SMARTCARD.ALD. Примем, что сервер и клиент принадлежат домену SMARTCARD.ALD, имя сервера - kdc, а клиента - client. При настройке используйте имя вашего домена, сервера и клиента.

Выполните следующие действия:


1) Создайте каталог CA командой:

mkdir /etc/ssl/CA

и перейдите в него. В этом каталоге будут размещаться сгенерированные ключи и сертификаты.


2) Создайте ключ и сертификат CA:

$ openssl genrsa -out cakey.pem 2048
$ openssl req -key cakey.pem -new -x509 -days 3650 -out cacert.pem

Где days - количество дней действия сертификата CA


В диалоге заполните необходимую информацию о вашем центре сертификации.

В Common name указать имя домена. В случае нашего примера: SMARTCARD.ALD 



3) Создайте ключ и сертификат KDC:

$ openssl genrsa -out kdckey.pem 2048
$ openssl req -new -out kdc.req -key kdckey.pem

В диалоге заполните необходимую информацию о вашем сервере.

В Common name указать kdc.



4) Установите переменные среды. Переменные среды устанавливаются в рамках сессии и не устанавливаются для других сессий и не сохраняются после закрытия сессии.

$ export REALM=SMARTCARD.ALD 
$ export CLIENT=kdc 

Для того, чтобы убедиться что переменные указаны верно, воспользуйтесь командой:
env | grep REALM 
env | grep CLIENT



5) Загрузите файл pkinit_extensions и сохраните в каталог в котором, Вы выполняете команды:

 pkinit_extensions

 содержимое файла pkinit_extensions:

[ kdc_cert ]
basicConstraints=CA:FALSE
 
# Here are some examples of the usage of nsCertType. If it is omitted
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
 
#Pkinit EKU
extendedKeyUsage = 1.3.6.1.5.2.3.5
 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
 
# Copy subject details
 
issuerAltName=issuer:copy
 
# Add id-pkinit-san (pkinit subjectAlternativeName)
subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:kdc_princ_name
 
[kdc_princ_name]
realm = EXP:0, GeneralString:${ENV::REALM}
principal_name = EXP:1, SEQUENCE:kdc_principal_seq
 
[kdc_principal_seq]
name_type = EXP:0, INTEGER:1
name_string = EXP:1, SEQUENCE:kdc_principals
 
[kdc_principals]
princ1 = GeneralString:krbtgt
princ2 = GeneralString:${ENV::REALM}
 
[ client_cert ]
 
# These extensions are added when 'ca' signs a request.
 
basicConstraints=CA:FALSE
 
keyUsage = digitalSignature, keyEncipherment, keyAgreement
 
extendedKeyUsage =  1.3.6.1.5.2.3.4
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
 
 
subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name
 
 
# Copy subject details
 
issuerAltName=issuer:copy
 
[princ_name]
realm = EXP:0, GeneralString:${ENV::REALM}
principal_name = EXP:1, SEQUENCE:principal_seq
 
[principal_seq]
name_type = EXP:0, INTEGER:1
name_string = EXP:1, SEQUENCE:principals
 
[principals]
princ1 = GeneralString:${ENV::CLIENT}


6) Выпустите сертификат KDC:

$ openssl x509 -req -in kdc.req -CAkey cakey.pem -CA cacert.pem -out kdc.pem -extfile pkinit_extensions -extensions kdc_cert -CAcreateserial -days 365


7) Файлы kdc.pem, kdckey.pem, cacert.pem перенесите в /var/lib/krb5kdc/


8) Создайте резервную копию файла /etc/krb5kdc/kdc.conf. Отредактируйте /etc/krb5kdc/kdc.conf, дополнив секцию [kdcdefaults] следующими записями:

pkinit_identity = FILE:/var/lib/krb5kdc/kdc.pem,/var/lib/krb5kdc/kdckey.pem
pkinit_anchors = FILE:/var/lib/krb5kdc/cacert.pem

Первая запись задаёт ключи и сертификат сервера, а вторая указывает на корневой сертификат центра сертификации.


9. Для принятия изменений выполните:

systemctl restart krb5-admin-server
systemctl restart krb5-kdc



Подготовка смарт-карты. Выпуск ключей и сертификата пользователя



Подключите устройство, которое следует подготовить.

Проверка работы Рутокен в системе



Для проверки работы Рутокена:

user ~$ 

$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T




путь до библиотеки librtpkcs11ecp.so может различаться

Для того чтобы определить путь до библиотеки librtpkcs11ecp.so введите команду:
$ find /usr/*(lib|lib64) -name librtpkcs11ecp.so


Инициализация устройства



Проинициализируйте устройство, установите PIN-код пользователя. Помните, что инициализация устройства удалит все данные на Рутокен ЭЦП без возможности восстановления.

Для инициализации необходимо воспользоваться утилитой pkcs11-tool.


user ~$ $ pkcs11-tool --slot 0 --init-token --so-pin 87654321 --label 'AstraLinux' --module /usr/lib/librtpkcs11ecp.so

--slot 0 — указывает, в какой виртуальный слот подключено устройство. Как правило, это слот 0, но могут быть и другие значения - 1,2 и т.д.; 
--init-token - команда инициализации токена; 
--so-pin 87654321 - PIN-код администратора Рутокен ЭЦП. По умолчанию имеет значение 87654321; 
--label 'AstraLinux' - название устройства; 
--module /usr/lib/librtpkcs11ecp.so — указывает путь до библиотеки librtpkcs11ecp.so


Задания PIN-кода пользователя



Для задания PIN-кода пользователя используйте команду:

user ~$ $ pkcs11-tool --slot 0 --init-pin --so-pin '87654321' --login --pin '12345678' --module /usr/lib/librtpkcs11ecp.so

--init-pin - команда установки PIN-кода пользователя; 
--login - команда входа в токен; 
--pin 12345678 - задаваемый PIN-код пользователя; 



Генерация пары ключей на Рутокен ЭЦП



Сгенерируйте ключи на устройстве, для этого введите следующую команду:

user ~$ pkcs11-tool --slot 0 --login --pin 12345678 --keypairgen --key-type rsa:2048 --id 33 --label “2fa_test1_key” --module /usr/lib/librtpkcs11ecp.so

-keypairgen --key-type rsa:2048 — указывает, что должны быть сгенерированы RSA ключи длиной 2048 бит; 
--id 33 — устанавливает атрибут CKA_ID ключа. CKA_ID может быть любым; 
--label “test1 key” — устанавливает атрибут CKA_LABEL(имя) ключа. Атрибут может быть любым; 


Генерация запроса на сертификат



Сгенерируйте запрос на сертификат с помощью утилиты openssl. Для этого введите следующие команды:


$ openssl

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/librtpkcs11ecp.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/librtpkcs11ecp.so
Loaded: (pkcs11) pkcs11 engine


OpenSSL> req -engine pkcs11 -new -key 0:33 -keyform engine -out client.req 

engine "pkcs11" set.
Enter PKCS#11 token PIN for Rutoken ECP <AstraLinux>:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Rusbitech  
Organizational Unit Name (eg, section) []: Astra
Common Name (e.g. server FQDN or YOUR name) []:test1 (!Ваш_Пользователь!)
Email Address []:shuhrat@astralinux.ru
 
OpenSSL> exit


-new -key 0:33, где 0— номер виртуального слота с устройством, 33— атрибут CKA_ID раннее сгенерированных ключей.

в CN = следует указать имя пользователя


Выпуск сертификата для пользователя



Необходимо установить переменные окружения:

$ export REALM=SMARTCARD.ALD
$ export CLIENT=test1 


SMARTCARD.ALD - ваш домен

test1 - Ваш доменной пользователь

Для того, чтобы убедиться что переменные указаны верно, воспользуйтесь командой:

env | grep REALM
env | grep CLIENT



и выпустить сертификат на пользователя:

$ openssl x509 -CAkey cakey.pem -CA cacert.pem -req -in client.req -extensions client_cert -extfile pkinit_extensions -out client.pem -days 365


Далее перекодируйте полученный сертификат из формата PEM в формат DER. 


# openssl x509 -in client.pem -out client.cer -inform PEM -outform DER



Запишите полученный сертификат на токен:

pkcs11-tool --slot 0 --login --pin 12345678 --write-object client.cer --type 'cert' --label 'test1' --id 33 --module /usr/lib/librtpkcs11ecp.so


--write-object ./client.cer— указывает, что необходимо записать объект и путь до него;
--type 'cert'— указывает, что тип записываемого объекта - сертификат;
'cert' --label 'test1'— устанавливает атрибут CKA_LABEL(имя) сертификата. Атрибут может быть любым;




Настройка клиента. Проверка работоспособности



Создайте на клиенте каталог /etc/krb5/. Скопируйте в /etc/krb5/ сертификат CA (cacert.pem) c сервера.

Настройте kerberos в /etc/krb5.conf. Секцию [libdefaults] дополните следующими строками:

[libdefaults] 
default_realm = SMARTCARD.ALD
pkinit_anchors = FILE:/etc/krb5/cacert.pem
# для аутентификации по токену
pkinit_identities = PKCS11:/usr/lib/librtpkcs11ecp.so



Выполните проверку: 

$ kinit


Когда появится строка запроса PIN-кода к карте, введите его.

Для проверки того, что kerberos-тикет был успешно получен для пользователя, введите команду klist.

Для удаления тикета — kdestroy.


Для debugga, перед командой kinit следует ввести:

env KRB5_TRACE=/dev/stdout kinit test1 (или другое имя пользователя)



Вход выполняется с подключенным токеном к компьютеру. При графическом входе в поле Login вводится имя пользователя, в поле Password вводится <PIN пользователя>. При консольном входе все аналогично, только в момент ввода пароля будет сообщено, что требуется <PIN пользователя>.


$ login test1


Настройка политики аутентификации


Существует возможность указания дополнительных параметров модуля аутентификации pam_krb5.so в файле /etc/pam.d/common-auth в строке относящейся к pam_krb5.so:

– try_pkinit — режим при котором осуществляется попытка аутентификации с помощью устройств PKCS-11, в случае провала попытки предоставляется возможность входа с помощью Kerberos пароля пользователя;

– use_pkinit — режим при котором требуется аутентификация с помощью устройств PKCS-11, в случае провала процесс входа прерывается;

– pkinit_prompt — вывод приглашения для подключения устройства PKCS-11 перед выполнением попытки входа.


После обновления pam-auth-update, опции pkinit исчезнут. 

Для того, чтобы опция сохранялась принудительно, в конфигурационном файле /usr/share/pam-configs/krb5 в поле Auth-Initial следует дописать одну из опций.


Более подробное описание см. в руководстве man.


Полезные ссылки




2 Comments

  1. env | grep REALM CLIENT
    Это две разные команды

    env | grep REALM


    env | grep CLIENT


    1. спасибо, исправил