Gérer une politique de mots de passe avec OpenLDAP
Il est fréquent dans un réseau d’entreprise de s’appuyer sur un annuaire LDAP pour stocker les informations de connexion (logins et mots de passe) des différents comptes, qu’il s’agisse de comptes utilisateur ou de comptes de service. Les bonnes pratiques actuelles recommandent également de définir une politique de mots de passe (durée de vie, longueur, complexité) afin de rendre plus difficile à un attaquant la tâche de s’approprier un compte auquel il n’est pas censé avoir accès. Dans le cas d’un annuaire OpenLDAP, cette politique de mots de passe peut directement être implémentée dans l’annuaire grâce à l’overlay ppolicy.
L’overlay ppolicy
Ppolicy (pour Password Policy) est un « overlay », c’est-à-dire un module pour OpenLDAP qui n’est pas activé par défaut, mais qui une fois chargé et configuré va modifier le comportement de l’annuaire. Dans le cas de ppolicy il s’agit de définir un ensemble de règles pour l’attribut qui contient les mots de passe (par défaut l’attribut userPassword).
Ppolicy permet notamment de paramétrer :
- La manière dont sont stockés les mots de passe, c’est-à-dire la fonction de hachage utilisée pour qu’ils ne soient pas présents dans l’annuaire en clair
- La complexité des mots de passe : longueur, classes de caractères… Ainsi on évitera de se retrouver avec des mots de passe triviaux tels « password1 » ou « mdp-jmartin »
- Les règles d’expiration, soit la fréquence à laquelle un utilisateur doit changer son mot de passe. Il est également possible de stocker un historique des précédents mots de passe afin d’éviter qu’un compte ait deux mots de passe différents qui alternent tous les 3 mois
- Le nombre maximum de tentatives de connexion ratées. Par exemple, on peut décider que si un utilisateur se trompe de mot de passe 5 fois de suite, son compte est verrouillé jusqu’à intervention d’un administrateur. Il est possible de préciser si les tentatives avec un même mot de passe erroné comptent ou non
On notera qu’il est possible de définir plusieurs politiques de mots de passe qui s’appliqueront à différentes entrées dans l’annuaire. Un exemple d’utilisation courant est de définir une politique différente pour les comptes de service, dont le mot de passe expirera moins fréquemment mais sera en contrepartie plus robuste. Pour cela ppolicy permet de déclarer une politique par défaut, et pour chaque compte dans l’annuaire d’en indiquer une autre, cette dernière directive ayant priorité sur la politique par défaut.
En pratique
Pour utiliser ppolicy, il faut inclure le fichier .schema correspondant, et charger le module. Les directives sont ensuite définies dans chaque base de données déclarée dans le fichier de configuration.
... # include the ppolicy schema include ppolicy.schema ... # required if the overlay is built dynamically loadmodule ppolicy.la # OR loadmodule ppolicy.so ... database bdb suffix "dc=example,dc=com" ... # invokes password policies for this DIT only overlay ppolicy # define the default policy ppolicy_default "cn=default,cn=pwpolicies,dc=example,dc=com" # optional ppolicy directives
Ensuite il faut rajouter l’entrée de l’annuaire qui contient la politique de mots de passe. Ci-dessous un exemple basique.
dn: cn=default,ou=policies,dc=example,dc=com cn: default objectClass: pwdPolicy objectClass: person objectClass: top # Permet à l’utilisateur de modifier lui-même son mot de passe pwdAllowUserChange: TRUE # Attribut qui contient le mot de passe : userPassword pwdAttribute: userPassword # Durée de vie du mot de passe : 3 mois pwdMaxAge: 7889400 # Si l’utilisateur se connecte dans les 1à heures précédents l’expiration de son # mot de passe, il reçoit un message d’avertissement pwdExpireWarning: 600 # Nombre d’anciens mots de passe stockés pour éviter la réutilisation : 2 pwdInHistory: 2 # Longueur minimale du mot de passe : 8 caractères pwdMinLength: 8 # Nombre maximum de tentatives de connexion ratées : 5 pwdMaxFailure: 5 # Verrouille le compte si 5 tentatives de connexion consécutives ont échoué pwdLockout: TRUE
Emile
Consultant sécurité
Sources et compléments d’information :