7.3 KiB
Configuration pam-pkcs11
Thierry Tallagrand à la rescousse !
Installation:
# apt install libpam-pkcs11
Ajouts des certificats Orange, parce que pam-pcs11 utilise son propre trousseau:
# mkdir /etc/pki/nssdb
# orange-certupdate /etc/pki/nssdb
# cp /usr/share/ca-certificates/orange/* /etc/pam_pkcs11/cacerts
# (cd /etc/pam_pkcs11/cacerts && pkcs11_make_hash_link)
Création d'une configuration spécifique /etc/pam_pkcs11/pam_pkcs11.conf
pour le dongle Safenet, en s'inspirant du fichier d'exemple de la documentation
dans /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.conf.example.
Il y a trois parties dans ce fichier:
- les paramètres globaux de pam-pkcs11
- la description du module Safenet
- la définition du (des) mapper(s) certificat -> utilisateur.
Pour bien comprendre le rôle des différentes propriétés top-level et des
modules, voir le fichier /usr/share/doc/libpam-pkcs11/README.gz. Pour
une présentation de ce qu'est un mapper, les deux processus de login
quand on utilise un mapper (important), et la description des mappers
fournis, voir /usr/share/doc/libpam-pkcs11/README.mappers.gz.
On utilise le mapper uid parce que cette propriété est présente dans
le champ 'Subject' du certificat Auth, elle est reconnue automatiquement.
On aura besoin d'un fichier de mapping qui fait correspondre la valeur
de l'UID du certificat avec le nom d'un utilisateur local sur la machine.
La correspondance est triviale, les UID sont en majuscule et les utilisateurs
en minuscules:
$ cat /etc/pam_pkcs11/uid_mapping
ABCD1234 -> abcd1234
Voir le script /usr/bin/pkcs11_generate_uids pour générer ce fichier
automatiquement à partir de la définition des utilisateur locaux dans
/etc/passwd.
Une fois le fichier de mapping en place, on peut le tester avec la
commande pklogin_finder après avoir inséré le dongle:
$ pklogin_finder
[...]
DEBUG:mapper_mgr.c:213: unloading mapper module list
DEBUG:mapper_mgr.c:137: calling mapper_module_end() uid
DEBUG:mapper_mgr.c:148: Module uid is static: don’t remove
DEBUG:pkcs11_lib.c:1490: logout user
DEBUG:pkcs11_lib.c:1497: closing the PKCS #11 session
DEBUG:pkcs11_lib.c:1503: releasing keys and certificates
DEBUG:pklogin_finder.c:169: releasing pkcs #11 module…
DEBUG:pklogin_finder.c:172: Process completed
[...]
DEBUG:pklogin_finder.c:151: Certificate is valid and maps to user tmzf5455
Le module pam-pkcs11 est maintenant configuré, il reste à le faire prendre en compte par GDM:
# update-alternatives --config gdm-smartcard
There are 3 choices for the alternative gdm-smartcard (providing /etc/pam.d/gdm-smartcard).
Selection Path Priority Status
0 /etc/pam.d/gdm-smartcard-sssd-exclusive 50 auto mode
1 /etc/pam.d/gdm-smartcard-pkcs11-exclusive 30 manual mode
2 /etc/pam.d/gdm-smartcard-sssd-exclusive 50 manual mode
3 /etc/pam.d/gdm-smartcard-sssd-or-password 40 manual mode
Press to keep the current choice[*], or type selection number:
Choisir 1) pour gdm-smartcard-pkcs11-exclusive et valider. Important: il faut
aussi que GDM permette le login par smartcard, voir les notes concernant GDM.
Voir l'article original sur le wiki avec screenshots.
Saisie du compte avec GDM
Avec la première tentative de configuration issue directement de
pam_pkcs11.conf.example, on constate lorsque le dongle PKI est inséré
que GDM demande la saisie explicite du nom de l'utilisateur avant de
demander le PIN. C'est différent du mode habituel sans PKCS#11 où
GDM propose l'utilisateur (liste), et il n'y a que le mot de passe
à saisir.
Le comportement observé correspond au premier mode de fonctionnement
décrit dans /usr/share/doc/libpam-pkcs11/README.mappers.gz:
Normal pam-pkcs11 login process involves the following procedures
- Enter login
- Ask for PIN
- Open and validate certificate
- Map certificate into an user (*)
- Check if login and user matches (**)
alors que ce qu'on voudrait c'est le deuxième mode:
An alternate way of working is by mean of not providing user name:
- Detect if a card is inserted
- Ask for PIN
- Open and validate certificate
- Map certificate into an user (*)
- open session for deduced login
On passe de l'un a l'autre avec la propriétés top-level card_only qui
est décrité dans /usr/share/doc/libpam-pkcs11/README.gz:
card_only
Always try to get the userid from the certificate, don't prompt for the
user name if the card is present, and if the token is present, then we
must use it to authenticate.
wait_for_card
This option needs card_only to be set. This will make the system wait
for the token to be inserted on login, or after login it will require
the same token be inserted to unlock the system.
La documentation dit aussi que dans le deuxième mode il faut aussi le
module pam-mkhomedir.so pour créer dynamiquement le compte utilisateur,
ce n'est pas forcément ce qu'on veut, à voir si ça marche sans avec
un compte existant.
Néanmoins, avec card_only = true; dans pam_pkcs11.conf, GDM continue à
demander un identifiant, bref il semble que cela ne fonctionne pasn au moins
sur Hirsute ... Bug dans GDM ? Fonctionnalité non prise en compte ?
Activer PKCS#11 dans GDM
Trois opérations à faire:
- basculer l'alternative
gdm-smartcardsurgdm-smartcard-pkcs11-exclusive - activer l'authentification par smartcard dans
dconfpour GDM - redémarrer le service
soit:
# update-alternatives --set gdm-smartcard /etc/pam.d/gdm-smartcard-pkcs11-exclusive
# sed -Ei 's/(enable-smartcard-authentication)=.*/\1=true/' /etc/dconf/db/gdm.d/03-smartcard
# dconf update
# systemctl restart gdm3
Il faudrait un script pour automatiser cela ...
Limitations
Le paquet libpam-pkcs11 ne fournit pas de configuration pour pam-auth-update
dans /usr/share/pam-configs, donc l'authentification PKCS#11 ne peut pas
être ajoutée automatiquement dans /etc/pam.d/common-auth. Par conséquent, elle
ne sera disponible que dans GDM via /etc/pam.d/gdm-smartcard, si on la voulait
aussi en mode console il faudrait bricoler dans la configuration PAM ...
Dans gdm-smartcard-pkcs11-exclusive, il n'y a que le module pam_pkcs11.so,
donc après authentification par token on n'obtiendra pas de TGT Kerberos. Il
faudrait bricoler pour rajouter pam_krb5.so, sans aucune garantie que ça
marche, le problème étant 1) faire circuler le PIN et 2) faire comprendre à
pam_krb5.so qu'il s'agit d'un PIN et pas d'un mot de passe... Autant essayer
de faire cela avec SSSD.
Contrairement à ce que pkcs11-exclusive laisse entendre, si le dongle n'est
pas présent dans le port USB, on peut toujours se connecter par login/password
(mais Kerberos foonctionnera-t'il si pam_krb5.so est présent ?)