Gestion des mots de passe avec OpenLDAP

Type de cryptage utilisé

Par défaut dans OpenLDAP le mot de passe utilisateur (attribut usepassword) est stocké sans cryptage.

Si on modifie le mot de passe via un fichier LDIF, on aura donc le mot de passe en clair dans l'annuaire, ce qui n'est pas sécurisé.

On peut également appliquer un algorithme de cryptage en amont (dans l'application cliente) et le transmettre à OpenLDA, qui va le stocker tel quel.

Il est possible de déclarer, via l'attribut olcPasswordHash, un ou plusieurs types de hash acceptables, utilisés dans la génération des mots de passe stockés dans l'attribut userPassword. Le défaut est {SSHA} (Salted SHA1). (cf . http://linux.die.net/man/5/slapd-config).

Modification de la configuration

La modification de l'attribut s'effectue dans la "frontend" database, et héritée par les autres databases, via un fichier LDIF :

dn: olcDatabase={-1}frontend,cn=config 
changetype: modify 
add: olcPasswordHash 
olcPasswordHash: {SHA} 

Note : ceci ne veut pas dire que le mot de passe sera stocké crypté dans l'annuaire. Cela indique uniquement à OpenLDAP qu'il peut accepter tel ou tel cryptage en provenance d'un client.

Exemple de modification via un LDIF

On modifie le mot de passe de l'utilisateur via un fichier LDIF :

dn: uid=USER123,ou=users,dc=example,dc=com 
changetype: modify 
replace: userpassword 
userpassword: UnMotDePa55e 

Si on recherche via la commande ldapsearch l'entrée de l'annuaire, elle va renvoyer le mot de passe (codé en base64), que l'on peut décoder via la commandebase64 -d :

dn: uid=USER123,ou=users,dc=example,dc=com
objectClass: inetOrgPerson 
uid: USER123 
cn:  USER123 User 
displayName: USER123 User 
employeeNumber: USER123 
givenName: Test
userPassword:: VW5Nb3REZVBhNTVl 

# search result 

# numResponses: 2 
# numEntries: 1 

On décode le mot de passe donné en base64 :

# echo VW5Nb3REZVBhNTVl | base64 -d 
UnMotDePa55e
#

Modification via un LDAPbrowser

Si on modifie l'entrée via LDAPBrowser (mot de passe = Password) et qu'on fait la même recherche ldapsearch, le résultat est quelque peu différent :

dn: uid=USER123,ou=users,dc=example,dc=com
objectClass: inetOrgPerson 
uid: USER123 
cn:  USER123 User 
displayName: USER123 User 
employeeNumber: USER123 
givenName: Test
userPassword:: e1NIQX1pK1BKUTdGZ24vKy94UnF0Wm0wS0JLMzRQSjA9 

# search result 

# numResponses: 2 
# numEntries: 1 

Si on essaye de décoder le mot de passe depuis le format base64, on obtient le contenu de l'attribut userPassword 

# echo e1NIQX1pK1BKUTdGZ24vKy94UnF0Wm0wS0JLMzRQSjA9 | base64 -d 
{SHA}i+PJQ7Fgn/+/xRqtZm0KBK34PJ0=
#

Le mot de passe a été encodé par l'application cliente (LDAPbrowser) et stocké en SHA dans l'annuaire.

Il est cependant possible d'avoir un cryptage systématique, en utilisant l'overplayPasswordPolicy

Overlay Password Policy

Cet overlay disponible pour OpenLDAP permet de gérer les politiques de mots de passe pour une database donnée.

On peut donc avoir une politique de mot de passe par défaut différente par database (root Suffix), sachant qu'on peut également avoir une politique de mot de passe liée à un objet de l'annuaire.

Ajout de l'overlay

L'ajout de cet overlay s'effectue au niveau de la configuration globale. La modification peut s'effectuer dynamiquement via un fichier LDIF :

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy

Configuration au niveau de la database

La configuration de l'overlay se fait au niveau de chaque database. Dans notre exemple, elle porte le numéro 3 (valider par rapport à votre installation dans /etc/openldap/slapd.d/cn=config).

dn: olcOverlay=ppolicy,olcDatabase={3}bdb,cn=config 
objectClass: olcConfig 
objectClass: olcOverlayConfig 
objectClass: olcPpolicyConfig 
olcOverlay: ppolicy 
olcPPolicyDefault: cn=default,ou=policies,dc=example,dc=com
olcPPolicyUseLockout: TRUE 
olcPPolicyHashCleartext: TRUE 

Les attributs intéressants sont :

  • olcPPolicyDefault : définit la politiques de mot de passe par défaut qui sera utilisée
  • olcPPolicyUseLockout : définit si on bloque le compte en cas de défaut de mot de passe
  • olcPPolicyHashCleartext : définit si les mots de passe en clair doivent être cryptés.

C'est ce dernier paramètre qui permet de crypter automatiquement les mots de passe passés en clair, par exemple via un fichier LDIF.

Définition d'une politique de mots de passe

La définition d'une politique de mots de passe s'effectue également par un fichier LDIF. On a une seule politique par défaut mais on peut utiliser une politique sur un objet.

Exemple de policy par défaut

dn: cn=default,ou=policies,dc=example,dc=com
objectClass: top 
objectClass: device 
objectClass: pwdPolicy 
cn: default 
pwdAttribute: userPassword 
pwdMaxAge: 7776000 
pwdMinAge: 86400 
pwdExpireWarning: 864000 
pwdInHistory: 4 
pwdMinLength: 8 
pwdMaxFailure: 5 
pwdLockout: TRUE 
pwdLockoutDuration: 900 
pwdGraceAuthNLimit: 5 
pwdFailureCountInterval: 0 
pwdMustChange: TRUE 
pwdAllowUserChange: TRUE 
pwdSafeModify: FALSE 
pwdCheckQuality: 1 

La signification des attributs est :

  • pwdMaxAge : age maximal du mot de passe en secondes
  • pwdMinAge : age minimal du mot de passe en secondes
  • pwdExpireWarning : durée de prévention du futur changement de mot de passe
  • pwdExpireWarning : durée de prévention du futur changement de mot de passe
  • pwdInHistory: nombre de mots de passe dans l'historique
  • pwdMinLength: longueur minimale du mot de passe
  • pwdMaxFailure: nombre d'échecs de saisie du mot de passe maximal (avant blocage)
  • pwdLockout: indique si on bloque le compte au bout de X échecs
  • pwdLockoutDuration: durée du blocage du compte (en secondes)
  • pwdGraceAuthNLimit: période de grâce suite à l'expiration du mot de passe
  • pwdMustChange: indique si l'utilisateur doit changer son mot de passe
  • pwdAllowUserChange: indique si l'utilisateur peut changer son mot de passe
  • pwdSafeModify: indique si il faut envoyer l'ancien mot de passe avec le nouveau pour modification
  • pwdCheckQuality: 1 = indique si OpenLDAP renvoie une erreur si le mot de passe n'est pas conforme

Exemple de politique pour des comptes de service

Dans le cas de comptes de services, il est plus prudent de ne pas avoir d'expiration de compte.

dn: cn=servicesaccounts, ou=policies, dc=example,dc=com
cn: servicesaccounts 
objectClass: top 
objectClass: device 
objectClass: pwdPolicy 
pwdAllowUserChange: TRUE 
pwdAttribute: userPassword 
pwdExpireWarning: 0 
pwdFailureCountInterval: 0 
pwdGraceAuthNLimit: 5 
pwdLockout: FALSE 
pwdLockoutDuration: 0 
pwdInHistory: 0 
pwdMaxAge: 0 
pwdMaxFailure: 0 
pwdMinAge: 0 
pwdMinLength: 15 
pwdMustChange: FALSE 
pwdSafeModify: FALSE 

Les principales différences portent sur les durées (pas d'expiration), sur le blocage (pas de blocage). Par contre la longueur du mot de passe est passée à 15 caractères.

Affectation d'une politique de mot de passe à un compte

On peut affecter une politique de mots de passe spécifique à un compte via un LDIF :

dn: uid=USER123,ou=users,dc=example,dc=com
changetype: modify
replace: pwdPolicySubEntry
pwdPolicySubEntry: cn=servicesaccounts, ou=policies, dc=example,dc=com
Catégorie
Tag