Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Описание стенда
Стенд состоит из сервера и клиента, входящих в домен домен Astra Linux Directory (ALD):
- имя домена: SMARTCARD.ALD;
- сервер:
- под управлением Astra Linux Special Edition 1.6 с установленным обновлением БЮЛЛЕТЕНЬ № 20190222SE16 (оперативное обновление 2) или боле поздними обновлениями;
- на сервере развернут домен Astra Linux Directory (ALD) (см. Astra Linux Directory (ALD));
- имя сервера: kdc;
- клиент:
- под управлением Astra Linux Special Edition 1.6 с установленным обновлением БЮЛЛЕТЕНЬ № 20190222SE16 (оперативное обновление 2) или боле поздними обновлениями;
- имя клиента: client;
- для двухфакторной аутентификации используется токен Рутокен ЭЦП;
- существует минимум один доменный пользователь, который может пройти аутентификацию по паролю;
- показания часов клиента и сервера совпадают (см. Службы синхронизации времени в Astra Linux).
Терминология Kerberos
- Билет (ticket) – временные данные, выдаваемые клиенту для аутентификации на сервере, на котором располагается необходимая служба.
- Клиент (client) – некая сущность в сети (пользователь, хост или сервис), которая может получить билет от Kerberos.
- Центр выдачи ключей (key distribution center, KDC) – служба, выдающая билеты Kerberos.
- Область (realm) – сеть, используемая Kerberos, состоящая из серверов KDC и множества клиентов. Имя realm регистрозависимо, обычно совпадает с именем домена, записанным заглавными буквами.
- Принципал (principal) – уникальное имя для клиента, для которого разрешается аутентификация в Kerberos. Записывается в виде root[/instance]@REALM.
Установка пакетов на сервер и клиент
На клиенте и сервере должны быть установлены следующие пакеты из репозитория Astra Linux:
- Для обеспечения работы со смарт-картой Рутокен ЭЦП:
- libccid;
- pcscd;
- libpcsclite1;
- opensc;
- Для обеспечения работы Kerberos со смарт-картой:
- krb5-pkinit;
- libpam-krb5.
На сервере для обеспечения возможности выпуска ключей и сертификатов на Рутокен ЭЦП должен быть установлен пакет libengine-pkcs11-openssl1.1.
Команда для установки всех вышеперечисленных пакетов:
Command |
---|
sudo apt install libccid pcscd libpcsclite1 pcsc-tools opensc krb5-pkinit libpam-krb5 libengine-pkcs11-openssl1.1 |
Для обеспечения возможности обращения к смарт-карте Рутокен ЭЦП, на клиенте и сервере следует установить стороннюю библиотеку librtpkcs11ecp.so, доступную на официальном сайте производителя токенов Рутокен — компании Актив https://www.rutoken.ru/support/download/pkcs/
Информация |
---|
Версия библиотеки для платформы Эльбрус доступна по ссылке: librtpkcs11ecp_2.0.2.0-1astra_e2k-8c.deb |
Установка загруженного файла может быть выполнена командой:
Command |
---|
sudo apt install ./librtpkcs11ecp_*.deb |
При таком способе установки может выдаваться предупреждение "Download is performed unsandboxed"/"Загрузка без ограничения песочницы", которое влияет на ход установки и может быть проигнорировано.
Установка и настройка удостоверяющего центра на сервере
Для создания закрытых ключей (далее - ключи) и сертификатов закрытых ключей (далее - сертификаты) клиента и сервера в качестве удостоверяющего центра (УЦ) используется OpenSSL. OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA, ГОСТ и сертификаты X.509, подписывать их, формировать CSR и CRT.
Для создания ключей и сертификатов выполнить следующие действия:
Создать каталог УЦ (имя каталога - CA). В этом каталоге будут размещаться созданные ключи и сертификаты. Команда:
Command sudo mkdir /etc/ssl/CA Перейти в созданный каталог:
Command cd /etc/ssl/CA Создать ключ и сертификат CA, заполнив в диалоге необходимую информацию. В поле Common Name при этом следует указать имя домена. В настоящем примере: SMARTCARD.ALD:
Command sudo openssl genrsa -out cakey.pem 2048
sudo openssl req -key cakey.pem -new -x509 -days 3650 -out cacert.pemопция -days задает срок действия сертификата в днях (в примере выше - 3650 дней). Пример диалога:
Блок кода 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) []:Astra Linux Organization Name (eg, company) [Internet Widgits Pty Ltd]:Astra Linux Organizational Unit Name (eg, section) []:Wiki Common Name (e.g. server FQDN or YOUR name) []:SMARTCARD.ALD
Создать ключ и и запрос на сертификат KDC, в диалоге заполнив необходимую информацию. В данном случае в поле Common Name указать kdc. Команда:
Command sudo openssl genrsa -out kdckey.pem 2048
sudo openssl req -new -out kdc.req -key kdckey.pemУстановите переменные окружения. Переменные окружения применяются в рамках текущей сессии, не устанавливаются для других сессий и не сохраняются после закрытия текущей сессии:
Command export REALM=SMARTCARD.ALD
export CLIENT=kdcДля того, чтобы убедиться что переменные указаны верно, можно использовать команду:
Command env | grep -E "REALM|CLIENT" Загрузить файл pkinit_extensions и сохранить его в текущем каталоге: 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.
Оглавление
Стенд:
- Сервер — Astra Linux Smolensk SE 1.6, Update 2, Bulletin 20190222SE16;
- Клиент — Astra Linux Smolensk SE 1.6, Update 2, Bulletin 20190222SE16;
- Рутокен ЭЦП;
Предполагается, что Astra Linux Directory (ALD) уже развернут, существует минимум один доменный пользователь, который может пройти аутентификацию по паролю, время клиента и сервера совпадают (ntp).
Установка драйверов на сервер и клиент
Для обеспечения работы со смарт-картой Рутокен ЭЦП на клиенте и сервере установите следующие пакеты: libccid, pcscd, libpcsclite1.
Для обеспечения работы со смарт-картой подсистемы Kerberos добавочно к предустановленным пакетам ald/kerberos установите пакет krb5-pkinit на клиенте и сервере.
Для обеспечения возможности выпуска ключей и сертификатов на JaCarta PKI на сервере также установите пакеты libengine-pkcs11-openssl1.1 и opensc.
Для обеспечения возможности обращения к смарт-карте Рутокен ЭЦП, на клиенте и сервере следует установить библиотеку librtpkcs11ecp.so:
...
Блок кода |
---|
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 365 -out cacert.pem |
В диалоге заполните необходимую информацию о вашем центре сертификации.
Примечание |
---|
В 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 |
5) Загрузите файл pkinit_extensions и сохраните в каталог в котором, Вы выполняете команды:
View file name pkinit_extensions height 150
...
title | содержимое файла pkinit_extensions: |
---|
...
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 -E openssl x509 -req
...
-in
...
kdc.req
...
-CAkey
...
cakey.pem
...
-CA
...
cacert.pem
...
-out
...
kdc.pem
...
-extfile
...
pkinit_extensions
...
-extensions
...
kdc_cert
...
-CAcreateserial
...
-days
...
365 Файлы kdc.pem, kdckey.pem, cacert.pem скопировать в каталог /var/lib/krb5kdc/:
Command sudo cp
...
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 systemctl restart krb5-admin-server
...
krb5-kdc
...
Подготовка смарт-карты. Выпуск ключей и сертификата пользователя
Подключите устройство, которое следует подготовить.
Проверка работы Рутокен в системе
Для проверки работы
...
Рутокен:
Определить расположение библиотеки librtpkcs11ecp.so:
...
Command find
...
/usr/
...
*(lib|lib64) -name librtpkcs11ecp.so
...
Далее используется путь /usr/lib/
...
librtpkcs11ecp.so
...
Для того чтобы определить путь до библиотеки librtpkcs11ecp.so введите команду:
$ find /usr/*(lib|lib64) -name librtpkcs11ecp.so
.
Выполнить команду, указав актуальное расположение библиотеки:
Command pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Инициализация устройства
Предупреждение |
---|
Инициализация |
Инициализация устройства
...
устройства удалит все данные на Рутокен ЭЦП без возможности восстановления. Подробнее про работу с токенами Рутокен см. СКЗИ Актив РуТокен |
Для инициализации
...
используется инструмент pkcs11-tool
...
:
...
Command |
---|
...
pkcs11-tool --slot 0 --init-token --so-pin 87654321 --label 'AstraLinux' --module /usr/lib/librtpkcs11ecp.so |
Примечание |
---|
--slot 0 — указывает, в какой виртуальный слот подключено устройство. Как правило, это слот 0, но могут быть и другие значения - 1,2 и т.д.; |
...
so — указывает путь до библиотеки librtpkcs11ecp.so. |
...
Задание PIN-кода пользователя
Для задания PIN-кода пользователя
...
использовать команду:
...
Command |
---|
...
pkcs11-tool --slot 0 --init-pin --so-pin '87654321' --login --pin '12345678' --module /usr/lib/librtpkcs11ecp.so |
Примечание |
---|
--init-pin - команда установки PIN-кода пользователя; |
Генерация пары ключей на Рутокен ЭЦП
...
Для генерации ключей на устройстве
...
использовать команду:
...
Command |
---|
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 бит; |
...
$ openssl
33 — устанавливает атрибут CKA_ID ключа. CKA_ID может быть любым; |
Генерация запроса на сертификат
...
Для генерации запроса на сертификат использовать команду:
Command |
---|
openssl |
OpenSSL>
engine dynamic -
...
...
-pre ID:pkcs11 -pre LIST_ADD:
...
1 -pre LOAD -
...
pre MODULE_PATH:/usr/lib/librtpkcs11ecp.so
(dynamic) Dynamic engine loading support |
OpenSSL> req -engine pkcs11 -new -key 0:33 -keyform engine -out client.req
...
|
...
|
...
|
...
|
Примечание |
---|
-new -key 0: |
...
33, где 0— номер виртуального слота с устройством, 33 — атрибут CKA_ |
...
ID раннее созданной ключевой пары. В поле Common Name следует указать имя пользователя. |
Выпуск сертификата для пользователя
...
Далее предполагается, что действия выполняются в ранее созданном каталоге удостоверяющего центра (каталог /etc/ssl/CA).
Установить переменные окружения:
...
Command |
---|
...
export |
...
REALM= |
...
SMARTCARD.ALD export CLIENT=test1 |
...
Примечание |
---|
SMARTCARD.ALD - имя домена |
Для того, чтобы убедиться что переменные указаны верно, использовать команду:
Command |
---|
env | grep -E "REALM|CLIENT" |
Выпустить сертификат пользователя:
Command |
---|
sudo -E openssl x509 -CAkey cakey.pem -CA cacert.pem -req -in client.req -extensions client_cert -extfile pkinit_extensions -out client.pem -days 365 |
Перекодировать
Примечание |
---|
SMARTCARD.ALD - ваш домен test1 - Ваш доменной пользователь |
...
Блок кода |
---|
$ 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 |
...
0 |
...
--login |
...
--pin |
...
12345678 |
...
--write-object |
...
client.cer |
...
--type |
...
'cert' |
...
--label |
...
'test1' |
...
--id |
...
33 |
...
--module |
...
/usr/lib/librtpkcs11ecp.so |
Примечание |
---|
--write-object ./client.cer— указывает, что необходимо записать объект и путь до него; |
Настройка клиента. Проверка работоспособности
...
- Создать на клиенте каталог /etc/krb5/
...
- ;
- Скопировать в созданный каталог /etc/krb5/ сертификат
...
- УЦ (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
Выполнить проверку:
Command $ kinit Когда появится строка запроса PIN-кода к карте, ввести его. Для проверки того, что билет kerberos был успешно получен для пользователя, выполнить команду:
Command klist Для удаления билета:
Command kdestroy Примечание Для включения отладки команду kinit использовать в форме:
Command env KRB5_TRACE=/dev/stdout kinit <имя_пользователя>
Вход выполняется с подключенным токеном к компьютеру. При графическом входе в поле Login вводится имя пользователя, в поле Password вводится <PIN пользователя>. При консольном входе все аналогично, только в момент ввода пароля будет сообщено, что требуется <PIN пользователя>:
Command |
---|
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.
Полезные ссылки
...
Блок кода |
---|
$ kinit |
...
Для проверки того, что kerberos-тикет был успешно получен для пользователя, введите команду klist.
Для удаления тикета — kdestroy.
Вход выполняется с подключенным токеном к компьютеру. При графическом входе в поле Login вводится имя пользователя, в поле Password вводится <PIN пользователя>. При консольном входе все аналогично, только в момент ввода пароля будет сообщено, что требуется <PIN пользователя>.
Блок кода |
---|
$ login test1 |
Блокировка компьютера при извлечении токена
В состав пакета libpam-pkcs11 входит утилита pkcs11_eventmgr, которая позволяет выполнять различные действия при возникновении событий PKCS#11.
Для настройки pkcs11_eventmgr служит файл конфигурации - /etc/pam_pkcs11/pkcs11_eventmgr.conf
Пример файла конфигурации представлен ниже:
...
pkcs11_eventmgr
{
# Запуск в бэкграунде
daemon =
true
;
# Настройка сообщений отладки
debug =
false
;
# Время опроса в секундах
polling_time = 1;
# Установка тайм-аута на удаление карты
# По-умолчанию 0
expire_time = 0;
# Выбор pkcs11 библиотеки для работы с Рутокен
pkcs11_module =
/usr/lib/librtpkcs11ecp
.so;
# Действия с картой
# Карта вставлена:
event card_insert {
# Оставляем значения по умолчанию (ничего не происходит)
on_error = ignore ;
action =
"/bin/false"
;
}
# Карта извлечена
event card_remove {
on_error = ignore;
# Вызываем функцию блокировки экрана
action =
"fly-wmfunc FLYWM_LOCK"
;
}
# Карта долгое время извлечена
event expire_time {
# Оставляем значения по умолчанию (ничего не происходит)
on_error = ignore;
action =
"/bin/false"
;
}
}
...