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