feat: add pam-pkcs11 configuration
Recommends libpam-pkcs11 package. Add configuration for Safenet module (pam_pkcs11.conf) Add UID mapper generator (pkcs11_generate_uids) Configure certificates for pam_pkcs11 from postinst.
This commit is contained in:
186
Notes_pkcs11.md
Normal file
186
Notes_pkcs11.md
Normal file
@@ -0,0 +1,186 @@
|
||||
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](
|
||||
https://yourdev.tech.orange/linux-article/login-with-pki/) 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-smartcard` sur `gdm-smartcard-pkcs11-exclusive`
|
||||
- activer l'authentification par smartcard dans `dconf` pour 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 ?)
|
||||
Reference in New Issue
Block a user