Créer une blacklist de mots de passe sous UNIX avec pam_pwquality
Sommaire
I. Présentation
L'Active Directory Windows propose une fonctionnalité intéressante permettant de créer une blacklist de mot de passe utilisée lors du paramétrage ou du changement de mot de passe d'un utilisateur. Cette fonction est bien utile car elle évite que des utilisateurs ne choisissent des mots de passe trop simples, en rapport avec leur entreprise ou leur contexte par exemple. Dans cet article, nous allons voir comment interdire aux utilisateurs locaux d'un système Linux de choisir certains mots de passe grâce à PAM et à son module pam_pwquality.
Pour effectuer cette même opération sur un Active Directory, suivez cet article : Active Directory : Auditer la qualité des mots de passe.
Cet article est réalisé sur un environnement CentOS 8.1 à jour.
II. Utilisation et installation de pam_pwquality
Dans un premier temps, nous allons devoir installer un module de la solution PAM (Pluggable Authentication Module) nommé pam_pwquality. Ce module permet d'effectuer certains contrôles sur la qualité des mots de passe lors de leur paramétrage par un utilisateur. Il s'agit d'un module très utile en termes de sécurité, qui permet de garantir une qualité et une robustesse minimale de tous le mots de passe présents sur un système Linux.
Nous allons commencer par regarder quels sont les modules PAM installés sur votre système. Ceux-ci sont situés dans /usr/lib64/security sous le forme de bibliothèques compilées (.so, pour Shared Object):
[root@localhost dict]# ls /usr/lib64/security/ -l total 1728 -rwxr-xr-x. 1 root root 20240 10 mai 2019 pam_access.so -rwxr-xr-x. 1 root root 13600 8 nov. 13:56 pam_cap.so [...] -rwxr-xr-x. 1 root root 11928 10 mai 2019 pam_nologin.so -rwxr-xr-x. 1 root root 7808 10 mai 2019 pam_permit.so -rwxr-xr-x. 1 root root 7776 10 mai 2019 pam_postgresok.so -rwxr-xr-x. 1 root root 20584 10 mai 2019 pam_pwhistory.so -rwxr-xr-x. 1 root root 11896 10 mai 2019 pam_pwquality.so [...] -rwxr-xr-x. 1 root root 61448 10 mai 2019 pam_unix.so -rwxr-xr-x. 1 root root 16048 10 mai 2019 pam_userdb.so -rwxr-xr-x. 1 root root 7816 10 mai 2019 pam_warn.so -rwxr-xr-x. 1 root root 11912 10 mai 2019 pam_wheel.so -rwxr-xr-x. 1 root root 24208 10 mai 2019 pam_xauth.so
Si vous voyez un pam_pwquality.so, vous n'avez rien besoin d'installer. Sinon, exécutez la commande suivante :
yum install libpwquality
Comme souligné plus haut, pam_pwquality permet d'effectuer bon nombre de contrôles différents, notamment concernant la structure des mots de passe paramétrés (nombre de caractères, d'alphabet différents, etc.). L'outil cracklib est utilisé pour créer, vérifier et gérer les dictionnaires de mot de passe que nous allons être amené à gérer. Il faut donc l'installer également :
yum install cracklib
III. Rappel sur la configuration de PAM
Nous allons à présent ajouter un nouveau module à la configuration PAM : pam_pwquality. Pour rappel, PAM dispose d'une configuration de base avec un fichier de configuration par application pouvant utiliser PAM, c'est pour cette raison que par défaut, un grand nombre de fichier sont présents dans /etc/pam.d/ :
[root@localhost pam.d]# ls -l total 108 -rw-r--r--. 1 root root 272 11 mai 2019 atd -rw-r--r--. 1 root root 192 8 nov. 18:28 chfn -rw-r--r--. 1 root root 192 8 nov. 18:28 chsh -rw-r--r--. 1 root root 721 13 sept. 03:42 cockpit -rw-r--r--. 1 root root 232 10 mai 2019 config-util -rw-r--r--. 1 root root 328 8 nov. 11:47 crond -rw-r--r--. 1 root root 701 10 mai 2019 fingerprint-auth -rw-r--r--. 1 root root 715 8 nov. 18:28 login -rw-r--r--. 1 root root 154 10 mai 2019 other -rw-r--r--. 1 root root 168 11 mai 2019 passwd -rw-r--r--. 1 root root 760 10 mai 2019 password-auth -rw-r--r--. 1 root root 155 11 nov. 17:52 polkit-1 -rw-r--r--. 1 root root 398 10 mai 2019 postlogin -rw-r--r--. 1 root root 640 8 nov. 18:28 remote -rw-r--r--. 1 root root 143 8 nov. 18:28 runuser -rw-r--r--. 1 root root 138 8 nov. 18:28 runuser-l -rw-r--r--. 1 root root 743 10 mai 2019 smartcard-auth lrwxrwxrwx. 1 root root 25 16 janv. 02:53 smtp -> /etc/alternatives/mta-pam -rw-r--r--. 1 root root 76 8 nov. 18:02 smtp.sendmail -rw-r--r--. 1 root root 727 8 nov. 16:28 sshd -rw-r--r--. 1 root root 214 11 nov. 17:50 sssd-shadowutils -rw-r--r--. 1 root root 566 8 nov. 18:28 su -rw-r--r--. 1 root root 154 11 déc. 14:43 sudo -rw-r--r--. 1 root root 178 11 déc. 14:43 sudo-i -rw-r--r--. 1 root root 137 8 nov. 18:28 su-l -rw-r--r--. 1 root root 760 10 mai 2019 system-auth -rw-r--r--. 1 root root 248 3 janv. 13:14 systemd-user -rw-r--r--. 1 root root 84 11 mai 2019 vlock
Cependant, tous ne sont pas "utiles", nous pouvons voir en analysant ces configurations qu'une majorité d'entre elles ne font que pointer vers des configurations génériques que sont les fichiers suivants :
/etc/pam.d/password-auth /etc/pam.d/system-auth
Sur certains système ou contextes, ces fichiers peuvent être nommés password-auth-ac, password-auth-am, system-auth-ac, system-auth-am ou encore common-password, common-auth, common-session et common-account. Bref !
Les directives include ou substack sont utilisées pour "importer" les directives d'un autre fichier. Exemple avec le fichier de configuration /etc/pam.d/ssh et spécifiquement le groupe de gestion password :
password include password-auth
On voit ici que le groupe de gestion password de la configuration pour SSH inclut simplement la configuration de /etc/pam.d/password-auth. Pour gérer la majorité des contextes, nous n'avons donc qu'à modifier le contenu de la pile password de ce fichier pour que cela soit pris en compte par toutes les configurations qui y font référence.
Pour rappel, la configuration générique /etc/pam.d/password-auth est majoritairement utilisée comme référence pour les services distants (FTP, SSH), alors que la configuration générique /etc/pam.d/system-auth. est majoritairement utilisée par les services locaux (su, sudo, etc.).
IV. Dictionnaire de mot de passe interdit dans PAM avec pam_pwquality
Après ce bref rappel, regardons le contenu du fichier /etc/pam.d/passwd, commande qui permet de définir ou de modifier les mots de passe utilisateurs :
[root@localhost pam.d]# cat passwd #%PAM-1.0 # This tool only uses the password stack. password substack system-auth -password optional pam_gnome_keyring.so use_authtok password substack postlogin
Celle-ci fait appel à la configuration générique /etc/pam.d/system-auth, nous allons donc nous intéresser au groupe de gestion password de ce fichier :
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow password required pam_deny.so
Nous voyons ici que le module pwquality est déjà utilisé pour effectuer certaines vérifications. Nous allons de notre côté ajouter l'argument dictpath=, suivi du chemin vers un fichier de mots de passe blacklistés. La pile d'exécution du contrôle password devient donc la suivante dans le fichier /etc/pam.d/system-auth :
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= dictpath=/usr/share/dict/pw_blacklist password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow password required pam_deny.so
Par défaut, le fichier /usr/share/dict/linux.words contient de nombreux de mot de passe (et noms communs). Il constitue un dictionnaire de base intéressant mais il est loin d'être suffisant dans vos contextes. Je vous conseille donc d'y ajouter vos propres mots de passe à interdire. Vous êtes également libre d'utiliser d'autres dictionnaires en les mettant dans l'argument du module pam_pwquality. C'est ce que nous allons faire ici, nous souhaitons créer une blacklist contenant le mot de passe itconnect2021 (pour l'instant 🙂 ) :
echo "itconnect2021" >> /usr/share/dict/pw_blacklist
Nous devons à présent convertir ce fichier dans un format attendu par le module pwquality, grâce à une commande venant du paquet cracklib précédemment installé :
[root@localhost dict]# create-cracklib-dict -o pw_blacklist pw_blacklist 1 1 [root@localhost dict]# ls -al total 20 drwxr-xr-x. 2 root root 98 24 janv. 05:17 . drwxr-xr-x. 90 root root 4096 24 janv. 03:03 .. -rw-r--r--. 1 root root 14 24 janv. 05:17 pw_blacklist -rw-r--r--. 1 root root 1024 24 janv. 05:17 pw_blacklist.hwm -rw-r--r--. 1 root root 29 24 janv. 05:17 pw_blacklist.pwd -rw-r--r--. 1 root root 16 24 janv. 05:17 pw_blacklist.pwi
Nous voyons que plusieurs fichiers sont créés à partir de notre liste initiale, il sera donc important de reexécuter cette commande à chaque nouvelle modification du dictionnaire initial. Je tente ensuite de paramétrer ce mot de passe interdit depuis une session de mon utilisateur marcel :
[marcel@localhost dict]$ passwd Changement de mot de passe pour l'utilisateur marcel. Current password: Nouveau mot de passe : MOT DE PASSE INCORRECT : Le mot de passe ne passe pas la vérification dans le dictionnaire - basé sur un mot du dictionnaire
Attention : Si vous effectuez une modification du mot de passe root ou d'un autre utilisateur depuis une session root, ces restrictions ne vous seront pas appliquées.
Nous voyons ici que le mot de passe que j'ajoute, qui est également présent dans la liste des mots de passe interdits créée, est refusé pour une raison explicite : "basé sur un mot du dictionnaire". A noter que le résultat sera le même si je saisie le nouveau mot de passe ItCoNnEcT2021, pwquality effectue également quelques permutations de ce genre sur les mots de passe fournis par les utilisateurs.
En constituant une liste de mots de passe faibles, en relation notamment avec votre contexte (nom d'entreprise, de ville, de région, etc.) vous serez en capacité d'interdire de nombreux mots de passe faibles pour une une meilleure sécurité globale du système d'information. Je vous conseille donc d'appliquer ce type de durcissement sur l'ensemble de vos serveurs Linux et stations de travail. La liste des mots de passe doit reposer sur des listes connues et référencées de mots de passe faibles et sur des éléments de contexte qui vous sont propres.
Bonjour,
Peut-on utiliser les caractères génériques dans la blacklist ?
Par exemple, *entreprise* pour interdire tous les mots de passe contenant le nom de l’entreprise.
Cordialement
Bonjour,
Non, il n’est pas possible d’utiliser des caractères génériques dans la blacklist de mots de passe avec pam_pwquality. La liste noire fonctionne avec des correspondances exactes, ce qui signifie que chaque mot de passe doit être spécifiquement mentionné dans le fichier de blacklist. D’après mes premières recherches, il semble qu’il faille passe par un module PAM custom (entendre, à créer soit même) pour faire cela. Ou alors se reposer sur des mécanismes de SSO plus complets (OpenLDAP, AD)