Quatrième partie de la série de tuto sur OpenLDAP consacrée à la modification des données.
Après avoir vu l’installation, les overlays et inséré nos premières données, voyons maintenant comment les modifier.
Avant tout, rappelons que nous pouvons en gros séparer les objets que nous manipulons en quatre familles (il y en a plus, mais je fais simple)
Les schémas (nous verrons cela en détail dans un autre article)
Les OU, qui sont des conteneurs.
Les entrées : groupes, utilisateur, etc…
Les attributs, rattachés aux entrées.
I – Préparatif rapide
Nous allons utiliser énormément les commande ldapsearch et ldapmodify.
Du coup, afin d’aller plus vite nous allons créer des alias.
Éditez le fichier /root/.bashrc pour y ajouter :
alias lmodif='ldapmodify -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap' alias lsearch='ldapsearch -xLLL -H ldap://localhost -D cn=admin,dc=debugo,dc=fr -y /root/pwdldap' alias ladd='ldapadd -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap' alias ldel='ldapdelete -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap'
Puis pour recharger le fichier :
# source ~/.bashrc
Dorénavant, il n’y aura plus tout à saisir…
II – OU
Tout d’abord, listons ce qui est présent
# lsearch -b "dc=debugo,dc=fr" "objectClass=organizationalUnit"
A – Ajout d’une OU
Je vais profiter de cette partie sur les OU pour expliquer les trois commandes à notre disposition pour modifier les données de l’annuaire : ldapadd, ldapmodify et ldapdelete.
ldapadd est un alias de ldapmodify -a, le commutateur -a indiquant un ajout. Ce commutateur peut être remplacé par la ligne changetype: add dans le fichier ldif.
Ainsi, pour ajouter une OU par ex avec le fichier addou.ldif :
dn: ou=test,ou=people,dc=debugo,dc=fr ou: test objectClass: organizationalUnit
Injection :
# ldapadd -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap -f addou.ldif
ou
# ldapmodify -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap -a -f addou.ldif
Autre méthode avec le ficher addou.ldif :
dn: ou=test,ou=people,dc=debugo,dc=fr changetype: add ou: test objectClass: organizationalUnit
Injection
# ldapmodify -cxWD cn=admin,dc=debugo,dc=fr -y /root/pwdldap -f addou.ldif
Ces trois façons de faire donnent le même résultat.
L’avantage de tout faire par ex avec ldapmodify est que l’on peut effectuer plusieurs opérations en un fichier, le tout étant de laisser une ligne avec – entre chaque opération.
Exemple avec le fichier test.ldif :
dn: ou=test,ou=people,dc=debugo,dc=fr changetype: add ou: test objectClass: organizationalUnit - dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr changetype: delete
Dans ce fichier, nous ajoutons une OU puis nous supprimons un utilisateur. Il n’y a pas de limite d’opérations que l’on peut effectuer en une fois.
B – Modification d’une OU
Nous renommons l’OU test en newtest avec le fichier chgou.ldif :
dn: ou=test,ou=people,dc=debugo,dc=fr changetype: modrdn newrdn: ou=newtest deleteoldrdn: 1
Injection :
# lmodif -f chgou.ldif
C – Déplacement d’une OU
Nous déplaçons l’OU newtest de la branche ou=people,dc=debugo,dc=fr vers la branche ou=workgroup,ou=group,dc=debugo,dc=fr avec le fichier mvou.ldif :
dn: ou=newtest,ou=people,dc=debugo,dc=fr changetype: modrdn newrdn: ou=newtest deleteoldrdn: 1 newsuperior: ou=workgroup,ou=group,dc=debugo,dc=fr
Injection :
# lmodif -f mvou.ldif
D – Suppression d’une OU
Il est nécessaire qu’elle soit vide.
Supprimons l’OU newtest avec le fichier deleteou.ldif :
dn: ou=newtest,ou=workgroup,ou=group,dc=debugo,dc=fr changetype: delete
Injection :
# lmodif -f deleteou.ldif
Ou bien un fichier deleteou.ldif :
ou=newtest,ou=workgroup,ou=group,dc=debugo,dc=fr
Injection :
# ldel -f deleteou.ldif
III – Modification d’entrées
Dans notre cas, les entrées sont de deux types, les users et les groupes.
Listons les groupes :
# lsearch -b "dc=debugo,dc=fr" "objectClass=groupOfNames"
Listons les users :
# lsearch -b "dc=debugo,dc=fr" "objectClass=InetOrgPerson"
A – Ajout
1 – Ajout d’un utilisateur
Ajoutons un utilisateur toto avec le fichier adduser.ldif :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: toto sn: toto givenName: toto cn: toto displayName: toto userPassword: password
Injection :
# ladd -f adduser.ldif
2 – Ajout d’un groupe
Ajoutons un groupe test avec le fichier addgrp.ldif :
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr cn: test description: test objectClass: groupOfNames member: cn=admin,dc=debugo,dc=fr
Injection :
# ladd -f addgrp.ldif
B – Déplacement
1 – Déplacement d’un utilisateur
Déplaçons toto de ou=debugo,ou=people,dc=debugo,dc=fr vers ou=client,ou=people,dc=debugo,dc=fr avec le fichier mvuser.ldif :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr changetype: modrdn newrdn: uid=toto deleteoldrdn: 1 newsuperior: ou=client,ou=people,dc=debugo,dc=fr
Injection :
# lmodif -f mvuser.ldif
2 – Déplacement d’un groupe
Déplaçons le groupe test de ou=workgroup,ou=group,dc=debugo,dc=fr vers ou=sysgroup,ou=group,dc=debugo,dc=fr avec le fichier mvgrp.ldif :
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr changetype: modrdn newrdn: cn=test deleteoldrdn: 1 newsuperior: ou=sysgroup,ou=group,dc=debugo,dc=fr
Injection :
# lmodif -f mvgrp.ldif
C – Renommage
1 – Renommage d’un utilisateur
Renommons toto en tata avec le fichier renameuser.ldif :
dn: uid=toto,ou=client,ou=people,dc=debugo,dc=fr changetype: modrdn newrdn: uid=tata deleteoldrdn: 1
Injection
# lmodif -f renameuser.ldif
Ceci ne change que le nom de l’entrée dn: uid=tata,ou=client,ou=people,dc=debugo,dc=fr. Les autres attributs (cn, sn, etc..) s’ils doivent être renommés seront modifiés par une autre opération (voir plus bas).
2 – Renommage d’un groupe
Renommons le groupe test en newtest avec le fichier renamegrp.ldif :
dn: cn=test,ou=sysgroup,ou=group,dc=debugo,dc=fr changetype: modrdn newrdn: cn=newtest deleteoldrdn: 1
Injection
# lmodif -f renamegrp.ldif
D – Suppression
1 – Suppression d’un utilisateur
Supprimons l’utilisateur tata à l’aide d’un fichier deluser.ldif :
dn: uid=tata,ou=client,ou=people,dc=debugo,dc=fr changetype: delete
Injection
# lmodif -f deluser.ldif
On aurait pu aussi directement faire :
# ldel uid=tata,ou=client,ou=people,dc=debugo,dc=fr
2 – Suppression d’un groupe
Supprimons le groupe newtest à l’aide d’un fichier delgrp.ldif :
dn: cn=newtest,ou=sysgroup,ou=group,dc=debugo,dc=fr changetype: delete
Injection
# lmodif -f delgrp.ldif
Ou bien :
# ldel cn=newtest,ou=sysgroup,ou=group,dc=debugo,dc=fr
IV – Modification d’attributs
Nous allons réinsérer un utilisateur test et un groupe test avant tout :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: toto sn: toto givenName: toto cn: toto displayName: toto userPassword: password
Injection :
# ladd -f adduser.ldif
Puis :
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr cn: test description: test objectClass: groupOfNames member: cn=admin,dc=debugo,dc=fr
Injection :
# ladd -f addgrp.ldif
A – Ajout
1 – Utilisateur
Listons les attributs à notre disposition :
# lsearch -b "cn=schema,cn=config" olcAttributeTypes
Ou plus précises ment du schéma core :
# lsearch -b "cn={0}core,cn=schema,cn=config" olcAttributeTypes
Ajoutons un attribut description à notre utilisateur toto avec un fichier addattribute.ldif :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr changetype: modify add: description description: Sa tete est egale a zero plus zero !
Injection :
# lmodif -f addattribute.ldif
Et on peut vérifier l’ajout :
# lsearch -b "dc=debugo,dc=fr" uid=toto
2 – Groupe
Regardons ce que propose la classe groupOfNames (dans le schéma core)
# lsearch -b "cn={0}core,cn=schema,cn=config" olcObjectClasses
On va trouver :
olcObjectClasses: {7}( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of n ames (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )
Pour un groupe, ce qui est le plus fréquent d’ajouter comme attribut, c’est un utilisateur (ajout d’un membre dans un groupe…)
Bref, ajoutons donc notre utilisateur test dans le groupe test avec un fichier addusertogroup.ldif :
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr changetype: modify add: member member: uid=toto,ou=client,ou=people,dc=debugo,dc=fr
Injection :
# lmodif -f addusertogroup.ldif
On peut vérifier :
# lsearch -b "dc=debugo,dc=fr" "(&(objectclass=inetOrgPerson)(memberof=cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr))" dn
Si on regarde la fiche de toto :
# lsearch -b "dc=debugo,dc=fr" "uid=toto"
On constater qu’on ne voit pas l’attribut memberof (overlay que nous avons pourtant configuré. En effet, il faut le demander spécifiquement :
# lsearch -b "dc=debugo,dc=fr" "uid=toto" memberof
Ou alors, nous pouvons le voir avec cette commande :
# lsearch -b "dc=debugo,dc=fr" "uid=toto" +
B – Modification
1 – Utilisateur
Un attribut qui peut etre modifié fréquement sur un utilisateur, c’est le mot de passe. Modifions donc le mot de passe de toto avec un fichier chgpwd.ldif :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr changetype: modify replace: UserPassword UserPassword: newpass
Injection :
# lmodif -f chgpwd.ldif
Ceci dit, pour modifier un mot de passe, nous avons la commande ldappassword consacré à cet usage :
# ldappasswd -H ldap://localhost -D "uid=niko,ou=debugo,ou=people,dc=debugo,dc=fr" -W -S
-W pour la demande de l’ancien mot de passe.
-S pour la demande d’un nouveau mot de passe (sinon, le nouveau mot de passe est généré aléatoirement)
Cette commande peut également servir à changer le mot de passe d’un autre utilisateur, par exemple, le compte admin demande à changer le mot de passe de l’utilisateur niko :
# ldappasswd -D "cn=admin,dc=debugo,dc=fr" -w passsadmin -x "uid=niko,ou=debugo,ou=people,dc=debugo,dc=fr" -S
2 – Groupe
Modifions la description de notre groupe test avec un fichier chgattr.ldif :
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr changetype: modify replace: description description: Nouvelle description
Injection :
# lmodif -f chgattr.ldif
C – Suppression
1 – Utilisateur
Supprimons l’attribut description de toto avec un fichier delattr.ldif :
dn: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr changetype: modify delete: description
Injection :
# lmodif -f delattr.ldif
2 – Groupe
Pour un groupe, vous vous en doutez, un attribut qui peut etre amené à etre supprimé, c’est un membre. Supprimons donc toto du groupe test avec un ficher
dn: cn=test,ou=workgroup,ou=group,dc=debugo,dc=fr changetype: modify delete: member member: uid=toto,ou=debugo,ou=people,dc=debugo,dc=fr
Injection
# lmodif -f deluserfromgroup.ldif
Vérification :
# lsearch -b "dc=debugo,dc=fr" "(&(objectclass=groupOfNames)(cn=test))" member
V – Conclusion
Voila qui termine ce long article. J’aurais pu faire plus court, certaines manipulation étant au final tres similaire, mais j’ai ainsi voulu couvrir de nombreuses applications que vous pouvez être amenés à rencontrer.
Dans le chapitre suivant, nous allons parler sauvegarde et restauration.
Bonjour, et merci pour vos tutos et explications.
Lorsque vous créez les alias, est-ce que le mot de passe contenu dans /root/pwdldap soit être encodé?
Merci
Bonjour !
Merci pour les compliments 😉
Non, le mot de passe doit être en clair (d’où les permissions restrictives dessus)
Bonjour,
Merci pour ces tutos très clairs.
Prévoyez-vous de développer la gestion des annuaires OpenLDAP avec GLPI ?
Cela pourrait être très intéressant !
Bonne soirée
Bonjour.
Et de rien 😉
Oui, ça peut se faire, mais ce n’est pas dans les priorités du moment.
Mais pas de panique, ça intègre ma todolist 😉