
Немного вступления
Коллеги, рад снова приветствовать вас здесь. Снова разговоры об ALD Pro и наболевшем 2FA, который кто-то уже использует, кто-то хочет, но не знает как и с чего начать.
Данная статья будет формата HowTo и в конце продемонстрирую, что все о чем я говорил работает на практике, как без этого?
О чем данная инструкция?
В инструкции мы настроем компьютеры/ВМ под управлением ALSE ( Astra Linux Special Edition ) для работы со считывателями и далее авторизуемся по сертификатам либо выпущенным с помощью коневого сертификата ALD Pro, который генерируется при установке продукта, или выпущенных вашим УЦ MS AD и которые также будут работать на хосте ALSE в домене ALD Pro для авторизации пользователей.
Покажу что мы получим в конце инструкции, чтобы было интересно)

Сторонние, но не бесполезные инструкции, которые смогут помочь решить возникающие у вас проблемы.
1. Подготовка
На клиенте и сервере должны быть установлены необходимые пакеты и библиотеки из репозиториев ALSE.
Для установки выполнить команду в терминале:
sudo apt install libccid pcscd libpcsclite1 pcsc-tools opensc krb5-pkinit libpam-krb5 libengine-pkcs11-openssl1.1 csp-monitor
Для обеспечения возможности обращения к смарт-карте Рутокен ЭЦП, на клиенте и сервере следует установить стороннюю библиотеку librtpkcs11ecp.so, доступную на официальном сайте производителя токенов Рутокен — компании Актив - Скачать можно тут.
Далее устанавливаем:
dpkg -i librtpkcs11ecp_2.17.1.0-1_amd64.deb
2. Проверка работы РуТокена:
Выполнить команду, указав актуальное расположение библиотеки:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Результат выполнения:
|
3. Для инициализации rutoken используем инструмент 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. Для задания 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-код пользователя;
5. Для генерации ключей на устройстве используем команду:
pkcs11-tool --slot 0 --login --pin 12345678 --keypairgen --key-type rsa:2048 --id 33 --label "2fa_user_key" --module /usr/lib/librtpkcs11ecp.so -keypairgen --key-type rsa:2048 — указывает, что должны быть созданы RSA ключи длиной 2048 бит; --id 33 — устанавливает атрибут CKA_ID ключа. CKA_ID может быть любым; --label “2fa_user_key” — устанавливает атрибут CKA_LABEL(имя) ключа. Атрибут может быть любым;
6. Для генерации запроса на сертификат используем команду:
Для ALSE 1.7.х ( openssl 1.1):
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 req -engine pkcs11 -new -key 0:33 -keyform engine -out user.req
Пример генерации запроса в интерактивном режиме на ALSE 1.7.6:
root@client:/home/astra# 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 user.req engine "pkcs11" set. Enter PKCS#11 token PIN for Rutoken: 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]:Samara Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:user (!Здесь указать логин пользователя из домена ALD Pro) Email Address []:user@ald.pro (!Здесь указать почту пользователя из домена ALD Pro) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: OpenSSL> exit root@client:/home/astra#
Для ALSE 1.8 ( openssl >= 3.0 )
В OpenSSL 3.0 убрали интерактивный режим. Для работы с pkcs11 engine теперь необходимо создать файл конфигурации engine.conf со следующим содержимым:
openssl_conf = openssl_init [openssl_init] engines = engine_section [engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 dynamic_path = /usr/lib/x86_64-linux-gnu/engines-3/pkcs11.so MODULE_PATH = /usr/lib/librtpkcs11ecp.so default_algorithms = ALL #При необходимости использовать pkcs11 engine указывать путь к файлу конфигурации engine.conf, например: OPENSSL_CONF=/path/to/engine.conf openssl req -engine pkcs11 -new -key 0:33 -keyform engine -out user1.req -subj "/C=RU/ST=Moscow/L=Moscow/O=astra/OU=linux/CN=testuser/emailAddress=testuser@mail.com"
7. Копируем запрос на сертификат
Необходимо скопировать созданный файл на шаге 6 — user.req на контроллер домена, где существуют сертификаты /etc/ssl/freeipa/ca.crt и ключ /etc/ssl/freeipa/ca.key
8. Подписываем запроса на выдачу сертификата из шага 7 на контроллере домена
а) Установить переменные окружения:
export REALM=ALD.PRO - имя домена заглавными буквами export CLIENT=user - имя УЗ из домена
б) Для того, чтобы убедиться что переменные указаны верно, использовать команду:
env | grep -E "REALM|CLIENT"
в) Скачать файл 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}
г) Выпустить сертификат пользователя:
sudo -E openssl x509 -CAkey /etc/ssl/freeipa/ca.key -CA /etc/ssl/freeipa/ca.crt -req -in user.req -extensions client_cert -extfile pkinit_extensions -out user.pem -days 365
д) Проверка валидности сертификата
openssl verify -verbose -CAfile /etc/ssl/freeipa/ca.crt user.pem Вывод: user.pem: OK
е) Перекодировать полученный сертификат из формата PEM в формат DER:
sudo openssl x509 -in user.pem -out user.cer -inform PEM -outform DER
9. Добавление сертификата для пользователя домена
У вас в папке откуда вы запускали команды из шага 8, появилось два файла user.pem и user.cer. Необходимо выполнить команду cat user.pem, результатом будет вывод содержимого сертификата в консоль
-----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIUF/S6tA5cfZy73Gk1oyOYlwLkPh0wDQYJKoZIhvcNAQEL BQAwITEfMB0GA1UEAwwWQ0EgU2lnbmluZyBDZXJ0aWZpY2F0ZTAeFw0yNDExMDcx MzUxMDBaFw0yNTExMDcxMzUxMDBaMG4xCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZT YW1hcmExEDAOBgNVBAoMB0FMRC5QUk8xEDAOBgNVBAsMB2FsZC5wcm8xDTALBgNV BAMMBHRlc3QxGzAZBgkqhkiG9w0BCQEWDHRlc3RAYWxkLnBybzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKAnuVaOInBKutTCRVTxMsCf/D3isBo3+++n qIvgoKDCmp+LkFp1LJQQQOYH27pD86rdh7ZfCTupAnKAXKPyuG2/XnC8dZMyfJw+ wTxPFRopr35ufwP4Kwhj2tNaO1YNfgRVm9gGIEo84NGDzjVFu1mEikIRG9vhh/1A g4yDCzvWaIxtIDdK4JzEcbHWoHc6/YGREhsVXVqoVi9FXzaUX+MJHNFMY7VvMtuf DrQkp1nhpACMlidbKvGI0hELZm8FNdlT/BW3ZfU1CN48TTxF8UUNSAMz9F8eqCSN njbpdI4lLoQKrWzpQcl9tC+g9eZQHSrZGTnT9iFjwZa575LxlNUCAwEAAaOBsTCB rjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIDqDASBgNVHSUECzAJBgcrBgEFAgMEMB0G A1UdDgQWBBRBUCUcme5twNyOM7EOGL7NXZwfeDAfBgNVHSMEGDAWgBTJhQuGnyO4 Q/QwuR7hkT98t/hbvzA1BgNVHREELjAsoCoGBisGAQUCAqAgMB6gCRsHQUxELlBS T6ERMA+gAwIBAaEIMAYbBHRlc3QwCQYDVR0SBAIwADANBgkqhkiG9w0BAQsFAAOC AQEAaDFK5gfpNP/q+XQig5TZf4QzpaVvlFE7xPLyeKcaopLU7lJObCeODjt9OgwP LeixwbpaqHC9I/GLaug7ODRgb8u8cV9F4qlxXseAP5odemhjHFTX8bSJmNblVYAd pj4OWNikA6HZCrHSi56HntaZP99T0QlY8d0dGABkmg+f9pgdERSIJIwW6wfxY0ej tiNbXbXR1TeDKgkpra70CrmQrbkYGwBcQc/0K8t0N0SEiEpG42tAyWQ+54x+UlQq 0mv9SmzoUzvidi8DUqsp5+8oYOkLpzKu6wnefcSrz0U9hRyXwYXxI/GJ+fpjbBMd NbEzfTVrIJ1xtKHA3Hvtiq/XnA== -----END CERTIFICATE-----
10. Добавить сертификат в web-панель Freeipa
Скопировать полностью весь ввод ( со строчками -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----), открыть панель управления Freeipa → Пользователи → Выбрать нужного пользователя → справа в колонке будет кнопка сертификаты → нажимаем добавить и вставляем скопированное содержимое сертификата user.pem

