====== Module PPolicy ====== ===== Installation ===== Il faut d'abord charger le module //ppolicy// : ldapmodify -Y EXTERNAL -H ldapi:/// << EOF dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: ppolicy EOF Il faut ensuite ajouter le schéma //ppolicy// **(uniquement avant OpenLDAP 2.5, Debian Bookworm ou Bullseye backports)** : ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif Il faut ensuite activer ce module pour votre //database// : ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config objectclass: olcOverlayConfig objectclass: olcPPolicyConfig olcoverlay: ppolicy olcppolicydefault: cn=default,ou=ppolicies,dc=example,dc=com olcppolicyforwardupdates: FALSE olcppolicyhashcleartext: TRUE olcppolicyuselockout: FALSE EOF **Paramètres de configuration au niveau de la database :** * **olcPPolicyHashCleartext :** si ''TRUE'', les mots de passes soumis en clair lors d'une opération d'ajout ou de modification seront hâché (avec le type par défaut du serveur). * **olcPPolicyUseLockout :** Bien que le serveur refusera toujours la connexion avec un compte bloqué (erreur //AccountLocked//), si ce paramètre vaut ''TRUE'', le serveur retournera le code d'erreur spécifique ''AccountLocked''. * **olcPPolicyForwardUpdates (serveur esclave uniquement) :** si ''TRUE'', les échecs de connexions (et autres modifications d'attributs opérationnels) sur le serveur seront transmis au serveur maître. Pour fonctionner, la fonctionnalité associée à l'attribut **olcPPolicyForwardUpdates** nécessite que : * le paramètre ''olcUpdateRef'' et le [[chain|chaining]] soient configurés sur la database * les modifications des attributs opérationnels seront faites avec l'utilisateur LDAP configuré dans le [[chain|chaining]] **et il est important** que les ACLs lui autorisent la modification de ces attributs **(droit ''manage'' indispensable, notamment pour la suppression de l'attribut ''pwdFailureTime'')**. Il faut ensuite ajouter l'objet LDAP dans votre base LDAP implémentant la politique par défaut des mots de passes : ldapadd -Y EXTERNAL -H ldapi:/// << EOF dn: ou=ppolicies,dc=example,dc=com objectclass: organizationalUnit ou: ppolicies dn: cn=default,ou=ppolicies,dc=example,dc=com cn: default objectclass: top objectclass: device objectclass: pwdPolicy objectclass: pwdPolicyChecker pwdAttribute: userPassword pwdMinAge: 0 pwdMaxAge: 0 pwdInHistory: 0 pwdCheckQuality: 1 pwdMinLength: 8 pwdExpireWarning: 0 pwdGraceAuthnLimit: 0 pwdLockout: FALSE pwdLockoutDuration: 0 pwdMaxFailure: 0 pwdMaxRecordedFailure: 0 pwdFailureCountInterval: 0 pwdMustChange: FALSE pwdAllowUserChange: FALSE pwdSafeModify: FALSE EOF La configuration de la politique par défaut proposée ci-dessus n'active pour ainsi dire aucune protection fourni par cette overlay. Il est conseillé d'ajuster les différents paramètres de la politique en fonction du besoin (voir ci-dessous). Pour plus d'informations, [[https://www.zytrax.com/books/ldap/ch6/ppolicy.html|consulter cette documentation du module]]. ===== Configuration de la politique de mot de passe ===== La politique de mot de passe est définie au travers des objets **pwdPolicy** stockés dans l'arbre LDAP. Plusieurs politiques de mots de passe peuvent être configurées avec plusieurs objets **pwdPolicy**. La politique de mot de passe utilisée pour un compte donné est alors celle ciblée explicitement par l'attribut **pwdPolicySubentry** du compte ou à défaut, la politique par défaut définie par l'attribut **olcPPolicyDefault** dans la configuration OpenLDAP de la //database//. * Classe d'objet : **pwdPolicy** * Attributs : * **pwdAllowUserChange :** booléen définissant si l'utilisateur peut changer son mot de passe (défaut: ''TRUE'') * **pwdAttribute :** nom de l'attribut stockant le mot de passe (défaut : ''userPassword'', seul attribut supporté actuellement) * **pwdCheckModule :** nom du module OpenLDAP se chargeant de la vérification de la qualité d'un mot de passe * **pwdCheckQuality :** politique de vérification de la qualité du mot de passe * ''0 '' (par défaut) : pas de vérification de la qualité du mot de pasee * ''1'' : si le mot de passe fourni est en clair, il est vérifié, sinon (ou si la méthode de vérification est indisponible) le mot de passe est accepté. * ''2'' : si le mot de passe fourni est en clair, il est vérifié, sinon (ou si la méthode de vérification est indisponible) le mot de passe est refusé. * **pwdExpireWarning :** délai d'affichage du message d'alerte d'expiration du mot de passe * ''0'' (par défaut) : pas de message d'alerte * ''>0'' : durée en secondes avant l'expiration du mot de passe pendant laquelle un message d'alerte sera retourné au sujet de l'expiration du mot de passe à chaque connexion (opération de ''bind'' LDAP). * **pwdFailureCountInterval :** durée après laquelle le nombre de tentatives d'authentification consécutive en échecs est réinitialisé. * ''0'' (par défaut) : réinitialisé qu'après une connexion réussie * ''>0'' : durée en secondes après laquelle le nombre de tentatives en échec sera réinitialisé si aucun échec n'a lieu entre-temps. * **pwdGraceAuthNLimit :** délai de grâce après expiration du mot de passe * ''0'' (par défaut) : après expiration du mot de passe, l'utilisateur ne peut plus se connecter. * ''>0'' : nombre de fois ou l'utilisateur peut se connecter avec son mot de passe expiré. * **pwdInHistory :** nombre d'anciens mots de passe conservés dans l'historique d'un utilisateur. Par défaut: ''0''. **Note :** les mots de passe sont stockés hachés dans l'historique. Par conséquence, seule une vérification d'égalité parfaite peut être faite. * **pwdLockout :** booléen définissant l'action faite après un trop grand nombre de connexion en échec (défini par **pwdMaxFailure**): * ''TRUE'' (par défaut) : le compte est bloqué et seul un administrateur pourra le débloquer * ''FALSE'' : le compte n'est pas bloqué et l'utilisateur peut toujours tenter de se connecter (=fonctionnalité désactivée) * **pwdLockoutDuration :** durée de blocage d'un compte (si ''pwdLockout==TRUE'') * ''0'' (par défaut) : blocage sans date de fin, c'est à dire jusqu'à déblocage par un administrateur * ''>0'' : durée en secondes du blocage. Passé ce délai, le compte sera automatiquement débloqué. * **pwdMaxAge :** durée maximum en secondes de validité d'un mot de passe. Passé ce délai, le mot de passe est expiré et doit être changé. Par défaut: ''0'', c'est à dire que le mot de passe n'expire jamais. * **pwdMaxFailure :** nombre maximum de tentatives de connexion consécutive en échec avant que l'action définie par **pwdLockout** est déclenchée. Par défaut: ''0'', c'est à dire à pas de limite. * **pwdMaxTotalAttempts :** nombre maximum de tentatives de connexions consécutives en échec en incluant les essais avec un même mot de passe, avant que l'action définie par **pwdLockout** est déclenchée. **Note :** dans tous les cas, le nombre d'échec avec des mots de passe uniques est contrôllé par rapport à la limite fixée par **pwdMaxFailure**. * ''0'' (par défaut) : pas de détection de connexion consécutives en échec avec un même mot de passe * ''>0'' : limite du nombre de connexion consécutives en échec avec des mots de passe différents. Un même mot de passe ne sera contabilisé qu'une seule fois, quelques soits l'ordre dans lequel il arrive dans la suite d'échec. * ''-1'' : aucune limite du nombre de tentatives en échec avec un même mot de passe. * **pwdMinAge** : durée minimale en secondes entre deux changements de mot de passe. Par défaut : ''0'', c'est à dire qu'il n'y a pas de durée minimale. * **pwdMinLength** : longeur minimale d'un mot de passe. Par défaut : ''0'', c'est à dire qu'il n'y a pas de longeur minimale. **Note :** Si le mot de passe est fourni hashé lors du changement, ce test ne peut être réalisé et la politique définie par **pwdCheckQuality** s'applique alors. * **pwdMustChange :** booléen définissant si l'utilisateur doit changer son mot de passe après qu'un administrateur ait débloqué son compte (utile uniquement si ''pwdLockout==TRUE''). **Note :** si l'attribut **pwdReset** est défini sur le compte, sa valeur outrepasse ce paramètre. * ''FALSE'' (par défaut) : l'utilisateur n'a pas à changer son mot de passe * ''TRUE'' : l'utilisateur doit changer son mot de passe * **pwdSafeModify :** Booléen définissant si l'utilisateur doit fournir son mot de passe actuel lors d'une opération de modification du mot de passe. Par défaut : ''FALSE''. ===== Attributs d'état d'un compte ===== * **pwdAccountLockedTime :** date et heure du blocage du compte (lorsque ''pwdLockout==TRUE''). * **pwdChangedTime :** date et heure du dernier changement du mot de passe * **pwdFailureTime :** attribut multivalué listant les dates et heures des tentatives de connexion en échec. * **pwdGraceUseTime :** attribut multivalué listant les dates et heures des connexions réussies durant la période de grace accordé après expiration du mot de passe (présent uniquement si ''pwdGraceAuthNLimit>0''). * **pwdHistory :** attribut accessible en lecture uniquement et contenant la liste des derniers mots de passe utilisé par l'utilisateur. Le nombre de mots de passe présent dans cette liste dépend du nombre de changeant du mot de passe du compte et de la limite fixée par **pwdInHistory**. * **pwdPolicySubentry :** DN d'un objet **pwdPolicy** à utiliser spécifiquement pour ce compte. À défaut, la politique par défaut s'applique. Note : attribut monovalué. * **pwdReset** : cet attribut peut être utilisé par un administrateur pour débloquer le compte: * si ''TRUE'' : l'utilisateur doit changer son mot de passe avant la prochaine connexion (opération de **BIND** LDAP) * si ''FALSE'' : le compte est débloqué et l'utilisateur n'a pas à changer son mot de passe * **pwdUniqueAttempts :** attribut multivalué, accessible en lecture uniquement, listant le mot de passe haché et la date et heure de chaque tentative de connexion consécutive en échec avec un même mot de passe. Cet attribut n'est présent et utilisé que si ''pwdMaxTotalAttempts>0'' ===== Déblocage d'un compte ===== Si un compte d'utilisateur est verrouillé (lorsque ''pwdLockout==TRUE'' dans la politique de mot de passe), il peut être déverrouillé par un administrateur en utilisant l'une des procédures suivantes: - Supprimez l'attribut **pwdAccountLockedTime** : Cette procédure permet à l'utilisateur de continuer à utiliser le mot de passe actuel et n'est efficace que si le mot de passe n'a pas expiré. - Ajoutez l'attribut **pwdReset** avec la valeur ''TRUE'' ou ''FALSE''. ''FALSE'' n'est efficace que si le mot de passe n'a pas expiré et a le même effet que la suppression de ''pwdAccountLockedTime''.