Дерево страниц

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

Ключ

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

Оглавление

Image Added


Информация
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)
  • 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):


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

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


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


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

  1. Для обеспечения работы со смарт-картой Рутокен ЭЦП:
    • libccid;
    • pcscd;
    • libpcsclite1;
    • opensc;
  2. Для обеспечения работы 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.

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

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

    Command
    sudo mkdir /etc/ssl/CA


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

    Command
    cd /etc/ssl/CA


  3. Создать ключ и сертификат 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


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

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


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

    Command
    export REALM=SMARTCARD.ALD
    export CLIENT=kdc

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

    Command
    env | grep -E "REALM|CLIENT"


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

Image Removed

Оглавление

Стенд:

  • Сервер — 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:

...

Image Removed

Блок кода
user ~$ 

$ sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb

Установка и настройка центра сертификации на сервере

Image Removed

Для работы модуля 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
namepkinit_extensions
height150

...

titleсодержимое файла pkinit_extensions:

...

  1. ,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}

...


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

...

  1. Command
    sudo -E openssl x509 -req

...

  1. -in

...

  1. kdc.req

...

  1. -CAkey

...

  1. cakey.pem

...

  1. -CA

...

  1. cacert.pem

...

  1. -out

...

  1. kdc.pem

...

  1. -extfile

...

  1. pkinit_extensions

...

  1. -extensions

...

  1. kdc_cert

...

  1. -CAcreateserial

...

  1. -days

...

  1. 365


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

    Command
    sudo cp

...

  1. kdc.pem

...

  1. kdckey.pem

...

  1. cacert.pem

...

  1. /var/lib/krb5kdc/

...


  1. Создать резервную копию файла /etc/krb5kdc/kdc.conf

...

  1. , после чего отредактировать /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

    Первая запись

...

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

...

  1. Для принятия изменений

...

  1. выполнить команду:

...

  1. Command
    sudo systemctl restart krb5-admin-server

...

  1. krb5-kdc

...


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


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

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


Для проверки работы

...

Рутокен:

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

...

  1. Command
    find

...

  1. /usr/

...

  1. *(lib|lib64) -name librtpkcs11ecp.so

...

  1. Далее используется путь /usr/lib/

...

  1. librtpkcs11ecp.so

...

Для того чтобы определить путь до библиотеки librtpkcs11ecp.so введите команду:
$ find /usr/*(lib|lib64) -name librtpkcs11ecp.so

  1. .

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

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


Image Added



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


Предупреждение
Инициализация

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

...

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

Для инициализации

...

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

...

:

...

Command

...

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


Image Modified

...

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


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

...

использовать команду:

...

Command

...

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


Примечание

--init-pin - команда установки PIN-кода пользователя; 
--login - команда входа в токен; 
--pin 12345678 - задаваемый 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 бит; 
--id

...

$ openssl

33 — устанавливает атрибут CKA_ID ключа. CKA_ID может быть любым; 
--label “test1 key” — устанавливает атрибут CKA_LABEL(имя) ключа. Атрибут может быть любым; 


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

...



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

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


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

...


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

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

...

Command

...

export

...

REALM=

...

SMARTCARD.ALD
export CLIENT=test1 

...


Примечание

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

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

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— указывает, что необходимо записать объект и путь до него;
--type 'cert'— указывает, что тип записываемого объекта - сертификат;
'cert' --label 'test1'— устанавливает атрибут CKA_LABEL(имя) сертификата. Атрибут может быть любым;


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

...


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

...

  1. ;
  2. Скопировать в созданный каталог /etc/krb5/ сертификат

...

  1. УЦ (cacert.pem) c сервера.

...

  1. Настроить Kerberos, для чего в файле /etc/krb5.

...

  1. conf  секцию [libdefaults]

...

  1. дополнить следующими строками:

    Блок кода
    [libdefaults] 
    default_realm = SMARTCARD.ALD
    pkinit_anchors = FILE:/etc/krb5/cacert.pem
    # для аутентификации по токену
    pkinit_identities = PKCS11

...

  1. :/usr/lib/librtpkcs11ecp.so


  2. Выполнить проверку: 

    Command
    $ kinit

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

    Command
    klist

    Для удаления билета:

    Command
    kdestroy


    Примечание

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

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





Image Added


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

Command
login test1


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


Существует возможность указания дополнительных параметров модуля аутентификации pam_krb5.so в файле /etc/pam.d/common-auth в строке относящейся к pam_krb5.so:

Image Added

– try_pkinit — режим при котором осуществляется попытка аутентификации с помощью устройств PKCS-11, в случае провала попытки предоставляется возможность входа с помощью Kerberos пароля пользователя;

– use_pkinit — режим при котором требуется аутентификация с помощью устройств PKCS-11, в случае провала процесс входа прерывается;

– pkinit_prompt — вывод приглашения для подключения устройства PKCS-11 перед выполнением попытки входа.


Примечание

После обновления pam-auth-update, опции pkinit исчезнут. 

Для того, чтобы опция сохранялась принудительно, в конфигурационном файле /usr/share/pam-configs/krb5 в поле Auth-Initial следует дописать одну из опций.

Image Added


Более подробное описание см. в руководстве 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";
    }
}

...