Начиная с очередного обновления 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) с установленным обновлением БЮЛЛЕТЕНЬ № 20190222SE16 (оперативное обновление 2)
  • 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

Стенд

Состав стенда:

  • Удостоверяющий центр (УЦ);
  • Сервер;
  • Клиент;

Удостоверяющий центр может быть объединен с сервером или с клиентом.

Если на сервере предполагается осуществлять двухфакторную аутентификацию, то сервер выступает в роли клиента и требует соответствующих настроек;

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

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

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


Установка пакетов для доступа к токенам

Для обеспечения доступа к токенам на компьютерах, работающих с токенами (УЦ, клиенты, сервер, если он выступает в роли клиента) должен быть установлен пакет jcpkcs11-2. Этот пакет предоставляется производителем токенов и не входит в дистрибутивы Astra Linux. Для получения пакета и инструкций по его установке следует обратиться к производителю: https://www.aladdin-rd.ru.

Создание УЦ и работа с УЦ

Установка пакетов

  1. Установить пакет jcpkcs11-2 в соответствии с инструкциями производителя;
  2. Установить пакеты из дистрибутива Astra Linux:

    sudo apt install -y opensc libengine-pkcs11-openssl pcsc-tools

Создание и настройка УЦ

В качестве инструмента для создания УЦ в данном примере используется OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Пакет позволяет создавать ключи RSA, DH, DSA, ГОСТ и сертификаты X.509, подписывать их, формировать CSR и CRT. Далее все настройки далее выполняются для тестового домена SMARTCARD.ALD. Примем, что:
  • сервер и клиенты принадлежат домену SMARTCARD.ALD;
  • имя службы - kdc;
  • имя клиента - client.

При настройке рабочей системы используйте реальные имена вашего домена, сервера и клиента.

Порядок действий по настройке:

  1. Создать каталог удостоверяющего центра (УЦ) командой:

    sudo mkdir /etc/ssl/CA

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

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

    cd /etc/ssl/CA

  3. Создать ключ и сертификат УЦ, указав собственные параметры в опции -subst:

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

    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

  1. Создать ключ и сертификат службы KDC, указав собственные параметры в опции -subst:

    В Common name (CN) обязательно указать имя службы kdc.

    sudo openssl genrsa -out kdckey.pem 2048
    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'

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

    export REALM=SMARTCARD.ALD
    export CLIENT=kdc

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

    env | grep -wE "REALM|CLIENT"

  4. Загрузить файл 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}
  5. Выпустить сертификат KDC:

    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

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

  1. Подключить устройство, которое следует подготовить. В зависимости от используемой модели токена (PKI или GOST), в дальнейшем требуется использовать определенную библиотеку ( libjcPKCS11-2.so или libASEP11.so). Узнать, где расположены библиотеки можно с помощью команды:

    dpkg -L jcpkcs11-2 | egrep "(libjcPKCS11-2.so|libASEP11.so)"

    /usr/lib/libASEP11.so
    /usr/lib/libjcPKCS11-2.so.2.7.3

    Далее предполагается, что библиотеки расположены в каталоге /usr/lib/.

  2. Проверить работоспособность  JaCarta:

    1. При использовании библиотеки libjcPKCS11-2.so (для JaCarta PKI/ГОСТ/FLASH):

      pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -T

    2. при использовании библиотеки libASEP11.so (для JaCarta PKI):

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

  3. Инициализировать токен:

    Внимание! Инициализация устройства удалит все данные на JaCarta PKI без возможности восстановления. 

    pkcs11-tool --slot 0x1ffff --init-token --so-pin 00000000 --label 'JaCarta PKI' --module /usr/lib/libjcPKCS11-2.so

  4. Задать ПИН-код пользователя:

    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

  5. Создать на устройстве пару ключей:

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

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

    В Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) pkcs11 libengine-pkcs11-openssl версии 1.0.2 не совместим с библиотекой libjcPKCS11-2.so. Для корректного функционирования, следует:

    Используемый для генерации сертификата закрытый ключ идентифицируется парой <десятичный_номер_слота>:<id>. Для токенов Рутокен слоты нумеруются числами вида 0x1, 0x2 и т.д., для токенов Аладдин слоты нумеруются как 0x1ffff, 0x2ffff и т.д. Слоту 0x1ffff соответствует десятичный номер 131071 (используется ниже в примере команды):

    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:/usr/lib/libjcPKCS11-2.so
    Loaded: (pkcs11) pkcs11 engine
    OpenSSL> req -engine pkcs11 -new -key 131071:33 -keyform engine -out client.req 
    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 []:*********
     
    OpenSSL> exit

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

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

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

    pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -L

    В случае если openssl выдаст ошибку о  неверном слоте, № слота следует указать в десятичном формате, например: 131071:33

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

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

      export REALM=<имя_домена>
      export CLIENT=<имя_доменного_пользователя>

    2. Убедиться что переменные указаны верно:

      env | grep -wE "REALM|CLIENT"

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

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

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

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

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

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

Подготовка сервера

  1. Созданные в УЦ файлы kdc.pem, kdckey.pem, cacert.pem переместить в каталог /var/lib/krb5kdc/ на сервере;

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

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

    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

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

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

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

  1. Создать на клиенте каталог /etc/krb5/:

    sudo mkdir /etc/krb5/

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

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

    kinit

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

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

    klist

  8. Для удаления полученного билета:

    kdestroy

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

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


Далее вход пользователя следует выполнять с подключенным к компьютеру токеном.

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

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.

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