Начиная с очередного обновления 1.8 программное обеспечение Astra Linux Directory (ALD) исключено из состава Astra Linux Special Edition. Для организации доменов рекомендуется использовать программный комплекс ALD Pro. Также возможно использование доменов FreeIPA, Samba, Windows AD.

Актуальную статьи по применению ключевых носителей в Astra Linux см. по ссылкам:

Статья применима для:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1
  • Astra Linux Special Edition РУСБ.10015-16 исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12

1. Описание стенда


Стенд состоит из сервера и клиента, входящих в домен домен Astra Linux Directory (ALD):

2. Терминология Kerberos

  • Билет (ticket) – временные данные, выдаваемые клиенту для аутентификации на сервере, на котором располагается необходимая служба.
  • Клиент (client) – некая сущность в сети (пользователь, хост или сервис), которая может получить билет от Kerberos.
  • Центр выдачи ключей (key distribution center, KDC) – служба, выдающая билеты Kerberos.
  • Область (realm) – сеть, используемая Kerberos, состоящая из серверов KDC и множества клиентов. Имя realm регистрозависимо, обычно совпадает с именем домена, записанным заглавными буквами.
  • Принципал (principal) – уникальное имя для клиента, для которого разрешается аутентификация в Kerberos. Записывается в виде root[/instance]@REALM.

3. Установка пакетов на сервер и клиент


На клиенте и сервере должны быть установлены следующие пакеты из репозитория Astra Linux:

  1. Для обеспечения работы со смарт-картой Рутокен ЭЦП:
    • libccid;
    • pcscd;
    • libpcsclite1;
    • opensc;
  2. Для обеспечения работы Kerberos со смарт-картой:
    • krb5-pkinit;
    • libpam-krb5.

На сервере для обеспечения возможности выпуска ключей и сертификатов на Рутокен ЭЦП должен быть установлен пакет libengine-pkcs11-openssl 

Команда для установки всех вышеперечисленных пакетов:

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

Установка загруженного файла может быть выполнена командой:

sudo apt install ./librtpkcs11ecp_*.deb


При таком способе установки может выдаваться предупреждение "Download is performed unsandboxed"/"Загрузка без ограничения песочницы", которое влияет на ход установки и может быть проигнорировано.

Установка и настройка удостоверяющего центра на сервере

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

Для создания ключей и сертификатов выполнить следующие действия:

  1. Создать каталог УЦ (имя каталога - CA).  В этом каталоге будут размещаться созданные ключи и сертификаты. Команда:

    sudo mkdir /etc/ssl/CA

  2. Перейти в созданный каталог:

    cd /etc/ssl/CA

  3. Создать ключ и сертификат CA, заполнив в диалоге необходимую информацию. В поле Common Name при этом следует указать имя домена. В настоящем примере: SMARTCARD.ALD:

    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
  4. Создать ключ и и запрос на сертификат KDC, в диалоге заполнив необходимую информацию. В данном случае в поле Common Name указать kdc. Команда:

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

  5. Установите переменные окружения. Переменные окружения применяются в рамках текущей сессии, не устанавливаются для других сессий и не сохраняются после закрытия текущей сессии:

    export REALM=SMARTCARD.ALD
    export CLIENT=kdc
    Для того, чтобы убедиться что переменные указаны верно, можно использовать команду:
    env | grep -E "REALM|CLIENT"

  6.  Загрузить файл 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}

  7. Выпустить сертификат KDC:

    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

  8. Файлы kdc.pem, kdckey.pem, cacert.pem скопировать в каталог /var/lib/krb5kdc/:

    sudo cp kdc.pem kdckey.pem cacert.pem /var/lib/krb5kdc/

  9. Создать резервную копию файла /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

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

  10. Для принятия изменений выполнить команду:

    sudo systemctl restart krb5-admin-server krb5-kdc

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


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

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


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

  1. Определить расположение библиотеки  librtpkcs11ecp.so:

    find /usr/*(lib|lib64) -name librtpkcs11ecp.so
    Далее используется путь /usr/lib/librtpkcs11ecp.so.

  2. Выполнить команду, указав актуальное расположение библиотеки:

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

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


Инициализация устройства удалит все данные на Рутокен ЭЦП без возможности восстановления. Подробнее про работу с токенами Рутокен см. СКЗИ Актив РуТокен

Для инициализации используется инструмент pkcs11-tool:

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. 

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


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

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

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

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


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

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(имя) ключа. Атрибут может быть любым; 

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

Для генерации запроса на сертификат использовать команду:

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 []: (!Адрес_Электронной_Почты!)
 
OpenSSL> exit

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

В поле Common Name следует указать имя пользователя.

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


Далее предполагается, что действия выполняются в ранее созданном каталоге удостоверяющего центра (каталог /etc/ssl/CA).

Установить переменные окружения:

export REALM=SMARTCARD.ALD
export CLIENT=test1 

SMARTCARD.ALD - имя домена
test1 - имя доменного пользователя

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

env | grep -E "REALM|CLIENT"
Выпустить сертификат пользователя:
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
Перекодировать полученный сертификат из формата PEM в формат DER: 
sudo 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(имя) сертификата. Атрибут может быть любым;

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


  1. Создать на клиенте каталог /etc/krb5/;
  2. Скопировать в созданный каталог /etc/krb5/ сертификат УЦ (cacert.pem) c сервера.
  3. Настроить Kerberos, для чего в файле /etc/krb5.conf  секцию [libdefaults] дополнить следующими строками:

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

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

    Для включения отладки команду kinit использовать в форме:

    env KRB5_TRACE=/dev/stdout kinit <имя_пользователя>

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

login test1

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


Существует возможность указания дополнительных параметров модуля аутентификации 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.

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