Password Policy
1. Présentation
Cette fonctionnalité permet d’appliquer une politique de mots de passe et de sécuriser l’utilisation des comptes liés aux entrées de l’annuaire contenant l’attribut userPassword.
L’ajout de cette fonctionnalité permettra de renforcer la sécurité en :
	•	Appliquant une longueur minimale aux nouveaux mots de passe.
	•	S’assurant que les mots de passe ne sont pas trop fréquemment changés.
	•	S’assurant que les mots de passe expirent, fournissent des avertissements avant qu’ils ne soient modifiés et autorisent un nombre autorisé de connexions "gracetime" afin de permettre à leur utilisateur de le changer après leur expiration.
	•	Maintenant un historique des mots de passe utilisés afin d’empêcher leur réutilisation.
	•	Effectuant des contrôles sur la qualité des mots de passe.
	•	Empêchant l’utilisation d’un compte par "verrouillage" de celui-ci, de manière définitive ou après une période de temps spécifiée, après constatation de tentatives d’authentification infructueuse.
	•	Forçant un mot de passe à changer lors de la prochaine authentification.
	•	Ayant la possibilité de définir un verrou administratif sur un compte.
¬
Cet "overlay" permet d’appliquer plusieurs stratégies de compte en fonction des entrées. Ainsi, il est possible d’appliquer une stratégie de compte "spécifique" avec un renouvellement des mots de passe tous les 90 jours à un groupe d’utilisateurs et une autre stratégie de compte sans renouvellement du mot de passe à un groupe d’utilisateurs de type administrateur.
2. Exemple de configuration
1.	Il faut tout d’abord charger le module "ppolicy.la" dans l’entrée :dn: cn=module{0},cn=config	
2.	Par ailleurs, cet overlay utilise un schéma spécifique qu’il faudra charger dans l’annuaire. Cependant, il devrait y être par défaut lors de l’installation du serveur OpenLDAP. Une simple vérification dans ce cas suffit :	
[root@ldap01 schema]# ldapsearch -h localhost -D cn=config -W -b 
"cn=schema,cn=config" -s one objectclass=olcSchemaConfig dn -LLL 
Enter LDAP Password: 
dn: cn={0}core,cn=schema,cn=config 
dn: cn={1}cosine,cn=schema,cn=config 
dn: cn={2}inetorgperson,cn=schema,cn=config 
dn: cn={3}nis,cn=schema,cn=config 
dn: cn={4}ppolicy,cn=schema,cn=config 
dn: cn={5}sudo,cn=schema,cn=config 
[root@ldap01 schema]#
3.	Puis, il faudra appliquer cette fonctionnalité au niveau de l’entrée de l’annuaire ciblé (ex. olcDatabase={1}hdb,cn=config) à l’aide d’une commande ldapadd avec les paramètres par défaut comme ci-dessous.	
dn: olcOverlay=ppolicy,olcDatabase={1}hdb,cn=config 
objectClass: olcOverlayConfig 
objectClass: olcPPolicyConfig 
olcOverlay: ppolicy 
olcPPolicyDefault:cn=passwordDefault,ou=Policies,dc=exemple,dc=com 
olcPPolicyHashCleartext: TRUE 
olcPPolicyUseLockout: TRUE 
olcPPolicyForwardUpdates: FALSE
Avec :
	•	olcPPolicyHashCleartext : indique si les mots de passe doivent être cryptés systématiquement. Ce paramètre devrait être à TRUE sauf cas exceptionnel.
	•	olcPPolicyUseLockout : indique si le message d’erreur retourné en cas de tentative de connexion à un compte verrouillé est un message spécifique à cet état de verrouillage (TRUE) ou un message général d’échec de connexion (InvalidCredentials) (FALSE). FALSE est plus sécurisé, car pas d’indication à un éventuel pirate, cependant la valeur TRUE est plus pratique.
	•	olcPPolicyDefault : indique la politique de mot de passe à appliquer par défaut à une entrée de l’annuaire qui possèderait un attribut de type userpasswd, dans le cas où aucune stratégie individuelle ne lui serait configurée. La valeur de cet attribut indique le nom distinctif contenant les paramètres de la politique de mots de passe.
4.	Il faut ensuite configurer la politique de gestion des mots de passe par défaut au travers de l’entrée désignée précédemment par l’attribut : olcPPolicyDefault: cn=passwordDefault,ou=Policies,dc=exemple,dc=com.	
Voici ci-après un exemple de configuration qui pourrait être appliqué au sein d’une entreprise désirant appliquer la norme ITCS104 réglementant l’utilisation des identifiants numériques.
dn: ou=Policies,dc=exemple,dc=com 
ou: Policies 
objectClass: organizationalUnit 
 
