Files
orange-yourdev-login/Notes_gdm.md
2021-10-13 16:21:17 +02:00

166 lines
7.0 KiB
Markdown

GDM et PAM
----------
GDM utilise PAM pour l'authentification. Il s'appuie sur une configuration
dédiée dans `/etc/pam.d`, cf les fichiers de profil `gdm-password`,
`gdm-smartcard` et `gdm-fingerprint`.
Le reste du système (login console, SSH) utilise aussi PAM, via une autre
configuration nommée `/etc/pam.d/common-auth`. Le contenu de ce fichier
est généré automatiquement par `pam-auth-update` pour tous les modules PAM
qui livrent une définition dans `/usr/share/pam-configs`.
Sur Hirstute, dans la configuration par défaut, GDM choisit automatiquement
le profil qu'il va utiliser : si un token PKCS#11 qui possède le drapeau
"amovible" est présent (typiquement le dongle Aladdin), alors il utilisera
le profil `gdm-smartcard`, sinon il utilisera le profil `gdm-password`.
Il est possible de changer cette sélection avec une propriété `dconf`,
comme ceci:
```
[org/gnome/login-screen]
enable-smartcard-authentication=false
```
et alors GDM utilise le profil `gdm-password`, même si un dongle PKI est
connecté à la machine lors de la connexion.
Le profil `gdm-password` est grosso-modo une façade pour `common-auth`
(il fait l'inclusion de ce fichier), donc tous les modules PAM qui y sont
déclarés sont utilisables (unix, ccreds, krb5, sss, etc.)
Le profil `gdm-smartcard` est un lien symbolique, géré par `update-alternatives`,
qui peut pointer vers l'un des trois profils qui gèrent effectivement les
tokens PKCS#11:
- `gdm-smartcard-pkcs11-exclusive` qui utilise le module `pam_pkcs11`
- `gdm-smartcard-sssd-exclusive` qui utilise le module `pam_sss`
avec l'option `require_cert_auth`
- `gdm-smartcard-sssd-or-password` qui utilise le module `pam_sss`
avec l'option `try_cert_auth` et passe la main au profil `common-auth`
en solution de secours si le premier module a échoué.
Ces trois profils nécessitent une configuration dédiée pour PKCS#11
dans le module PAM correspondant, si pas configuré, ça ne marche pas :
GDM va demander l'identifiant de l'utilisateur (username), puis le PIN, et
ensuite l'authentification échoue, retour au point de départ, en boucle.
La valeur par défaut sur Ubuntu est `gdm-smartcard-sssd-exclusive`.
Selection d'un profil gdm-smartcard
-----------------------------------
En mode interactif:
```
$ sudo 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: 3
```
En mode inattendu:
```
$ sudo update-alternatives --set gdm-smartcard /etc/pam.d/gdm-smartcard-sssd-or-password
```
Il n'est pas nécessaire de redémarrer le service `gdm3` après
modification.
Saisie de l'identifiant utilisateur en mode smartcard
-----------------------------------------------------
En mode par défaut (gdm-password), l'écran d'accueil GDM présente la
liste des utilisateurs humains (>=1000) déclarés sur la machine, ou bien un
unique utilisateur pré-sélectionné s'il n'existe qu'un seul utilisateur
humain sur la machine. Il est possible de désactiver l'affichage de cette
liste avec une propriété `dconf`, cf [GNOME - Disable the user list], et
alors l'écran d'accueil demande la saisie de l'identifiant de l'utilisateur.
En mode PKI (gdm-smartcard), l'écran d'accueil GDM propose directement
la saisie de l'identifiant de l'utilisateur, il ne propose pas la liste
des utilisateurs existants, et la propriété `disable-user-list` n'est
pas prise en compte.
Les modules PAM qui exploitent PKCS#11 savent extraire l'identifiant
de l'utilisateur à partir des données présente dans un certificat
d'authentification, une fois le mapper configuré. Cette information
est utilisée principalement pour déterminer où est le compte de
l'utilisateur sur le disque, elle n'est pas forcément utilisée pour
identifier l'utilisateur lui-même.
Pour `pam_pkcs11`, il est possible de configurer le module pour qu'il
identifie directement l'utilisateur depuis le certificat, sans aucune
saisie clavier, cf le "alternate way of working" décrit dans le README.
(voir [Notes_pkcs11.md](Notes_pkcs11.md) pour plus de détails).
Néanmoins, GDM est incapable d'exploiter cette information de cette
manière, il ne sait pas sélectionner l'utilisateur à partir d'un
certificat, il affiche systématiquement le champ de saisie de
l'identifiant en mode smartcard.
Configuration dconf
-------------------
Pour désactiver le login avec smartcard, je me suis inspiré de la
documentation [GNOME - Disallow login using a fingerprint] propose de
créer un profil `user` pour `dconf`, hélas, ça ne fonctionne pas !
En revanche, avec un profil `gdm` comme dans [GNOME - Add a greeter logo to
the login screen], c'est bon, on observe le comportement attendu, lorsque
le dongle PKI est présent dans le port USB, c'est bien un login/password
qui est demandé par GDM.
Documentation pas à jour ?
Important: après avoir modifié une valeur dans `/etc/dconf/db/gdm.d/*`,
il faut faire prendre en compte cette modification par `dconf`, puis
redémarrer le service `gdm3`:
```
$ sudo dconf update
$ sudo restart gdm3.service
```
Les modes de fonctionnement choisis
-----------------------------------
Pour l'instant, deux modes de fonctionnement:
1. `gdm-password` + `pam_sss` + `common-auth`
2. `gdm-smartcard` + `pam_pkcs11`
Dans le premier mode, le smartcard est explicitement désactivé dans
`dconf`, GDM ne reconnait pas le token PKCS#11 à la connexion, il
ne demande pas le username, c'est la connexion classique à laquelle
l'utilisateur est habitué, pas de régression. Le module `pam_sss`
est configuré pour authentifier via Kerberos, et le `common-auth`
permet les solutions de secours (`pam_unix` et `pam_ccreds`).
Dans le deuxième mode, le token PKCS#11 est utilisé à la connexion
si présent, sinon authentification classique avec mot de passe local
(`pam_unix`). Dans un cas comme dans l'autre, pas d'authentification
Kerberos, donc pas de TGT à la connexion.
A l'étude, un troisième mode de fonctionnement avec PKCS#11 dans SSSD.
Références
----------
- [GNOME - Add a greeter logo to the login screen]
- [GNOME - Display a text banner on the login screen]
- [GNOME - Disallow login using a fingerprint]
- [GNOME - Disable the user list]
[GNOME - Add a greeter logo to the login screen]: https://help.gnome.org/admin/system-admin-guide/stable/login-logo.html.en
[GNOME - Display a text banner on the login screen]: https://help.gnome.org/admin/system-admin-guide/stable/login-banner.html.en
[GNOME - Disallow login using a fingerprint]: https://help.gnome.org/admin/system-admin-guide/stable/login-fingerprint.html.en
[GNOME - Disable the user list]: https://help.gnome.org/admin/system-admin-guide/stable/login-userlist-disable.html.en