Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Информация
Предупреждение

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

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

Оглавление


Информация
titleСтатья применима к:
  • 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:

    Command
    sudo apt install -y opensc libengine-pkcs11-openssl1.1 pcscopenssl pcsc-tools

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

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

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

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

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

    Command
    sudo mkdir /etc/ssl/CA

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

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

    Command
    cd /etc/ssl/CA
  3. Создать ключ и сертификат УЦ, указав собственные параметры в опции -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

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

    Примечание

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

    Command

    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. Установить переменные среды. Переменные среды устанавливаются в рамках сессии, не устанавливаются для других сессий, не сохраняются после закрытия сессии:

    Command
    export REALM=SMARTCARD.ALD
    export CLIENT=kdc
  3. Убедиться что переменные указаны верно, воспользовавшись командой:

    Command
    env | grep -wE "REALM|CLIENT"
  4. Загрузить файл 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.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:

    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

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

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

    Command
    Titledpkg -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):

      Command
      pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -T
    2. при использовании библиотеки libASEP11.so (для JaCarta PKI):

      Command
      pkcs11-tool --module /usr/lib/libASEP11.so -T
  3. Инициализировать токен:

    Предупреждение

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

    Command
    pkcs11-tool --slot 0x1ffff --init-token --so-pin 00000000 --label 'JaCarta PKI' --module /usr/lib/libjcPKCS11-2.so
  4. Задать ПИН-код пользователя:

    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

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

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

  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 (используется ниже в примере команды):

    Command
    Titleopenssl

    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 = следует указать имя пользователя

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

    Command
    pkcs11-tool --module /usr/lib/libjcPKCS11-2.so -L
    Примечание

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

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

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

      Command

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

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

      Command

      env | grep -wE "REALM|CLIENT"

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

      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
    4. Перекодировать полученный сертификат из формата PEM в формат DER:

      Command
      sudo openssl x509 -in client.pem -out client.cer -inform PEM -outform DER
    5. Записать полученный сертификат на токен:

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

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

  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

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

    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
  3. Для принятия изменений выполнить команды:

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

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

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

    Command
    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. Выполнить проверку: 

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

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

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

    Command
    kdestroy
Примечание

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

Command
env KRB5_TRACE=/dev/stdout 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.

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


...