22/12/2024

Commandes et SystèmeCybersécuritéLinux

Créer une blacklist de mots de passe sous UNIX avec pam_pwquality

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.

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Créer une blacklist de mots de passe sous UNIX avec pam_pwquality

  • 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

    Répondre
    • 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)

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.