Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Здравствуйте.
Стоит задача организовать сетевую авторизацию пользователей заведённых через FreeIPA на компьютерах под ubuntu 24.04 с использованием Рутокен.

Локальная авторизация с исользованием pam_p11_opensc работает. Но это не то, что нужно.

Получать тикеты kerberos с использованием рутокен тоже получается.

Но как сделать именно сетевую авторизацию непонятно. Поскажите пожалуйста, куда копать.


/etc/sssd/sssd.conf

[domain/int.vlant.ru]

id_provider = ipa
dns_discovery_domain = int.vlant.ru
ipa_server = _srv_, ipa-backup.int.vlant.ru
ipa_domain = int.vlant.ru
ipa_hostname = arashi.vlant.ru
auth_provider = ipa
chpass_provider = ipa
access_provider = ipa
cache_credentials = True
ldap_tls_cacert = /etc/ipa/ca.crt
krb5_store_password_if_offline = True
krb5_auth_timeout = 60

[sssd]
services = nss, pam, ssh, sudo

domains = int.vlant.ru
[nss]
homedir_substring = /home

[pam]
pam_cert_auth = True
pam_cert_db_path = /etc/ipa/ca.crt
p11_child_timeout = 60
pam_p11_allowed_services = +xdg-screensaver, +xscreensaver, +lightdm, +lightdm-greeter, +lightdm-autologin, +kde, +kscreensaver, +sddm, +sddm-greeter, +sddm-autologin
[sudo]

[autofs]

[ssh]

[pac]

[ifp]

[session_recording]

/etc/krb5.conf

#File modified by ipa-client-install

includedir /etc/krb5.conf.d/
[libdefaults]
  pkinit_identities = PKCS11:librtpkcs11ecp.so
  default_realm = INT.VLANT.RU
  dns_lookup_realm = true
  rdns = false
  dns_canonicalize_hostname = false
  dns_lookup_kdc = true
  ticket_lifetime = 24h
  forwardable = true
  udp_preference_limit = 0
  default_ccache_name = KEYRING:persistent:%{uid}
  

[realms]
  INT.VLANT.RU = {
    pkinit_anchors = FILE:/var/lib/ipa-client/pki/kdc-ca-bundle.pem
    pkinit_pool = FILE:/var/lib/ipa-client/pki/ca-bundle.pem
    pkinit_identities = PKCS11:librtpkcs11ecp.so
    pkinit_cert_match = <ISSUER>O=INT.VLANT.RU,CN=Certificate Authority
  }


[domain_realm]
  .int.vlant.ru = INT.VLANT.RU
  int.vlant.ru = INT.VLANT.RU
  arashi.vlant.ru = INT.VLANT.RU
  .vlant.ru = INT.VLANT.RU
  vlant.ru = INT.VLANT.RU

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

arashi, добрый день.
То есть при запросе kerberos тикета запрашивается пин-код токена?
А при попытке логина есть ошибка? или просто не запрашивается пин-код? Сервис pcscd стартует автоматически после запуска ОС?
Что в системном журнале или в журнале сервиса sssd?

(2025-01-28 09:52:50 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Здравствуйте.

При запросе kerberos запрашивается пин-код токена. Если пин-код верен и запрошен был тикет того пользователя, чей сертификат записан на токен, то тикет выдаётся.
Если пытаться получить тикет другого пользователя, или ошибиться в пине, то спрашивает пароль. Что ожидаемо.
А вот если на токен записаны сертификаты нескольких пользователей, в том числе и нужного, то при вводе правильного пина будет ошибка авторизации. Удаётся получать тикеты только в том случае если на токене ровно один нужный сертификат.

При попытке зайти от пользователя пин-код не запрашивается.

С свервисом pcscd что-то не то
Сообщает Referenced but unset environment variable evaluates to an empty string: PCSCD_ARGS

systemctl status pcscd

pcscd.service - PC/SC Smart Card Daemon
     Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; preset: enabled)
     Active: inactive (dead) since Tue 2025-01-28 09:14:11 MSK; 6s ago
   Duration: 1min 1.400s