Можно выполнить команду
kinit admin ipa user-add-cert user --certificate="$(grep -v ^---- user.pem)"
11. Записать полученный сертификат на токен:
Копируем файл user.cer на машину, где подключен рутокен и выполняем команду:
pkcs11-tool --slot 0 --login --pin 12345678 --write-object user.cer --type 'cert' --label '2fa_user_key' --id 33 --module /usr/lib/librtpkcs11ecp.so --write-object user.cer — указывает, что необходимо записать объект и путь до него; --type 'cert'— указывает, что тип записываемого объекта - сертификат; 'cert' --label '2fa_user_key' — устанавливает атрибут CKA_LABEL(имя) сертификата. Атрибут может быть любым;
12. Изменить файл /etc/krb5.conf
[libdefaults] # для аутентификации по токену для всех доменов. Если необходимо только для одного, указать эту строчку в разделе realm pkinit_identities = PKCS11:/usr/lib/librtpkcs11ecp.so
13. Выполнить проверку:
env KRB5_TRACE=/dev/stdout kinit <имя_пользователя> <имя_пользователя> - user в нашем случае
Вывод команды:
root@client:/home/astra# env KRB5_TRACE=/dev/stdout kinit user [6579] 1730988020.977752: Getting initial credentials for user@ALD.PRO [6579] 1730988020.977754: Sending unauthenticated request [6579] 1730988020.977755: Sending request (172 bytes) to ALD.PRO [6579] 1730988020.977756: Sending DNS URI query for _kerberos.ALD.PRO. [6579] 1730988020.977757: No URI records found [6579] 1730988020.977758: Sending DNS SRV query for _kerberos._udp.ALD.PRO. [6579] 1730988020.977759: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988020.977760: Sending DNS SRV query for _kerberos._tcp.ALD.PRO. [6579] 1730988020.977761: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988020.977762: Resolving hostname dc.ald.pro. [6579] 1730988020.977763: Resolving hostname dc.ald.pro. [6579] 1730988020.977764: Initiating TCP connection to stream 192.168.0.249:88 [6579] 1730988020.977765: Sending TCP request to stream 192.168.0.249:88 [6579] 1730988020.977766: Received answer (280 bytes) from stream 192.168.0.249:88 [6579] 1730988020.977767: Terminating TCP connection to stream 192.168.0.249:88 [6579] 1730988020.977768: Sending DNS URI query for _kerberos.ALD.PRO. [6579] 1730988020.977769: No URI records found [6579] 1730988020.977770: Sending DNS SRV query for _kerberos-master._tcp.ALD.PRO. [6579] 1730988020.977771: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988020.977772: Response was from master KDC [6579] 1730988020.977773: Received error from KDC: -1765328359/Additional pre-authentication required [6579] 1730988020.977776: Preauthenticating using KDC method data [6579] 1730988020.977777: Processing preauth types: PA-PK-AS-REQ (16), PA-FX-FAST (136), PA-ETYPE-INFO2 (19), PA-PKINIT-KX (147), PA-ENC-TIMESTAMP (2), PA_AS_FRESHNESS (150), PA-FX-COOKIE (133) [6579] 1730988020.977778: Selected etype info: etype aes256-cts, salt "!bL$/\N)sks*EUQK", params "" [6579] 1730988020.977779: Received cookie: MIT [6579] 1730988021.308008: Preauth module pkinit (147) (info) returned: 0/Success [6579] 1730988021.308009: PKINIT client received freshness token from KDC [6579] 1730988021.308010: Preauth module pkinit (150) (info) returned: 0/Success Rutoken PIN: [6579] 1730988025.569198: PKINIT loading CA certs and CRLs from FILE [6579] 1730988025.569199: PKINIT loading CA certs and CRLs from FILE [6579] 1730988025.569200: PKINIT client computed kdc-req-body checksum 9/DAF762A26915FD405BFD4EF69C40EFDA0BF07062 [6579] 1730988025.569202: PKINIT client making DH request [6579] 1730988026.152018: Preauth module pkinit (16) (real) returned: 0/Success [6579] 1730988026.152019: Produced preauth for next request: PA-FX-COOKIE (133), PA-PK-AS-REQ (16) [6579] 1730988026.152020: Sending request (2756 bytes) to ALD.PRO [6579] 1730988026.152021: Sending DNS URI query for _kerberos.ALD.PRO. [6579] 1730988026.152022: No URI records found [6579] 1730988026.152023: Sending DNS SRV query for _kerberos._udp.ALD.PRO. [6579] 1730988026.152024: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988026.152025: Sending DNS SRV query for _kerberos._tcp.ALD.PRO. [6579] 1730988026.152026: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988026.152027: Resolving hostname dc.ald.pro. [6579] 1730988026.152028: Resolving hostname dc.ald.pro. [6579] 1730988026.152029: Initiating TCP connection to stream 192.168.0.249:88 [6579] 1730988026.152030: Sending TCP request to stream 192.168.0.249:88 [6579] 1730988026.152031: Received answer (3212 bytes) from stream 192.168.0.249:88 [6579] 1730988026.152032: Terminating TCP connection to stream 192.168.0.249:88 [6579] 1730988026.152033: Sending DNS URI query for _kerberos.ALD.PRO. [6579] 1730988026.152034: No URI records found [6579] 1730988026.152035: Sending DNS SRV query for _kerberos-master._tcp.ALD.PRO. [6579] 1730988026.152036: SRV answer: 0 100 88 "dc.ald.pro." [6579] 1730988026.152037: Response was from master KDC [6579] 1730988026.152038: Processing preauth types: PA-PK-AS-REP (17) [6579] 1730988026.152039: PKINIT client verified DH reply [6579] 1730988026.152040: PKINIT client found id-pkinit-san in KDC cert: krbtgt/ALD.PRO@ALD.PRO [6579] 1730988026.152041: PKINIT client matched KDC principal krbtgt/ALD.PRO@ALD.PRO against id-pkinit-san; no EKU check required [6579] 1730988026.152042: PKINIT client used KDF 2B06010502030602 to compute reply key aes256-cts/F33D [6579] 1730988026.152043: Preauth module pkinit (17) (real) returned: 0/Success [6579] 1730988026.152044: Produced preauth for next request: (empty) [6579] 1730988026.152045: AS key determined by preauth: aes256-cts/F33D [6579] 1730988026.152046: Decrypted AS reply; session key is: aes256-cts/1581 [6579] 1730988026.152047: FAST negotiation: available [6579] 1730988026.152048: Initializing KEYRING:persistent:0:0 with default princ user@ALD.PRO [6579] 1730988026.152049: Storing user@ALD.PRO -> krbtgt/ALD.PRO@ALD.PRO in KEYRING:persistent:0:0 [6579] 1730988026.152050: Storing config in KEYRING:persistent:0:0 for krbtgt/ALD.PRO@ALD.PRO: fast_avail: yes [6579] 1730988026.152051: Storing user@ALD.PRO -> krb5_ccache_conf_data/fast_avail/krbtgt\/ALD.PRO\@ALD.PRO@X-CACHECONF: in KEYRING:persistent:0:0 [6579] 1730988026.152052: Storing config in KEYRING:persistent:0:0 for krbtgt/ALD.PRO@ALD.PRO: pa_type: 16 [6579] 1730988026.152053: Storing user@ALD.PRO -> krb5_ccache_conf_data/pa_type/krbtgt\/ALD.PRO\@ALD.PRO@X-CACHECONF: in KEYRING:persistent:0:0 [6579] 1730988026.152054: Storing config in KEYRING:persistent:0:0 for krbtgt/ALD.PRO@ALD.PRO: pa_config_data: {"X509_user_identity":"PKCS11:module_name=/usr/lib/librtpkcs11ecp.so"} [6579] 1730988026.152055: Storing user@ALD.PRO -> krb5_ccache_conf_data/pa_config_data/krbtgt\/ALD.PRO\@ALD.PRO@X-CACHECONF: in KEYRING:persistent:0:0
14. Настройка ALSE для работы с пин от токена
Выполняем команды на клиенте домена, где будет происходить авторизация
mkdir -p /etc/pkcs11/modules echo -e "module: /usr/lib/librtpkcs11ecp.so" | tee /etc/pkcs11/modules/a-rutoken.module echo -e "[global]\npkcs11_module = librtpkcs11ecp.so" | tee /etc/security/pam_csp.conf systemctl restart csp-monitor
Изменяем стандартную тему, чтобы корректно работал monitor-csp и ввод пин-кода от сертификата:
sed -i.bak -e "s/^PluginsLogin=modern/PluginsLogin=auto/" -e "s/^Theme=\/usr\/share\/fly-dm\/themes\/fly-modern/Theme=\/usr\/share\/fly-dm\/themes\/fly-flat/" /etc/X11/fly-dm/fly-dmrc
Добавив use_pkinit в строчку auth [success=6 default=ignore] pam_krb5.so. Привести файл /etc/pam.d/common-auth к виду:
# here are the per-package modules (the "Primary" block) auth [success=6 default=ignore] pam_krb5.so minimum_uid=2500 use_pkinit auth [success=ignore default=2] pam_localuser.so auth [success=1 default=ignore] pam_succeed_if.so quiet user ingroup astra-admin auth [success=ignore default=die] pam_tally.so per_user deny=8 auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass auth [success=1 default=ignore] pam_sss.so use_first_pass # here's the fallback if no module succeeds auth requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around auth required pam_permit.so # and here are more per-package modules (the "Additional" block) # end of pam-auth-update config
Закомментировать строчку -auth optional pam_kwallet5.so,в файле /etc/pam.d/fly-dm, чтобы не появлялось повторное окно запроса пин, для разблокировки не используемых кошельков хранения паролей.
#%PAM-1.0 auth required pam_parsec_mac.so auth requisite pam_nologin.so auth required pam_env.so readenv=1 auth required pam_env.so readenv=1 envfile=/etc/default/locale @include common-auth -auth optional pam_gnome_keyring.so #-auth optional pam_kwallet5.so session required pam_parsec_mac.so unshare_root_only session required pam_limits.so session required pam_loginuid.so @include common-account account required pam_parsec_mac.so labelselect=appset @include common-session session required pam_parsec_cap.so session required pam_parsec_aud.so session required pam_parsec_mac.so -session optional pam_gnome_keyring.so auto_start -session optional pam_kwallet5.so auto_start @include common-password
Результат:
На данном этапе у нас уже работает вход по смарт-карте для домена ALD Pro, пользователем из домена ALD Pro, по самоподписанному сертификату.
16. Настройка входа по токену пользователя из MSAD на клиент в домене ALD Pro ( в 2.3.0 и в 2.4.0 )
16.1 Установить доверительные отношение с доменом MS AD ( в примере msad.test)
16.2 Настройка файл /etc/krb5.conf на КД ALD Pro
а) Добавить раздел в realms информацию о домене MS AD и настройки для домена ( !ВАЖНО маленькими буквами);
б) domain_realm добавлена информация о домене MS AD;
в) pkinit_anchors = FILE:/etc/krb5/DOMAIN_CERT.pem — сертификат ПК ms ad с установленным CA на нем же.( если ca установлен отдельно, то необходимо будет добавить путь и до него)
includedir /etc/krb5.conf.d/ includedir /var/lib/sss/pubconf/krb5.include.d/ [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = ALD2.PRO dns_lookup_realm = false dns_lookup_kdc = true rdns = false ticket_lifetime = 24h forwardable = true udp_preference_limit = 0 default_ccache_name = KEYRING:persistent:%{uid} [realms] ALD2.PRO = { kdc = dc2.ald2.pro:88 master_kdc = dc2.ald2.pro:88 admin_server = dc2.ald2.pro:749 default_domain = ald2.pro pkinit_anchors = FILE:/var/lib/ipa-client/pki/kdc-ca-bundle.pem pkinit_pool = FILE:/var/lib/ipa-client/pki/ca-bundle.pem } #важно указать именно маленькими буквами #начало добавления msad.test = { default_realm = MSAD.TEST pkinit_identities = PKCS11:/usr/lib/librtpkcs11ecp.so kdc = MSAD.TEST pkinit_eku_checking = kpServerAuth pkinit_kdc_hostname = dc1.MSAD.TEST pkinit_anchors = FILE:/etc/krb5/DOMAIN_CERT.pem } #конец добавления [domain_realm] .ald2.pro = ALD2.PRO ald2.pro = ALD2.PRO .msad.test = MSAD.TEST #добавлено msad.test = MSAD.TEST #добавлено dc2.ald2.pro = ALD2.PRO [dbmodules] ALD2.PRO = { db_library = ipadb.so } [plugins] certauth = { module = ipakdb:kdb/ipadb.so enable_only = ipakdb }
Общий итог данной статьи-инструкции
Мы смогли настроить работу сертификатов в ALSE;
Смогли отслеживать подключение смарт-карты к компьютеру, и автоматически запрашивать пин от хранилища с сертификатом;
Смогли авторизовать пользователей по сертификатам из MS AD. Таким образом, на этапе импортозамещения, вы сможете продолжить пользоваться своими картами и сертификатами. но уже на хостах в домене ALD Pro
Обещанные примеры работы:
Видео не смог сократить до gif, поэтому прикладываю так. Тесты делал на 2.3.0 и 2.4.0.
Инструкция написана в начале года, и только сейчас дошли руки поделиться
Небольшой update от 08.10.2025
При необходимости работы по ssh и авторизовываться по смарт-карте, необходимо:
1.Проверить включена ли возможность авторизации по ключу. Открыть файл /etc/ssh/sshd_config и проверить наличие строк. При необходимости перезагрузить службу sshd
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
2.Подключить токен и считыватель, достать открытую часть ключа:
ssh-keygen -D /usr/lib/librtpkcs11ecp.so ssh-rsa AAAAB3NzaC1yc2EA...............................
3.Положить открытую часть ключа для пользователя на удаленную машину, куда вы будете подключиться по ssh
4. Подключиться по ssh используя команду и ввести пин-код от смарт-карты с сертификатом
ssh -I /usr/lib/librtpkcs11ecp.so user@server Enter PIN for 'AstraLinux': user@server:~$
