Оглавление |
---|
Информация |
---|
...
...
|
...
|
...
|
...
Информация |
---|
Также применимо для Astra Linux: Орёл 2.12, Ленинград 8.1, Севастополь 6.2 |
Предполагается, что Astra Linux Directory (ALD) уже развернут, существует минимум один доменный пользователь, который может пройти аутентификацию по паролю, время клиента и сервера совпадают (ntp).
Установка драйверов на сервер и клиент
Для обеспечения работы со смарт-картой JaCarta на клиенте и сервере установите следующие пакеты: libccid, pcscd, libpcsclite1, opensc.
Для обеспечения работы со смарт-картой подсистемы Kerberos добавочно к предустановленным пакетам ald/kerberos установите пакет krb5-pkinit, libpam-krb5 на клиенте и сервере.
Для обеспечения возможности выпуска ключей и сертификатов на JaCarta на сервере также установите пакеты libengine-pkcs11-openssl1.1
Для обеспечения возможности обращения к смарт-карте JaCarta, на клиенте и сервере следует установить библиотеку libjcPKCS11-2.so (для JaCarta PKI/ГОСТ/FLASH), libASEP11.so (для JaCarta PKI) которую следует скачать с официального сайта Аладдина:
https://www.aladdin-rd.ru/support/downloads/jacarta
Test |
---|
$ sudo apt-get install libccid pcscd libpcsclite1 pcsc-tools opensc krb5-pkinit libpam-krb5 libengine-pkcs11-openssl1.1 |
Блок кода |
---|
user ~$
$ sudo dpkg -i название_загруженного_пакета.deb |
Установка и настройка центра сертификации на сервере
Для работы модуля pkinit нам придется воспользоваться OpenSSL в качестве УЦ(CA), чтобы создать ключевые пары и сертификаты клиента и сервера.
...
|
Установка пакетов для доступа к токенам
Для обеспечения доступа к токенам на компьютерах, работающих с токенами (УЦ, клиенты, сервер, если он выступает в роли клиента) должен быть установлен пакет jcpkcs11-2. Этот пакет предоставляется производителем токенов и не входит в дистрибутивы Astra Linux. Для получения пакета и инструкций по его установке следует обратиться к производителю: https://www.aladdin-rd.ru.
Создание УЦ и работа с УЦ
Установка пакетов
- Установить пакет jcpkcs11-2 в соответствии с инструкциями производителя;
Установить пакеты из дистрибутива Astra Linux:
Command sudo apt install -y opensc libengine-pkcs11-openssl1.1 pcsc-tools
Создание и настройка УЦ
В качестве инструмента для создания УЦ в данном примере используется OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS....
...
- сервер и
...
- клиенты принадлежат домену SMARTCARD.ALD
...
- ;
- имя
...
- службы - kdc
...
- ;
- имя клиента - client.
При настройке рабочей системы используйте
...
реальные имена вашего домена, сервера и клиента.
...
Порядок действий по настройке:
...
Создать каталог удостоверяющего центра (УЦ) командой:
...
Command sudo 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 |
...
Перейти в созданный каталог:
Command cd /etc/ssl/CA Создать ключ и сертификат УЦ, указав собственные параметры в опции -subst:
Примечание В параметре Common name (CN) обязательно указать имя домена. В случае нашего примера: SMARTCARD.ALD
Command sudo openssl genrsa -out cakey.pem 2048
sudo openssl req -batch -new -key cakey.pem -out cacert.pem -subj '/C=RU/ST=MO/L=Moscow/O=Astra/OU=Wiki/emailAddress= /CN=SMARTCARD.ALD' -x509 -days 3650Примечание Параметр days определяет количество дней действия сертификата УЦ.
Создание ключей службы аутентификации kdc
Создать ключ и сертификат службы KDC, указав собственные параметры в опции -subst:
Примечание В Common name (CN) обязательно указать имя
...
3) Создайте ключ и сертификат KDC:
...
службы kdc.
Command sudo openssl genrsa -out
...
kdckey.pem
...
2048
...
В диалоге заполните необходимую информацию о вашем сервере.
Примечание |
---|
В Common name указать kdc. |
...
sudo openssl req -batch -new -key kdckey.pem -out kdc.req -subj '/C=RU/ST=MO/L=Moscow/O=Astra/OU=Wiki/emailAddress= /CN=kdc'Установить переменные среды. Переменные среды устанавливаются в рамках сессии
...
, не устанавливаются для других сессий
...
, не сохраняются после закрытия сессии
...
:
...
Command
...
export
...
REALM=SMARTCARD.
...
ALD
export CLIENT=kdcУбедиться что переменные указаны верно, воспользовавшись командой:
Command env | grep -wE "REALM|CLIENT" Загрузить
...
файл pkinit_extensions и
...
сохранить в каталог в котором
...
выполняются команды:
...
...
Раскрыть title содержимое файла 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}
Выпустить сертификат KDC:
Command sudo openssl x509 -req -in kdc.req -CAkey cakey.pem -CA cacert.pem -out kdc.pem -extfile pkinit_extensions -extensions kdc_cert -CAcreateserial -days 365
Подготовка токенов. Выпуск ключей и сертификата пользователей
Подключить устройство, которое следует подготовить. В зависимости от используемой модели токена (PKI или GOST), в дальнейшем требуется использовать определенную библиотеку ( libjcPKCS11-2.so или libASEP11.so). Узнать, где расположены библиотеки можно с помощью команды:
Command Title dpkg -L jcpkcs11-2 | egrep "(libjcPKCS11-2.so|libASEP11.so)" /usr/lib/libASEP11.so
/usr/lib/libjcPKCS11-2.so.2.7.3Далее предполагается, что библиотеки расположены в каталоге /usr/lib/.
Проверить работоспособность JaCarta:
При использовании библиотеки libjcPKCS11-2.so (для JaCarta PKI/ГОСТ/FLASH):
Command pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -T при использовании библиотеки libASEP11.so (для JaCarta PKI):
Command pkcs11-tool --module /usr/lib/libASEP11.so -T
Инициализировать токен:
Предупреждение Внимание! Инициализация устройства удалит все данные на JaCarta PKI без возможности восстановления.
Command pkcs11-tool --slot 0x1ffff --init-token --so-pin 00000000 --label 'JaCarta PKI' --module /usr/lib/libjcPKCS11-2.so
Задать ПИН-код пользователя:
Command pkcs11-tool --slot 0x1ffff --init-pin --so-pin 00000000 --login --pin 11111111 --module /usr/lib/libjcPKCS11-2.so
Информация --slot 0x1ffff — указывает используемый виртуальный слот токена. Как правило, это слот 0, но могут быть и другие значения – 1,2 и т.д.;
--init-token – команда инициализации токена;
--pin - пин код пользователя JaCarta. По умолчанию имеет значение 11111111;
--so-pin 00000000 – ПИН код администратора JaCarta PKI. По умолчанию имеет значение 00000000;
--label 'JaCarta PKI' - метка(название) устройства;
--module - указывает путь до библиотеки libjcPKCS11-2.soСоздать на устройстве пару ключей:
Command pkcs11-tool --slot 0x1ffff --login --pin 11111111 --keypairgen --key-type rsa:2048 --id 33 --label “2fa_test1_key” --module /usr/lib/libjcPKCS11-2.so
Информация -keypairgen --key-type rsa:2048 — указывает, что должны быть сгенерированы RSA ключи длиной 2048 бит;
--id 33 — устанавливает атрибут CKA_ID ключа. CKA_ID может быть любым;
--label “test1 key” — устанавливает атрибут CKA_LABEL(имя) ключа. Атрибут может быть любым;Создать запрос на сертификат с помощью инструмента openssl. Для этого выполнить следующие команды:
Примечание В Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) pkcs11 libengine-pkcs11-openssl версии 1.0.2 не совместим с библиотекой libjcPKCS11-2.so. Для корректного функционирования, следует:
- либо скачать и установить подписанный пакет libengine-pkcs11-openssl1.1 версии 0.4.4-4 для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6): libengine-pkcs11-openssl1.1_0.4.4-4_amd64.deb
- либо установить Оперативные обновления для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
Используемый для генерации сертификата закрытый ключ идентифицируется парой <десятичный_номер_слота>:<id>. Для токенов Рутокен слоты нумеруются числами вида 0x1, 0x2 и т.д., для токенов Аладдин слоты нумеруются как 0x1ffff, 0x2ffff и т.д. Слоту 0x1ffff соответствует десятичный номер 131071 (используется ниже в примере команды):
Command Title 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/libjcPKCS11-2.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:
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 |
Подготовка смарт-карты. Выпуск ключей и сертификата пользователя
Подключите устройство, которое следует подготовить.
Предупреждение |
---|
В зависимости от модели токена (PKI / GOST), в дальнейшем требуется указывать определенную библиотеку ( libjcPKCS11-2.so или libASEP11.so) |
Проверка работы JaCarta в системе
...
Блок кода |
---|
user ~$
libjcPKCS11-2.so (для JaCarta PKI/ГОСТ/FLASH):
$ pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -T
libASEP11.so (для JaCarta PKI)
$ pkcs11-tool --module /usr/lib/x64-athena/libASEP11.so -T |
...
Примечание |
---|
путь до библиотеки libjcPKCS11-2.so, libASEP11.so может различаться. Для того чтобы определить путь до библиотеки libjcPKCS11-2.so введите команду: |
Инициализация устройства
Для инициализации токена необходимо воспользоваться утилитой pkcs11-tool.
Test |
---|
pkcs11-tool --slot 0x1ffff --init-token --so-pin 00000000 --label 'JaCarta PKI' --module /usr/lib/libjcPKCS11-2.so |
Для задания ПИН кода пользователя используйте команду:
Test |
---|
pkcs11-tool --slot 0x1ffff --init-pin --so-pin 00000000 --login --pin 11111111 --module /usr/lib/libjcPKCS11-2.so |
Информация |
---|
--slot 0x1ffff — указывает в какой виртуальный слот подключено устройство. Как правило, это слот 0, но могут быть и другие значения – 1,2 и т.д. --init-token – команда инициализации токена. --pin - пин код пользователя JaCarta. По умолчанию имеет значение 11111111 --so-pin 00000000 – ПИН код администратора JaCarta PKI. По умолчанию имеет значение 00000000 --label 'JaCarta PKI' - метка(название) устройства. --module - указывает путь до библиотеки libjcPKCS11-2.so |
Предупреждение |
---|
Внимание! Инициализация устройства удалит все данные на JaCarta PKI без возможности восстановления. |
Генерация пары ключей на JaCarta
Сгенерируйте ключи на устройстве, для этого введите следующую команду:
...
Примечание |
---|
-keypairgen --key-type rsa:2048 — указывает, что должны быть сгенерированы RSA ключи длиной 2048 бит; |
Генерация запроса на сертификат
...
Loaded: (pkcs11) pkcs11 engine
OpenSSL> req -engine pkcs11 -new -key 131071:33 -keyform engine -out client.reqengine
"pkcs11"
set
.
Enter PKCS
#11 token PIN for JaCarta 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 []:*********
OpenSSL>
exit
Примечание -new -key 131071:33, где 131071— номер виртуального слота с устройством (0x1ffff) , 33— атрибут CKA_ID раннее сгенерированных ключей.
в поле CN = следует указать имя пользователя
Узнать номер виртуального слота можно используя команду:
Command pkcs11-tool --module
Примечание |
---|
1) В Astra Linux SE 1.6 pkcs11 libengine-pkcs11-openssl версии 1.0.2 не совместим с библиотекой libjcPKCS11-2.so. Для корректного функционирования, следует скачать и установить подписанный пакет libengine-pkcs11-openssl1.1 версии 0.4.4-4 для Смоленска 1.6: libengine-pkcs11-openssl1.1_0.4.4-4_amd64.deb 2) Либо установить и обновить Обновления безопасности и методические указания Astra Linux Special Edition 1.6 |
$ 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/libjcPKCS11-2.so
...
/usr/lib/libjcPKCS11-2.so
...
engine
"pkcs11"
set
.
Enter PKCS
#11 token PIN for JaCarta 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
-L Примечание В случае если openssl выдаст ошибку о неверном слоте, № слота следует указать в десятичном формате, например: 131071:33
Выпустить сертификат для пользователя:
Установить переменные окружения:
Command export REALM=<имя_домена>
export CLIENT=<имя_доменного_пользователя>Убедиться что переменные указаны верно:
Command env | grep -wE "REALM|CLIENT"
Выпустить сертификат пользователя:
Command sudo 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:
Command sudo openssl x509 -in client.pem -out client.cer -inform PEM -outform DER Записать полученный сертификат на токен:
Command pkcs11-tool --slot 0x1ffff --login --pin 11111111 --write-object client.cer --type 'cert' --label 'test1' --id 33 --module /usr/lib/libjcPKCS11-2.so Примечание --write-object ./client.cer— указывает, что необходимо записать объект и путь до него;
--type 'cert'— указывает, что тип записываемого объекта - сертификат;
'cert' --label 'test1'— устанавливает атрибут CKA_LABEL(имя) сертификата. Атрибут может быть любым;
Подготовка сервера
Созданные в УЦ файлы kdc.pem, kdckey.pem, cacert.pem переместить в каталог /var/lib/krb5kdc/ на сервере;
Создать резервную копию файла /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
Первая запись задаёт ключи и сертификат сервера, а вторая указывает на корневой сертификат центра сертификации. Для этого можно использовать команды:
Command sudo sed -i.`date +%Y-%m%d-%H:%M:%S` "/\[kdcdefaults\]/a \ pkinit_anchors = FILE:/var/lib/krb5kdc/cacert.pem" /etc/krb5kdc/kdc.conf
sudo sed -i "/\[kdcdefaults\]/a \ pkinit_identity = FILE:/var/lib/krb5kdc/kdc.pem,/var/lib/krb5kdc/kdckey.pem" /etc/krb5kdc/kdc.confДля принятия изменений выполнить команды:
Command sudo systemctl restart krb5-admin-server
sudo systemctl restart krb5-kdc
Настройка клиента. Проверка работоспособности
Создать на клиенте каталог /etc/krb5/:
Command sudo mkdir /etc/krb5/ - Скопировать в созданный каталог /etc/krb5/ сертификат УЦ(файл cacert.pem) c компьютера, выполняющего роль УЦ;
В файле /etc/krb5.conf секцию [libdefaults] дополнить
Примечание |
---|
-new -key 131071:33, где 131071— номер виртуального слота с устройством (0x1ffff) , 33— атрибут CKA_ID раннее сгенерированных ключей. в CN = следует указать имя пользователя |
Примечание |
---|
В случае если openssl выдаст ошибку о неверном слоте, № слота следует укзать в 10-м формате, например: 131071:33 |
Выпуск сертификата для пользователя
Необходимо установить переменные окружения:
Блок кода |
---|
$ export REALM=SMARTCARD.ALD
$ export CLIENT=test1 |
Примечание |
---|
SMARTCARD.ALD - ваш домен test1 - Ваш доменной пользователь Для того, чтобы убедиться что переменные указаны верно, воспользуйтесь командой: env | grep REALM |
...
Блок кода |
---|
$ openssl x509 -CAkey cakey.pem -CA cacert.pem -req -in client.req -extensions client_cert -extfile pkinit_extensions -out client.pem -days 365 |
...
Блок кода |
---|
# openssl x509 -in client.pem -out client.cer -inform PEM -outform DER |
...
Блок кода |
---|
pkcs11-tool --slot 0x1ffff --login --pin 11111111 --write-object client.cer --type 'cert' --label 'test1' --id 33 --module /usr/lib/libjcPKCS11-2.so |
Примечание |
---|
--write-object ./client.cer— указывает, что необходимо записать объект и путь до него; |
Настройка клиента. Проверка работоспособности
Создайте на клиенте каталог /etc/krb5/. Скопируйте в /etc/krb5/ сертификат CA (cacert.pem) c сервера.
...
следующими строками:
Блок кода [libdefaults] default_realm = SMARTCARD.ALD pkinit_anchors = FILE:/etc/krb5/cacert.pem # для аутентификации по токену pkinit_identities = PKCS11:/usr/lib/libjcPKCS11-2.so
...
- Подключить токен к компьютеру;
Выполнить
...
проверку:
...
Command
...
kinit Когда появится строка запроса PIN-кода к карте
...
- ввести PIN-код;
Для проверки того, что
...
билет Kerberos был успешно получен
...
пользователем, ввести команду:
Command klist Для удаления
...
полученного билета:
Command kdestroy
Примечание |
---|
Для |
...
включения отладки команду kinit следует |
...
...
использовать так:
|
...
|
Далее вход пользователя следует выполнять с подключенным к компьютеру токеном.
При графическом входе в поле Login вводится имя пользователя, в поле Password вводится <PIN пользователя>. При консольном входе все аналогично, только в момент ввода пароля будет сообщено, что требуется <PIN пользователя>
...
:
...
Command |
---|
...
login <имя_пользователя> |
Настройка политики аутентификации
Существует возможность указания дополнительных параметров модуля аутентификации 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.