PAM.D¶
Avant toute chose¶
PAM est un fonctionnement complexe et présent à chaque étape du fonctionnement d’un Linux. Une mauvaise configuration peut comprommettre la sécurité du système. De plus, une configuration erronée peut rendre inopérent le système. Avant toute modification de PAM, il est recommandé d’avoir une console ouverte en root qui ne risque pas de se fermer dans le temps.
Oui, vous avez bien lu en root. sudo utilise PAM pour devenir root.
Qu’est-ce que PAM ?¶
PAM (Pluggable Authentication Modules) est le système sous Linux qui gère l’ensemble des authentification. C’est grâce à lui que l’on va pouvoir se connecter avec un compte présent sur un Active Directory, à l’aide d’une clé SSH, en forçant l’authentification via google auth à distance ou encore directement à l’aide du lecteur biométrique du PC. Malheuresement, je trouve que PAM est super complexe a administrer. La multitude de fichier plus les termes obscures de PAM le rends difficilement compréhensible par un noob. On va essayer de décortiquer tout ça et d’apprendre un peu.
Les différents fichiers PAM¶
À chaque application ou service prenant en charge PAM correspondra un fichier de configuration dans le répertoire «/etc/pam.d». Par exemple, le processus «login» attribue le nom «/etc/pam.d/login» à son fichier de configuration.
Les différentes actions de PAM¶
Les actions utilisables par PAM sont nommés modules dans le langage courant du programme. Chaque module va charger une librairie qui permettra d’exploiter un nouveau mode de fonctionnement pour PAM.
Chaque fichier va donc présenter différents modules. Ces modules seront exécutés du premier au dernier, dans l’ordre. Chaque ligne ainsi ecrite sur PAM est nommé directive. Les directives reprennent la forme ci-dessous.
mécanisme [contrôle] chemin-module [argument]
Les valeurs de mécanisme sont au nombre de quatre :
auth - Authentification : permet d’authentifier un utilisateur, généralement à l’aide d’un mot de passe.
account - Gestion des comptes : concerne la disponibilité du compte (ex : restriction horaire)
session - Gestion de sessions : concerne l’ouverture et la fermeture de session (ex : log ; tâche planifiée etc)
password - Gestion de mot de passe concerne la politique de mot de passe (ex : complexité, renouvellement etc).
Les indicateurs de contrôles sont également au nombre de quatre :
required : Il est nécessaire pour que la validation du contrôle. S’il échoue, le reste des contrôles sont quand même lancés, mais le résultat sera négatif.
requisite : Il est nécessaire pour que la validation du contrôle. S’il échoue, ça s’arrête là, le résultat est négatif.
sufficient : Il se suffit à la validation du contrôle. Si aucunes directives précédentes ne comporte un required ou requisite en erreur, le module est validé.
optional : Le plus simple : c’est bien s’il est là, mais ça fonctionnera même sans.
Activer l’authentification OTP avec Google Authenticator.¶
[INTRO] On commence tout d’abord par installer la librairie Pam de Google.
apt install libpam-google-authenticator
Ensuite, on modifie le fichier de pam lié à l’authentification à distance ssh. Pour moi, c’est /etc/pam.d/sshd. L’emplacement de la ligne dans pam importe. Mais je ne sais pas où je dois la placer exactement, alors je l’ai mise aux alentours des lignes 40, avant que pam charge les variables d’environnement.
# Ask for 2FA for remote login.
auth required pam_google_authenticator.so [authtok_prompt=2FA secret token: ]
Maintenant, on va rajouter à chacun de nos utilisateurs ses clés 2FA.
lucas@pi2:~ $ google-authenticator -t -d -r 1 -R 30 -w 3 -e 2 -Q ANSI
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/lucas@pi2%3Fsecret%3DMZP3Q2ZLBZVFCEXQC6UXB57SXU%26issuer%3Dpi2
[LE QRCODE]
Your new secret key is: MZP3Q2ZLBZVFCEXQC6UXB57SXU
Enter code from app (-1 to skip): 663550
Code confirmed
Your emergency scratch codes are:
19067983
29445547
Do you want me to update your "/home/lucas/.google_authenticator" file? (y/n) y
Attention à bien stocker vos codes de secours si vous n’avez pas de 2nd moyen d’authentification ! Pour ma part, j’ai préféré utiliser des clés Yubikey en tant que deuxième moyen sécurisation des clés SSH.
Activer l’authentification via lecteur d’empreinte¶
Contexte¶
Ce chapitre est la véritable raison pour laquelle je me suis lancé sur cette documentation. L’objectif est de permettre à l’utilisateur de lancer des commandes sudo sans avoir à rentrer son mot de passe. Je trouve ce cas d’usage plutôt intéressant quand l’on est dans un lieu partagé (ex : train, café …). Oui, Linux emporte son paquet d’options de sécurité pour cacher nos informations d’authentification, mais quoi de mieux que de ne pas en remplir du tout pour que ça soit plus efficace ?
Mon lecteur d’empreinte est-il reconnu de mon Linux ?¶
Avant toute chose, il faut savoir si votre lecteur d’empreinte est opérationnel sur votre machine. J’ai souvenir qu’en fonction de la distribution (et de la version de cette dernière), le lecteur d’empreinte peut ne plus être reconnu. Pour ma part, en 22.04.3, ce dernier fonctionne.
lucas@OP3:~$ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 004: ID 27c6:639c Shenzhen Goodix Technology Co.,Ltd. Goodix USB2.0 MISC
Bus 003 Device 003: ID 8087:0029 Intel Corp. AX200 Bluetooth
Bus 003 Device 002: ID 0c45:6725 Microdia Integrated_Webcam_HD
Ok donc on voit bien un premier hub usb, puis le lecteur d’empreinte de chez Shenzhen. Continuons sur comment configurer l’authentification sudo.
Installation et pré-requis¶
Avant de se lancer tête baisser, on va devoir installer fprintd et sa librairie PAM et rajouter son premier doigt.
apt install fprintd libpam-fprintd
fprintd-enroll -f left-index-finger
Using device /net/reactivated/Fprint/Device/0
Enrolling left-index-finger finger.
Enroll result: enroll-stage-passed
Enroll result: enroll-retry-scan
Enroll result: enroll-remove-and-retry
Enroll result: enroll-finger-not-centered
Enroll result: enroll-stage-passed
Enroll result: enroll-completed
J’ai enlevé quelques lignes, elles n’étaient pas intéressantes. Bref, nous avons donc un nouveau doigt de configurer.
On pourra vérifier la liste des doigts enregistrés avec
fprintd-list $USERNAMELe format de nomage des doigts est du style
[left|right]-[ring|little|index|middle]-finger. Exception pour le pouce (thumb) qui ne prends pas de-fingeraprès. Sans ça, impossible d’enregister un nouveau doigt.
Parametrage de PAM manuel¶
Je souhaite dans ce cas faire que sudo puisse s’exécuter uniquement avec mon doigt. Vu le tableau précédent, ça signifie que la ligne doit être dans les premières et doit être en sufficient. J’ai suivi le tutoriel de Ettayeb pour ça. Au final, notre fichier pam.d/common-auth ressemble à ça :
auth sufficient pam_fprintd.so
auth [success=2 default=ignore] pam_unix.so nullok
auth [success=1 default=ignore] pam_sss.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_cap.so
# end of pam-auth-update config
Parametrage de PAM automatique¶
Sauf que j’ai remarqué qu’après la petite ligne en commentaire que j’ai laissé… PAM se gère à l’aide de pam-auth-update (j’avais bossé avec pour ansible-role-samba4 je crois). Donc on va le faire avec pam-auth-update après tout !
lucas@OP3:~$ ls /usr/share/pam-configs/
capability fprintd gnome-keyring mkhomedir pwquality sss systemd unix
lucas@OP3:~$ sudo pam-auth-update --enable fprintd
lucas@OP3:~$ cat /etc/pam.d/common-auth
# here are the per-package modules (the "Primary" block)
auth [success=3 default=ignore] pam_fprintd.so max-tries=1 timeout=10 # debug
auth [success=2 default=ignore] pam_unix.so nullok try_first_pass
auth [success=1 default=ignore] pam_sss.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_cap.so
# end of pam-auth-update config
Qu’est-ce qui change ? Avec cette configuration, le lecteur d’empreinte n’essaie qu’une seule fois. En cas d’erreur, on passe de suite au mot de passe !
Sources¶
Formatux, le premier site que j’ai trouvé en cherchant des infos sur PAM.