dn: cn=passwordDefault,ou=Policies,dc=exemple,dc=com 
objectClass: pwdPolicy 
objectClass: person 
objectClass: top 
cn: passwordDefault 
sn: passwordDefault 
pwdAttribute: userPassword 
pwdCheckQuality: 0 
pwdMinAge: 0         
pwdMaxAge: 7776000 
pwdMinLength: 8 
pwdInHistory: 5 
pwdMaxFailure: 3 
pwdFailureCountInterval: 0 
pwdLockout: TRUE 
pwdLockoutDuration: 0 
pwdAllowUserChange: TRUE 
pwdExpireWarning: 1209600 
pwdGraceAuthNLimit: 2 
pwdMustChange: TRUE 
pwdSafeModify: FALSE
Avec les attributs de configuration suivants :
	•	objectClass: pwdPolicy : permet d’utiliser les attributs spécifiques à la configuration de politiques de gestion des mots de passe.
	•	pwdAttribute: userPassword : permet d’identifier le nom de l’attribut password. Cependant dans OpenLDAP c’est la seule valeur acceptée.
	•	pwdCheckQuality: 0 : permet de contrôler la syntaxe du mot de passe et doit être couplé avec le paramètre pwdCheckModule. Cependant, ne fonctionne que si le mot de passe est stocké en clair dans l’annuaire... donc pas vraiment d’intérêt de le paramétrer.
	•	pwdMinAge : 0 : permet à l’utilisateur de changer autant de fois son mot de passe sans limite minimale dans le temps. Pour activer ce paramètre, indiquer la valeur limite souhaitée en secondes durant laquelle son changement sera impossible.
	•	pwdMaxAge : 7776000 : définit le temps d’utilisation maximum du mot de passe en seconde. La valeur "7776000" = 90 jours : cela signifie que le mot de passe doit être changé au bout de 90 jours (0 signifie qu’il n’expire jamais).
	•	pwdInHistory : 5 : permet de mémoriser les 5 derniers mots de passe utilisés pour ainsi forcer l’utilisateur à ne pas réutiliser le même mot de passe à chaque expiration de celui-ci.
	•	pwdMaxFailure : 3 : indique le nombre d’échecs de saisie du mot de passe au maximum avant de déclencher l’action définie par l’attribut pwdLockout. Ce paramètre est repositionné à 0 dès qu’une connexion est réussie avant bien entendu la limite définie.
	•	pwdLockout : TRUE : action prise lorsque le nombre de tentatives défini par l’attribut pwdMaxFailure a été atteint. La valeur "TRUE" signifie que le compte sera verrouillé, à l’inverse "FALSE" n’aura aucun impact sur ce dernier.
	•	pwdLockoutDuration : 0 : cet attribut est lié à la valeur de l’attribut pwdLockout=TRUE. Si la valeur est à 0 alors le compte est verrouillé jusqu’à ce qu’un administrateur le déverrouille. Une valeur >0 définit le nombre de secondes à attendre avant le déverrouillage automatique du compte.
	•	pwdAllowUserChange: TRUE : permet à un utilisateur de changer son mot de passe lui-même. Attention cependant à ce que les ACL le lui permettent (cf. chapitre Protection des données de l’annuaire).
	•	pwdExpireWarning: 1209600 : cet attribut signifie que l’utilisateur sera averti 14 jours avant l’expiration de son mot de passe. La valeur de cet attribut est en seconde d’où : 1209600 = 14 jours.
	•	pwdGraceAuthNLimit: 2 : cet attribut permet à l’utilisateur de s’authentifier deux fois après l’expiration de son mot de passe afin d’être en mesure de le changer. Dans le cas où il atteindrait la limite sans l’avoir modifiée, il devra s’en remettre à un administrateur pour cette fois-ci le changer.
	•	pwdMustChange: TRUE : oblige l’utilisateur à changer son mot de passe.