TriggeredBy: ● pcscd.socket
       Docs: man:pcscd(8)
    Process: 53931 ExecStart=/usr/sbin/pcscd --foreground --auto-exit $PCSCD_ARGS (code=exited, status=0/SUCCESS)
   Main PID: 53931 (code=exited, status=0/SUCCESS)
        CPU: 60ms

Jan 28 09:13:09 arashi.vlant.ru systemd[1]: Started pcscd.service - PC/SC Smart Card Daemon.
Jan 28 09:13:09 arashi.vlant.ru (pcscd)[53931]: pcscd.service: Referenced but unset environment variable evaluates to an empty string: PCSCD_ARGS
Jan 28 09:14:11 arashi.vlant.ru systemd[1]: pcscd.service: Deactivated successfully.

Был выключен, включил - появились запросы на pin код. Но

su test99
Smart card found.
Welcome Rutoken ECP <no label>!
Smart card PIN: 
verifying certificate
ERROR:pam_pkcs11.c:627: no valid certificate which meets all requirements found
Error 2336: No matching certificate found
Smartcard authentication cancelled
No authorized keys on token
su: Authentication failure



Лог sssd за сегодняшний день: рестартовал сервис, несколько раз пробовал подключиться другим пользователем. Но этого не отображено.

Jan 28 09:12:52 arashi.vlant.ru systemd[1]: Stopping sssd.service - System Security Services Daemon...
Jan 28 09:12:52 arashi.vlant.ru sssd_ssh[1104]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru sssd_sudo[1105]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru sssd_pam[1103]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru sssd_pac[1106]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru sssd_be[1053]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru sssd_nss[1102]: Shutting down (status = 0)
Jan 28 09:12:52 arashi.vlant.ru systemd[1]: sssd.service: Deactivated successfully.
Jan 28 09:12:52 arashi.vlant.ru systemd[1]: Stopped sssd.service - System Security Services Daemon.
Jan 28 09:12:52 arashi.vlant.ru systemd[1]: sssd.service: Consumed 3.738s CPU time, 66.8M memory peak, 0B memory swap peak.
Jan 28 09:12:52 arashi.vlant.ru systemd[1]: Starting sssd.service - System Security Services Daemon...
Jan 28 09:12:52 arashi.vlant.ru sssd[53888]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_be[53889]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_nss[53890]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_ssh[53892]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_sudo[53893]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_pam[53891]: Starting up
Jan 28 09:12:52 arashi.vlant.ru sssd_pac[53894]: Starting up
Jan 28 09:12:52 arashi.vlant.ru systemd[1]: Started sssd.service - System Security Services Daemon.

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Установлен ли пакет libpam-krb5?
Что выдает команда KRB5_TRACE=/dev/stdout kinit -X X509_user_identity='PKCS11:/usr/lib/librtpkcs11ecp.so' имя пользователя ?
Добавлена библиотека rtpkcs11ecp в базу данных nssdb командой modutil -dbdir "/etc/ipa/nssdb" -add "My PKCS11" -libfile /usr/lib/librtpkcs11ecp.so

