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.
187 lines
6.9 KiB
Markdown
187 lines
6.9 KiB
Markdown
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 ?)
|