¬
Il est possible de trouver des informations sur ces attributs de configuration en tapant la commande : man slapo-ppolicy.
5.	L’application d’une seule politique de gestion des comptes et des mots de passe peut s’avérer problématique. En effet, celle qui a été définie précédemment s’appliquera à toutes les entrées de l’annuaire contenant l’attribut userPassword. Cela signifie qu’elle sera donc appliquée à tous les utilisateurs de l’annuaire, mais également aux utilisateurs de liaison (BindUser) utilisés par les agents/clients LDAP ou autres API LDAP des différents équipements, serveurs ou applications pour se connecter à l’annuaire. Si l’un de ces comptes venait à expirer, cela pourrait devenir (très) gênant, car cela bloquerait d’une part l’accès à ces éléments de haute importance, et d’autre part cela demanderait un travail plus ou moins considérable de reconfiguration des agents LDAP, problématique dans le cas d’une centaine de serveurs par exemple. Ainsi, il faut exclure ce type de compte de la politique de gestion des comptes et des mots de passe par défaut. Pour ce faire, OpenLDAP autorise l’utilisation de différentes politiques de gestion de compte et de mots de passe qu’il sera possible d’appliquer aux entrées de l’annuaire désirées.
Ainsi, afin de résoudre la problématique précédente, il faudra créer une nouvelle politique de gestion des comptes et des mots de passe contenus dans l’entrée dn: cn=bindusers,ou=Policies,dc=exemple,dc=com comme dans l’exemple ci-dessous :	
dn: cn=bindusers,ou=Policies,dc=exemple,dc=com 
objectClass: top 
objectClass: person 
objectClass: pwdPolicy 
cn: bindusers 
pwdAttribute: userPassword 
sn: bindusers 
pwdAllowUserChange: TRUE 
pwdCheckQuality: 0 
pwdExpireWarning: 0 
pwdFailureCountInterval: 0 
pwdGraceAuthNLimit: 2 
pwdInHistory: 5 
pwdLockout: FALSE 
pwdLockoutDuration: 0 
pwdMaxAge: 0 
pwdMaxFailure: 10 
pwdMinAge: 0 
pwdMinLength: 8 
pwdMustChange: TRUE 
pwdSafeModify: FALSE
Puis l’appliquer sur chaque entrée de l’annuaire définissant les utilisateurs de liaison utilisés par les équipements, serveurs et applications de l’entreprise. Dans l’exemple ci-dessous, l’attribut pwdPolicySubentry est ajouté à l’utilisateur de liaison dn: cn=linux,ou=binds,dc=exemple,dc=com qui est lui-même utilisé par tous les serveurs Linux de l’entreprise pour l’utilisation de l’annuaire. Cet attribut aura comme valeur le DN de l’entrée de la nouvelle politique de gestion des comptes et des mots de passe (cn=bindusers,ou=Policies,dc=exemple,dc=com).
[root@ldap01 ldif_files]# ldapmodify -D 
"cn=root,dc=exemple,dc=com"-W -f ppolicybinduser.ldif 
Enter LDAP Password: 
modifying entry " cn=linux,ou=binds,dc=exemple,dc=com" 
 
# Avec dans le fichier ’ppolicybinduser.ldif’ : 
 
[root@ldap01 ldif_files]# cat  ppolicybinduser.ldif 
DN: cn=linux,ou=binds,dc=exemple,dc=com  
changetype: modify 
add: pwdPolicySubentry 
pwdPolicySubentry:  cn=bindusers,ou=Policies,dc=exemple,dc=com
Il est aussi possible de vérifier quelles sont les entrées de l’annuaire possédant une politique de gestion des comptes et des mots de passe individuelle avec une simple requête LDAP comme dans l’exemple ci-dessous :
[root@ldap01 ~]# ldapsearch -h localhost -D 
"cn=root,dc=exemple,dc=com" -W -b "dc=exemple,dc=com" -s sub  
objectclass=* pwdPolicySubentry -LLL 
Enter LDAP Password: 
dn: dc=exemple,dc=com 
.... 
 
dn: ou=sudoers,dc=exemple,dc=com 
 
dn: ou=binds,dc=exemple,dc=com 
 
dn: cn=linux,ou=binds,dc=exemple,dc=com 
pwdPolicySubentry: cn=bindusers,ou=Policies,dc=exemple,dc=com 
 
dn: cn=op5,ou=binds,dc=exemple,dc=com 
pwdPolicySubentry: cn=bindusers,ou=Policies,dc=exemple,dc=com 
 
dn: cn=device,ou=binds,dc=exemple,dc=com 
pwdPolicySubentry: cn=bindusers,ou=Policies,dc=exemple,dc=com 
 
dn: cn=bindusers,ou=Policies,dc=exemple,dc=com
Pour résumer, il existe deux façons dont la politique de gestion des comptes et des mots de passe peut être appliquée à des objets individuels :
	•	Par l’attribut pwdPolicySubentry paramétré sur un objet utilisateur. Si la valeur de cette propriété spécifie le DN d’un objet de politique individuelle, alors celle-ci s’appliquera.
	•	S’il n’y a pas d’attribut PwdPolicySubentry spécifique pour un objet et qu’une politique par défaut existe, alors c’est cette dernière qui s’appliquera à cet objet.
¬
Que se passe-t-il si un système est soumis à une politique de gestion des mots de passe locale et à celle d’un annuaire ? C’est très simple, la politique locale des mots de passe s’appliquera aux comptes locaux et la politique contenue dans l’annuaire impactera les comptes de l’annuaire.