(2025-01-28 12:02:27 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

libpam-krb5 не был установлен. Установил.


# modutil -dbdir "/etc/ipa/nssdb" -add "My PKCS11" -libfile /usr/lib/librtpkcs11ecp.so

WARNING: Performing this operation while the browser is running could cause
corruption of your security databases. If the browser is currently running,
you should exit browser before continuing this operation. Type 
'q <enter>' to abort, or <enter> to continue: 

ERROR: Failed to add module "My PKCS11". Probable cause : "Failure to load dynamic library".
# ls -la /usr/lib/librtpkcs11ecp.so
lrwxrwxrwx 1 root root 47 Jan 10 15:02 /usr/lib/librtpkcs11ecp.so -> /opt/aktivco/rutokenecp/amd64/librtpkcs11ecp.so
# ls -la /opt/aktivco/rutokenecp/amd64/librtpkcs11ecp.so
-r--r--r-- 1 root root 6010332 Jan 27 18:44 /opt/aktivco/rutokenecp/amd64/librtpkcs11ecp.so

Да, модуль уже был добавлен, поэтому при попытке добавить его ещё раз возникала ошибка.

# modutil -dbdir "/etc/ipa/nssdb" -delete "My PKCS11"
Module "My PKCS11" deleted from database.

#modutil -dbdir "/etc/ipa/nssdb" -add "My PKCS11" -libfile /usr/lib/librtpkcs11ecp.so
WARNING: Performing this operation while the browser is running could cause
corruption of your security databases. If the browser is currently running,
you should exit browser before continuing this operation. Type 
'q <enter>' to abort, or <enter> to continue: 

Module "My PKCS11" added to database.

Вот активные модули

# modutil -dbdir "/etc/ipa/nssdb" -list

Listing of PKCS #11 Modules
-----------------------------------------------------------
  1. NSS Internal PKCS #11 Module
       uri: pkcs11:library-manufacturer=Mozilla%20Foundation;library-description=NSS%20Internal%20Crypto%20Services;library-version=3.98
     slots: 2 slots attached
    status: loaded

     slot: NSS Internal Cryptographic Services
    token: NSS Generic Crypto Services
      uri: pkcs11:token=NSS%20Generic%20Crypto%20Services;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203

     slot: NSS User Private Key and Certificate Services
    token: NSS Certificate DB
      uri: pkcs11:token=NSS%20Certificate%20DB;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203

  2. My PKCS11
    library name: /usr/lib/librtpkcs11ecp.so
       uri: pkcs11:library-manufacturer=Aktiv%20Co.;library-description=Rutoken%20ECP%20PKCS%20%2311%20library;library-version=2.17
     slots: 15 slots attached
    status: loaded

     slot: Aktiv Rutoken ECP 00 00
    token: Rutoken ECP <no label>
      uri: pkcs11:token=Rutoken%20ECP%20%3Cno%20label%3E;manufacturer=Aktiv%20Co.;serial=45424088;model=Rutoken%20ECP

     slot: 
    token: 
      uri: pkcs11:

     slot: 
    token: 
      uri: pkcs11:

# KRB5_TRACE=/dev/stdout kinit -X X509_user_identity='PKCS11:/usr/lib/librtpkcs11ecp.so' test99

[65712] 1738051045.463592: Matching test99@INT.VLANT.RU in collection with result: -1765328243/Can't find client principal test99@INT.VLANT.RU in cache collection
[65712] 1738051045.463593: Getting initial credentials for test99@INT.VLANT.RU
[65712] 1738051045.463595: Sending unauthenticated request
[65712] 1738051045.463596: Sending request (186 bytes) to INT.VLANT.RU
[65712] 1738051045.463597: Initiating TCP connection to stream 192.168.22.253:88
[65712] 1738051045.463598: Sending TCP request to stream 192.168.22.253:88
[65712] 1738051045.463599: Received answer (252 bytes) from stream 192.168.22.253:88
[65712] 1738051045.463600: Terminating TCP connection to stream 192.168.22.253:88
[65712] 1738051045.463601: Response was from primary KDC
[65712] 1738051045.463602: Received error from KDC: -1765328359/Additional pre-authentication required
[65712] 1738051045.463605: Preauthenticating using KDC method data
[65712] 1738051045.463606: Processing preauth types: PA-PK-AS-REQ (16), PA-FX-FAST (136), PA-PKINIT-KX (147), PA_AS_FRESHNESS (150), PA-FX-COOKIE (133)
[65712] 1738051045.463607: Received cookie: MIT
[65712] 1738051045.463608: PKINIT loading identity PKCS11:/usr/lib/librtpkcs11ecp.so
[65712] 1738051045.463609: PKINIT opening PKCS#11 module "/usr/lib/librtpkcs11ecp.so"
[65712] 1738051045.463610: PKINIT PKCS#11 slotid 0 token Rutoken ECP <no label>
[65712] 1738051045.463611: Preauth module pkinit (147) (info) returned: 0/Success
[65712] 1738051045.463612: PKINIT client received freshness token from KDC
[65712] 1738051045.463613: Preauth module pkinit (150) (info) returned: 0/Success
[65712] 1738051045.463614: PKINIT opening PKCS#11 module "/usr/lib/librtpkcs11ecp.so"
[65712] 1738051045.463615: PKINIT PKCS#11 slotid 0 token Rutoken ECP <no label>
Rutoken ECP <no label>           PIN:  принимает правильный пин кода
[65712] 1738051054.882529: PKINIT client matching rule '<ISSUER>O=INT.VLANT.RU,CN=Certificate Authority' against certificates
[65712] 1738051054.882530: PKINIT matched ISSUER rule 'O=INT.VLANT.RU,CN=Certificate Authority' with value 'O=INT.VLANT.RU,CN=Certificate Authority' in cert #1
[65712] 1738051054.882531: PKINIT client checked 1 certs, found 1 matches
[65712] 1738051054.882532: PKINIT loading CA certs and CRLs from FILE /var/lib/ipa-client/pki/kdc-ca-bundle.pem
[65712] 1738051054.882533: PKINIT loading CA certs and CRLs from FILE /var/lib/ipa-client/pki/ca-bundle.pem
[65712] 1738051054.882534: PKINIT client computed kdc-req-body checksum 14/1D6F9D7296CE05F9825C0613E5C4CBAFE32BA7E4
[65712] 1738051054.882536: PKINIT client making DH request
[65712] 1738051054.882537: PKINIT chain cert #0: /O=INT.VLANT.RU/CN=test99
[65712] 1738051054.882538: Preauth module pkinit (16) (real) returned: 0/Success
[65712] 1738051054.882539: Produced preauth for next request: PA-FX-COOKIE (133), PA-PK-AS-REQ (16)
[65712] 1738051054.882540: Sending request (3036 bytes) to INT.VLANT.RU
[65712] 1738051054.882541: Initiating TCP connection to stream 192.168.22.253:88
[65712] 1738051054.882542: Sending TCP request to stream 192.168.22.253:88
[65712] 1738051054.882543: Received answer (3827 bytes) from stream 192.168.22.253:88
[65712] 1738051054.882544: Terminating TCP connection to stream 192.168.22.253:88
[65712] 1738051054.882545: Response was from primary KDC
[65712] 1738051054.882546: Processing preauth types: PA-PK-AS-REP (17)
[65712] 1738051054.882547: PKINIT client verified DH reply
[65712] 1738051054.882548: PKINIT client found 3 SANs (1 princs, 0 UPNs, 0 DNS names) in certificate /O=INT.VLANT.RU/CN=ipa-backup.int.vlant.ru
[65712] 1738051054.882549: PKINIT client found id-pkinit-san in KDC cert: krbtgt/INT.VLANT.RU@INT.VLANT.RU
[65712] 1738051054.882550: PKINIT client matched KDC principal krbtgt/INT.VLANT.RU@INT.VLANT.RU against id-pkinit-san; no EKU check required
[65712] 1738051054.882551: PKINIT client used KDF 2B06010502030602 to compute reply key aes256-cts/9E08
[65712] 1738051054.882552: Preauth module pkinit (17) (real) returned: 0/Success
[65712] 1738051054.882553: Produced preauth for next request: (empty)
[65712] 1738051054.882554: Salt derived from principal: INT.VLANT.RUtest99
[65712] 1738051054.882555: AS key determined by preauth: aes256-cts/9E08
[65712] 1738051054.882556: Decrypted AS reply; session key is: aes256-cts/3929
[65712] 1738051054.882557: FAST negotiation: available
[65712] 1738051054.882558: Resolving unique ccache of type MEMORY
[65712] 1738051054.882559: Initializing MEMORY:ZJiTwIS with default princ test99@INT.VLANT.RU
[65712] 1738051054.882560: Storing config in MEMORY:ZJiTwIS for krbtgt/INT.VLANT.RU@INT.VLANT.RU: fast_avail: yes
[65712] 1738051054.882561: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/fast_avail/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in MEMORY:ZJiTwIS
[65712] 1738051054.882562: Storing config in MEMORY:ZJiTwIS for krbtgt/INT.VLANT.RU@INT.VLANT.RU: pa_type: 16
[65712] 1738051054.882563: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/pa_type/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in MEMORY:ZJiTwIS
[65712] 1738051054.882564: Storing config in MEMORY:ZJiTwIS for krbtgt/INT.VLANT.RU@INT.VLANT.RU: pa_config_data: {"X509_user_identity":"PKCS11:module_name=/usr/lib/librtpkcs11ecp.so"}
[65712] 1738051054.882565: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/pa_config_data/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in MEMORY:ZJiTwIS
[65712] 1738051054.882566: Storing test99@INT.VLANT.RU -> krbtgt/INT.VLANT.RU@INT.VLANT.RU in MEMORY:ZJiTwIS
[65712] 1738051054.882567: Moving ccache MEMORY:ZJiTwIS to KEYRING:persistent:0:0
[65712] 1738051054.882568: Initializing KEYRING:persistent:0:0 with default princ test99@INT.VLANT.RU
[65712] 1738051054.882569: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/fast_avail/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in KEYRING:persistent:0:0
[65712] 1738051054.882570: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/pa_type/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in KEYRING:persistent:0:0
[65712] 1738051054.882571: Storing test99@INT.VLANT.RU -> krb5_ccache_conf_data/pa_config_data/krbtgt\/INT.VLANT.RU\@INT.VLANT.RU@X-CACHECONF: in KEYRING:persistent:0:0
[65712] 1738051054.882572: Storing test99@INT.VLANT.RU -> krbtgt/INT.VLANT.RU@INT.VLANT.RU in KEYRING:persistent:0:0
[65712] 1738051054.882573: Destroying ccache MEMORY:ZJiTwIS
root@arashi:/home/arashi# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: test99@INT.VLANT.RU

Valid starting       Expires              Service principal
01/28/2025 10:57:34  01/29/2025 10:29:24  krbtgt/INT.VLANT.RU@INT.VLANT.RU

(2025-01-28 13:05:00 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

sudo certutil -L -d /etc/pki/nssdb -h all

выдаёт

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Enter Password or Pin for "Rutoken ECP <no label>":
IPA CA                                                       CT,C,C
Rutoken ECP <no label>:testov                                u,u,u

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

Available slots:
Slot 0 (0x0): Aktiv Rutoken ECP 00 00
  token label        : Rutoken ECP <no label>
  token manufacturer : Aktiv Co.
  token model        : Rutoken ECP
  token flags        : login required, rng, SO PIN count low, SO PIN to be changed, token initialized, PIN initialized, user PIN to be changed
  hardware version   : 67.4
  firmware version   : 32.2
  serial num         : 45424088
  pin min/max        : 6/32
Slot 1 (0x1): 
  (empty)
Slot 2 (0x2): 
  (empty)
Slot 3 (0x3): 
  (empty)
Slot 4 (0x4): 
  (empty)
Slot 5 (0x5): 
  (empty)
Slot 6 (0x6): 
  (empty)
Slot 7 (0x7): 
  (empty)
Slot 8 (0x8): 
  (empty)
Slot 9 (0x9): 
  (empty)
Slot 10 (0xa): 
  (empty)
Slot 11 (0xb): 
  (empty)
Slot 12 (0xc): 
  (empty)
Slot 13 (0xd): 
  (empty)
Slot 14 (0xe): 
  (empty)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

А как вы создаете сертификат на токене?
У вас CN сертификата не совпадает с именем пользователя специально?

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Создаю вручную.
Нет, специально так не делаю.

openssl req -new -newkey rsa:2048 -days 365 -nodes -keyout private.key -out cert.csr -subj '/CN=test1'
kinit admin
ipa user_add test1

ipa cert-request cert.csr --principal=test1 --ca ipa --profile-id caIPAserviceCert --certificate-out cert.pem
openssl rsa -in ./private.key -outform DER -out privatekey.der
openssl pkey -inform DER -in privatekey.der -outform DER -pubout -out pubkey.der
openssl x509 -outform DER -in ./cert.pem -out client_cert.der

Записываем секретный ключ и сертификат на токен
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./privatekey.der --type privkey --id 1 --label test
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./client_cert.der --type cert --id 1 --label test
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./pubkey.der --type pubkey --id 1 --label test

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

arashi, по этому сценарию все должно работать.

(2025-01-28 21:23:05 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Не понимаю. Памтестер сообщает, что аутентификация проходит.

$pamtester -v gdm-smartcard test1 authenticate
pamtester: invoking pam_start(gdm-smartcard, test1, ...)
pamtester: performing operation - authenticate
PIN for Rutoken ECP <no label>: 
pamtester: successfully authenticated

Но в то же самое время переключиться на пользователя используя смарт-карту я не могу

$ su test1
No authorized keys on token
Password: 

auth.log при этом

2025-01-28T20:48:11.688195+03:00 arashi su: pam_p11(su:auth): Searching Rutoken ECP <no label> for keys
2025-01-28T20:48:11.792767+03:00 arashi su: pam_p11(su:auth): No authorized key found

Точно такое же сообщение и точно такой же auth.log я получаю, если запускаю pamtester с недоступным для него сервером IPA

pamtester: invoking pam_start(gdm-smartcard, test1, ...)
pamtester: performing operation - authenticate
No authorized keys on token
Password:

Если сертификат с карты разместить у пользователя в ~/.eid/authorized_certificates то всё нормально, su test1 спрашивает PIN-код и пользователь авторизауется.

ipa user-show test1
показывает, что сертификат на карте совпадает с сертификатом пользователя на сервере ipa.

Может ли это говорить о том, что для pam_p11 не доступен сертификат?
pam не может прочитать /etc/ipa/nssd ?

Возможность её использовать была добавлена

sudo modutil -dbdir "/etc/ipa/nssdb" -add "My PKCS11" -libfile /usr/lib/librtpkcs11ecp.so

Модули видны

modutil -dbdir "/etc/ipa/nssdb" -list
modutil -dbdir "/etc/ipa/nssdb" -list

Listing of PKCS #11 Modules
-----------------------------------------------------------
  1. NSS Internal PKCS #11 Module
       uri: pkcs11:library-manufacturer=Mozilla%20Foundation;library-description=NSS%20Internal%20Crypto%20Services;library-version=3.98
     slots: 2 slots attached
    status: loaded

     slot: NSS Internal Cryptographic Services
    token: NSS Generic Crypto Services
      uri: pkcs11:token=NSS%20Generic%20Crypto%20Services;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203

     slot: NSS User Private Key and Certificate Services
    token: NSS Certificate DB
      uri: pkcs11:token=NSS%20Certificate%20DB;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203

  2. My PKCS11
    library name: /usr/lib/librtpkcs11ecp.so
       uri: pkcs11:library-manufacturer=Aktiv%20Co.;library-description=Rutoken%20ECP%20PKCS%20%2311%20library;library-version=2.17
     slots: 15 slots attached
    status: loaded

     slot: Aktiv Rutoken ECP 00 00
    token: Rutoken ECP <no label>
      uri: pkcs11:token=Rutoken%20ECP%20%3Cno%20label%3E;manufacturer=Aktiv%20Co.;serial=45424088;model=Rutoken%20ECP

     slot: 
    token: 
      uri: pkcs11:

И с авторизацией по PIN-коду я могу увидеть сертификат

certutil -L -d /etc/ipa/nssdb -h all

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Enter Password or Pin for "Rutoken ECP <no label>":
INT.VLANT.RU IPA CA                                          CT,C,C
Rutoken ECP <no label>:testov

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

В сценарии доменной аутентификации не должен использоваться pam_p11. Этот модуль используется для локальной аутентификации. Что и подтверждается вами, когда вы добавили сертификат в ~/.eid/authorized_certificates
Для доменной аутентификации используется  pam_sss.

Проверьте, что у вас правильный сертификат сервера, совпадающий с путем pam_cert_db_path = /etc/ipa/ca.crt

(2025-01-29 15:36:13 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Спасибо за ваш ответ. Буду очень признателен, если вы продолжите отвечать.

Да, с путём к сертификату всё верно.

[domain/int.vlant.ru]

id_provider = ipa
dns_discovery_domain = int.vlant.ru
ipa_server = _srv_, ipa-backup.int.vlant.ru
ipa_domain = int.vlant.ru
ipa_hostname = arashi.vlant.ru
auth_provider = ipa
chpass_provider = ipa
access_provider = ipa
cache_credentials = True
ldap_tls_cacert = /etc/ipa/ca.crt
krb5_store_password_if_offline = True
krb5_auth_timeout = 60
debug_level=10

[sssd]
services = nss, pam, ssh, sudo
domains = int.vlant.ru
debug_level=10
[nss]
homedir_substring = /home

[pam]
pam_cert_auth = True
pam_cert_db_path = /etc/ipa/ca.crt
#pam_p11_allowed_services = +xdg-screensaver
pam_verbosity = 10
debug_level=10
[sudo]

[autofs]

[ssh]

[pac]

[ifp]

[session_recording]

Сама db тоже работает

/usr/libexec/sssd/p11_child --pre --ca_db=/etc/ipa/ca.crt
0
Rutoken ECP <no label>
/usr/lib/librtpkcs11ecp.so
02
test2
:сертификат пользователя:

sudo pam-auth-update
показывает подключенные модули (pam_p11 я отключил)

PAM profiles to enable:                                                                                                                                                                 │ 
 │                                                                                                                                                                                         │ 
 │  [*] Pwquality password strength checking                                                                                                                                               │ 
 │  [ ] Pam_pkcs11                                                                                                                                                                         │ 
 │  [ ] Pam_p11                                                                                                                                                                            │ 
 │  [*] Kerberos authentication                                                                                                                                                            │ 
 │  [ ] SSS required smart card authentication                                                                                                                                             │ 
 │  [ ] SSS optional smart card authentication                                                                                                                                             │ 
 │  [ ] Fingerprint authentication                                                                                                                                                         │ 
 │  [*] Unix authentication                                                                                                                                                                │ 
 │  [*] SSS authentication                                                                                                                                                                 │ 
 │  [*] Register user sessions in the systemd control group hierarchy                                                                                                                      │ 
 │  [*] Create home directory on login                                                                                                                                                     │ 
 │  [*] GNOME Keyring Daemon - Login keyring management                                                                                                                                    │ 
 │  [*] Inheritable Capabilities Management                             

В такой конфигурации su не просит ввести пин-код
Включение SSS required/optional smart card authentication  также ни к чему не приводит
Возможно я не понимаю, как подключить pam_sss

Я включил Pam_pkcs11
И здесь происходит странное.

su test2 начинает спрашивать pin, но при его правильном вводе выдаёт ошибку
ERROR:pam_pkcs11.c:627: no valid certificate which meets all requirements found

Затем второй раз, уже не сообщая Welcome Rutoken ECP <no label>!,  спрашивает PIN код,
И вот на второй раз при правильном вводе авторизует пользователя.

$ su test2
Smart card found.
Welcome Rutoken ECP <no label>!
Smart card PIN: 
verifying certificate
ERROR:pam_pkcs11.c:627: no valid certificate which meets all requirements found
Error 2336: No matching certificate found
Smartcard authentication cancelled
Rutoken ECP <no label>           PIN: 
$ bash 

Причём первый ввод совсем не важен - можно ввести неправильный код
я получу ошибку ERROR:pam_pkcs11.c:503: open_pkcs11_login() failed: C_Login() failed: 160
а затем смогу уже ввести правильный код

$ su test2
Smart card found.
Welcome Rutoken ECP <no label>!
Smart card PIN:
ERROR:pam_pkcs11.c:503: open_pkcs11_login() failed: C_Login() failed: 160
Error 2320: Wrong smartcard PIN
Rutoken ECP <no label>           PIN (Warning: PIN count low):
$ bash

В графическом интерфейсе всё то же самое - первый ввод PIN-кода выдаёт ошибки, повторный приводит к разблокировке компьютера, после чего gnome начинает сыпать сообщениями об ошибках, связанных со смарт картой.

Кроме того, подобная конфигурация блокирует обычный вход по паролю, и блокирует компьютер при извлечении токена.

(2025-01-30 09:03:56 отредактировано arashi)

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Проблема была видимо из-за того, что рam_pkcs11 и pam_sss работали вместе.
Вот полная инструкция для чисой убунты 24.04 desktop

Устанавливаем библиотеки:
sudo apt-get install pcscd opensc openssl libpam-p11 libengine-pkcs11-openssl
sudo apt-get install make automake autoconf libssl-dev pkgconf gcc git libtool
sudo apt-get install krb5-pkinit libpam-krb5
systemctl enable pcscd
wget https://download.rutoken.ru/Rutoken/PKC … _amd64.deb
sudo dpkg -i librtpkcs11ecp_2.17.1.0-1_amd64.deb
git clone https://github.com/OpenSC/libp11.git
cd libp11
autoreconf -i
./configure && make && sudo make install
sudo mv /usr/lib/x86_64-linux-gnu/libp11.so.3 /usr/lib/x86_64-linux-gnu/libp11.so.3_orig
sudo ln -s /usr/local/lib/libp11.so.3 /usr/lib/x86_64-linux-gnu/libp11.so.3
cd ..

Создаём ключи, сертификат. Загружаем на флешку.
openssl req -new -newkey rsa:2048 -days 365 -nodes -keyout private.key -out cert.csr -subj '/CN=tester66' # запрос на сертификат
kinit admin
ipa user_add tester66
ipa cert-request cert.csr --principal=tester66 --ca ipa --profile-id caIPAserviceCert --certificate-out cert.pem # Отправляем запрос на сертификат

Переформатируем ключ и сертификат в DER формат:

openssl rsa -in ./private.key -outform DER -out privatekey.der
openssl x509 -outform DER -in ./cert.pem -out client_cert.der
openssl pkey -inform DER -in privatekey.der -outform DER -pubout -out pubkey.der

Записываем секретный ключ и сертификат на токен:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./privatekey.der --type privkey --id 13 --label test
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./client_cert.der --type cert --id 13 --label test
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./pubkey.der --type pubkey --id 13 --label test

Проверим что на токене есть все объекты
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 -O

Проверим что по этому сертификату мы сможем получить билет керберос нашим пользователем
KRB5_TRACE=/dev/stdout kinit -V -X X509_user_identity='PKCS11:/usr/lib/librtpkcs11ecp.so' tester66
klist

Содать файл
sudo nano /usr/share/p11-kit/modules/Rutoken.module
с текстом
module:/usr/lib/librtpkcs11ecp.so

Настроить polkit
sudo nano /usr/share/polkit-1/actions/org.debian.pcsc-lite.policy
поставить yes во всех местах
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>

В базу данных сертификатов добавляем возможность искать сертификаты через библиотеку pkcs11
sudo modutil -dbdir "/etc/ipa/nssdb" -add "My PKCS11" -libfile /usr/lib/librtpkcs11ecp.so
Добавим в файл настроек кербероса строку, что можно использовать библиотеку для поиска сертификатов
sudo nano /etc/krb5.conf
[libdefaults]
pkinit_identities = PKCS11:librtpkcs11ecp.so
В файл настроек сервиса сссд так же добавим разрешение на вход по сертификату
sudo nano /etc/sssd/sssd.conf
[sssd]
services = nss, pam
[pam]
pam_cert_auth = True
pam_cert_db_path = /etc/ipa/ca.crt

Перезапустим службу сссд
sudo systemctl restart sssd

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

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

При помощи pkcs11-tool ключевая пара на флешке создаётся успешно.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 22 --label test2_2fa_ipa

А вот запрос на сертификат выдаётся segmentation fault
OPENSSL_CONF=/home/arashi/rutoken/test2/engine.conf openssl req -new -engine pkcs11 -key "pkcs11:object=test2_2fa_ipa" -keyform engine -passin pass:12345678 -out client.pem -config user_cert.inf
Engine "pkcs11" set.
Workaround for OpenSSL 3.0.13 30 Jan 2024 enabled
PKCS#11: Initializing the engine: /usr/lib/librtpkcs11ecp.so
Found 15 slots
Looking in slots for private key without login: label=test2_2fa_ipa
- [0] Aktiv Rutoken ECP 00 00    login                                 (Rutoken ECP <no label>)
Segmentation fault (core dumped)


Содержимое файла /home/arashi/rutoken/test2/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

В путях ошибок нет
ls -l /usr/lib/x86_64-linux-gnu/engines-3/pkcs11.so
-rwxr-xr-x 1 root root 417080 Jan 29 18:13 /usr/lib/x86_64-linux-gnu/engines-3/pkcs11.so
ls -l /usr/lib/librtpkcs11ecp.so
lrwxrwxrwx 1 root root 47 Jan 10 15:02 /usr/lib/librtpkcs11ecp.so -> /opt/aktivco/rutokenecp/amd64/librtpkcs11ecp.so

Re: Авторизация пользователей FreeIPA в ubuntu с использованием rutoken

Во вторых при разблокировке системы с графическо экрана блокировки крашится
/usr/lib/gdc-smartcard
crashed with SIGSEGV