OpenLDAP - LastBind Overlay

La question qui se pose est : pourquoi mémoriser la date de dernière authentification ?

Le principal intérêt est de mettre en place un premier niveau de gouvernance : cette date permet d'identifier les comptes qui sont obsolètes dans l'annuaire, par exemple qui n'ont pas été utilisés pour s'authentifier depuis plusieurs mois.

Par défaut, cette information n'est pas disponible sur OpenLDAP (comme cela peut l'être dans un AD).

On peut analyser les logs systèmes (avec un niveau de log OpenLDAP à 256), mais ce n'est pas optimal.

Dans les modules (overlay) disponibles en standard, il n'en existe pas qui puisse nous servir.

Parmi les modules développés par des tiers, il y a l'overlay lastbind.

Cet article décrit la mise en place de ce module, sur la base du RPM fournit par Clément Oudot sur LDAP Toolbox.
 

Note : depuis les versions 2.5 et 2.6 de OpenLDAP, cette fonctionnalité semble implémentée directement dans les sources, et ne nécessite donc plus d'ajouter l'overlay.

Initialisation

Note : les tests ont été réalisés sur une CentOS 7, sur laquelle l'installation OpenLDAP a été faite via les packages :

yum install openldap-servers openldap-clients

La version OpenLDAP est la 2.4.44, et les overlay sont en version 2.4.58, mais sont compatibles (au moins pour le lastbind qui nous intéresse)

Récupérer les binaires de l'overlay

Note : au lieu d'installer via le RPM, on va juste extraire les composants qui nous intéressent, avec la commande rpm2cpio. On se positionne dans un répertoire temporaire, pour aller récupérer les binaires via wget.

cd /tmp
wget https://ltb-project.org/archives/openldap-ltb-2.4.58-el7-64.tar.gz 
mkdir LTB
cd LTB
tar zxf ../openldap-ltb-2.4.58-el7-64.tar.gz
rpm2cpio openldap-ltb-contrib-overlays-2.4.58-1.el7.x86_64.rpm |cpio -t
rpm2cpio openldap-ltb-contrib-overlays-2.4.58-1.el7.x86_64.rpm |cpio -ivd ./usr/local/openldap/libexec/openldap/lastbind*
cp ./usr/local/openldap/libexec/openldap/lastbind* /usr/lib64/openldap/ 

On peut démarrer l'annuaire si ce n'est déjà fait

systemctl start slapd 

On prépare les fichiers LDIF pour la configuration :

cat overlays.ldif
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib64/openldap/
olcModuleLoad: lastbind.la
olcModuleLoad: memberof.la
olcModuleLoad: ppolicy.la
olcModuleLoad: syncprov.la 

On modifie la configuration pour ajouter cet overlay :

ldapadd -Y EXTERNAL -H ldapi:/// -f overlays.ldif 

On active ensuite l'overlay pour notre database. On ajoute le paramètre de précision, 3600 = 1 heure. C'est à dire que si j'ai plusieurs connexions en moins d"une heure, seule la première sera stockée. Si on veut uniquement une indication que l'utilisateur s'est connecté, on peut augmenter à une fois par jour. Je vous laisser faire le calcul (24 * 3600).

cat lastbind-config.ldif
dn: olcOverlay=lastbind,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcLastBindConfig
olcOverlay: lastbind
olcLastBindPrecision: 3600 

ldapadd -Y EXTERNAL -H ldapi:/// -f lastbind-config.ldif

Tests

On va charger un utilisateur, via un fichier LDIF:

cat bob.ldif

dn: cn=bob,ou=people,dc=my-domain
objectclass: top
objectclass: person
objectclass: organizationalperson
cn: bob
sn: eponge
userPassword: Cartoon2021

ldapadd -x -D "cn=manager,dc=my-domain" -w MyPassWord -f bob.ldif

On se connecte ensuite avec bob (par exemple via un Search)

ldapsearch -D 'cn=bob,ou=people,dc=my-domain' -w Cartoon2021 -b "dc=my-domain" cn=b* 

On peut ensuite récupérer la valeur de l'attribut opérationnel. Dans l'exemple, l'utilisateur steeve ne s'est jamais connecté :

ldapsearch -x -LL -D cn=manager,dc=my-domain -w MDP2ldap -b dc=my-domain '(objectclass=person)' authtimestamp version: 1 dn: cn=bob,ou=people,dc=my-domain
authTimestamp: 20210510202818Z

dn: cn=steeve,ou=people,dc=my-domain 

Si on refait une connexion, après plus de 60 minutes, on voit que l'attribut est mis à jour.

ldapsearch -x -LL -D cn=manager,dc=my-domain -w MDP2ldap -b dc=my-domain '(cn=bob)' authtimestamp version: 1
dn: cn=bob,ou=people,dc=my-domain
authTimestamp: 20210510202818Z

date
lun. mai 10 23:38:53 CEST 2021 

ldapsearch -D 'cn=bob,ou=people,dc=my-domain' -w Cartoon2021 -b "dc=my-domain" cn=b*
ldapsearch -x -LL -D cn=manager,dc=my-domain -w MDP2ldap -b dc=my-domain '(cn=bob)' authtimestamp version: 1
dn: cn=bob,ou=people,dc=my-domain
authTimestamp: 20210510213902Z 

 

 

Tags
Catégorie