Comment utiliser des fichiers LDIF pour apporter des modifications à un système OpenLDAP

introduction

LDAP est un protocole de gestion et d’interaction avec les services d’annuaire. Le projet OpenLDAP fournit un service d'annuaire compatible LDAP pouvant être utilisé pour stocker et fournir une interface aux données d'annuaire.

Dans ce guide, nous aborderons le format de fichier LDIF utilisé pour communiquer avec les annuaires LDAP. Nous discuterons des outils que vous pouvez utiliser pour traiter ces fichiers et modifier l’arborescence des informations de répertoire LDAP en fonction des commandes spécifiées.

Conditions préalables

Avant de commencer ce guide, vous devez avoir accès à un serveur OpenLDAP. Vous pouvez apprendre comment configurer un serveur OpenLDAPhere. Vous devez être familiarisé avec la terminologie de base utilisée lorsque vous travaillez avec un service d'annuaire LDAP. This guide peut être utilisé pour se familiariser avec ces sujets.

Format LDIF

LDIF, ou Format d'échange de données LDAP, est un format de texte permettant de représenter les données et les commandes LDAP. Lorsque vous utilisez un système LDAP, vous utiliserez probablement le format LDIF pour spécifier vos données et les modifications que vous souhaitez apporter à LDAP DIT.

LDIF est conçu pour pouvoir décrire toute entrée dans un système LDAP, ainsi que toutes les modifications qui doivent avoir lieu. De ce fait, la syntaxe est très précise et peut sembler complexe dans un premier temps. À l'aide de LDIF, les modifications LDAP sont simplement écrites dans des fichiers avec un nom arbitraire, puis introduites dans le système LDAP à l'aide de l'une des commandes de gestion disponibles.

LDIF fonctionne en utilisant un système de base clé-valeur, avec une instruction par ligne. La clé se trouve à gauche d'une ligne suivie de deux points (:) et d'un espace. L'espace est important pour que la ligne soit lue correctement. La valeur est ensuite assignée du côté droit. Ce format fonctionne bien pour la syntaxe LDAP lourde d’attributs, mais peut également être utilisé pour émettre des commandes et fournir des instructions sur la manière dont le contenu doit être interprété.

Plusieurs lignes peuvent être utilisées pour fournir des valeurs longues pour l'attribut en commençant les lignes supplémentaires par un seul espace. LDAP les rejoindra lors du traitement de l'entrée.

Ajout d'entrées au DIT

Il existe deux manières principales de spécifier une nouvelle entrée dans un fichier LDIF. La méthode la mieux adaptée à vos besoins dépend des types de modifications avec lesquelles vous devez vous coordonner. La méthode que vous choisissez dictera les outils et arguments que vous devez utiliser pour appliquer les modifications au LDAP DIT (arborescence des informations de répertoire).

Liste des entrées à ajouter au DIT

La méthode la plus élémentaire pour définir de nouvelles entrées à ajouter à LDAP consiste simplement à les répertorier dans leur intégralité, exactement comme elles seraient affichées à l’aide des outils LDAP. Cela commence par le DN (nom distinctif) où l'entrée sera créée, après l'indicateurdn::

dn: ou=newgroup,dc=example,dc=com

Dans la ligne ci-dessus, nous référons quelques paires clé-valeur afin de construire le nom distinctif pour notre nouvelle entrée. Lorsque les valeurs d'attributsetting, vous devez utiliser les deux points et l'espace. Lorsquereferencing attributs / valeurs, un signe égal doit être utilisé à la place.

Dans le format LDIF le plus simple pour ajouter des entrées à un fichier DIT, le reste de l'entrée est simplement écrit en utilisant ce format sous la définition du nom distinctif. Les déclarations et les attributs objectClass nécessaires doivent être définis pour créer une entrée valide. Par exemple, pour créer une unité organisationnelle contenant les entrées des employés de notre organisation, nous pourrions utiliser ceci:

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

Vous pouvez ajouter plusieurs entrées dans un seul fichier. Chaque entrée doit être séparée par au moins une ligne entièrement vierge:

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=othergroup,dc=example,dc=com
objectClass: organizationalUnit
ou: othergroup

Comme vous pouvez le constater, ce format LDIF reflète presque exactement le format que vous verriez lorsque vous interrogez une arborescence LDAP pour des entrées avec ces informations. Vous pouvez très bien écrire ce que vous voudriez que l’entrée contienne mot pour mot.

Utilisation de «Changetype: Add» pour créer de nouvelles entrées

Le deuxième format que nous examinerons fonctionnera bien si vous apportez d’autres modifications dans le même fichier LDIF. OpenLDAP fournit des outils capables de gérer les ajouts et les modifications. Par conséquent, si nous modifions d'autres entrées dans le même fichier, nous pouvons marquer nos nouvelles entrées comme des ajouts afin qu'elles soient traitées correctement.

Cela ressemble beaucoup à la méthode ci-dessus, mais nous ajoutonschangetype: add directement en dessous de la spécification DN. Par exemple, nous pourrions ajouter une entrée John Smith à un DIT qui contient déjà la structureou=People,dc=example,dc=com en utilisant un LDIF comme celui-ci:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
  manager of the building project, so contact him with any que
 stions.
cn: John Smith
sn: Smith
uid: jsmith1

C'est en gros le format que nous avons utilisé pour décrire les entrées jusqu'à présent, à l'exception d'une ligne supplémentaire après la spécification du nom distinctif. Ici, nous disons à LDAP que le changement que nous apportons est une création d’entrée. Puisque nous utilisons l'optionchangetype, cette entrée peut être traitée par l'outilldapmodify sans problème, ce qui nous permet de placer des modifications d'autres types dans le même fichier LDIF. L'optionchangetype doit venir immédiatement après la spécification DN.

Une autre chose à noter ci-dessus est l'utilisation d'une valeur multiligne pour l'attributdescription. Comme les lignes qui suivent commencent par un espace, elles seront jointes à l’espace supprimé. Notre première ligne de continuation dans notre exemple contient un espace supplémentaire, mais cela fait partie de la phrase elle-même, séparant les mots «projet» et «responsable».

Comme avec la dernière section, chaque entrée supplémentaire dans le même fichier est séparée par une ligne vide. Les commentaires peuvent être utilisés en commençant la ligne par un caractère#. Les commentaires doivent exister sur leur propre ligne. Par exemple, si nous voulions ajouter Sally dans ce même fichier LDIF, nous pourrions séparer les deux entrées de la manière suivante:

# Add John Smith to the organization
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
  manager of the building project, so contact him with any qu
 estions.
cn: John Smith
sn: Smith
uid: jsmith1

# Add Sally Brown to the organization
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
 e for designing the blue prints and testing the structural int
 egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20

Traitement des ajouts d'entrée

Maintenant que nous savons comment construire des fichiers LDIF pour ajouter de nouvelles entrées, nous devons les traiter avec des outils LDAP pour les ajouter à la DIT. L'outil et / ou les arguments que vous utiliserez dépendront du formulaire que vous avez choisi ci-dessus.

Si vous utilisez le format d'entrée simple (sans le paramètrechangetype), vous pouvez utiliser la commandeldapadd ou la commandeldapmodify avec l'indicateur-a, qui spécifie une entrée une addition. Vous devrez soit utiliser une méthode SASL pour vous authentifier auprès de l'instance LDAP (cela sort du cadre de ce guide), ou vous lier à un compte administratif dans votre DIT et fournir le mot de passe requis.

Par exemple, si nous stockions nos entrées de la section d'entrée simple dans un fichier appelénewgroups.ldif, la commande dont nous aurions besoin pour traiter le fichier et ajouter les nouvelles entrées ressemblerait à ceci:

ldapadd -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif

Vous pouvez également utiliser la combinaisonldapmodify -a pour le même résultat:

ldapmodify -a -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif

Si vous utilisez le formatsecond, avec la déclarationchangetype, vous voudrez utiliser la commandeldapmodify sans l'indicateur-a. Comme cette commande et ce format fonctionnent pour la plupart des autres modifications, il est probablement plus facile à utiliser pour la plupart des modifications. Si nous stockions les deux nouveaux ajouts d'utilisateurs dans un fichier appelénewusers.ldif, nous pourrions l'ajouter à notre DIT existant en tapant quelque chose comme ceci:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newusers.ldif

Cela vous permettra d'ajouter des entrées à votre DIT à volonté. Vous pouvez facilement stocker plusieurs entrées dans un seul fichier LDIF et renseigner votre DIT en une seule commande.

Supprimer des entrées du DIT

Nous avons eu notre premier aperçu de l'optionchangetype dans la dernière section. Cette option fournit la méthode permettant de spécifier le type de modification de haut niveau que nous souhaitons apporter. Pour une suppression d’entrée, la valeur de cette option est «supprimer».

La suppression d'une entrée est en fait le changement le plus direct que vous puissiez effectuer, car la seule information nécessaire est le DN.

Par exemple, si nous voulions supprimer l'entréeou=othergroup de notre DIT, notre fichier LDIF n'aurait besoin que de contenir ceci:

dn: ou=othergroup,dc=example,dc=com
changetype: delete

Pour traiter la modification, vous pouvez utiliser le format exact utilisé avecldapmodify ci-dessus. Si nous appelons le fichier avec la demande de suppressionrmothergroup.ldif, nous l'appliquerons comme ceci:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f rmothergroup.ldif

Cela supprimera immédiatement l'entréeou=othergroup du système.

Modification des attributs d’une entrée

La modification des attributs d'une entrée est une modification très courante à faire et est rendue possible en spécifiantchangetype: modify après le DN de l'entrée. Les types de modifications que vous pouvez apporter aux attributs reflètent généralement les modifications que vous pouvez apporter à une entrée elle-même. Pour cette raison, les détails du type de changement d'attribut demandé sont spécifiés ultérieurement à l'aide de directives supplémentaires.

Ajouter un attribut à une entrée

Par exemple, vous pouvez ajouter un attribut en utilisant la commandeadd: aprèschangetype: modify. Cela devrait spécifier l'attribut que vous souhaitez ajouter. Vous définirez ensuite la valeur de l'attribut comme d'habitude. Le format de base serait donc:

dn: entry_to_add_attribute
changetype: modify
add: attribute_type
attribute_type: value_to_set

Par exemple, pour ajouter des adresses électroniques à nos comptes, nous pourrions avoir un fichier LDIF ressemblant à ceci:

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]
mail: [email protected]

Comme vous pouvez le constater à partir de la deuxième entrée, vous pouvez spécifier plusieurs ajouts en même temps. L'attributmail autorise plusieurs valeurs, c'est donc permis.

Vous pouvez traiter cela avecldapmodify comme d'habitude. Si la modification est dans le fichiersbrownaddmail.ldif, vous pouvez taper:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownaddmail.ldif

Remplacement de la valeur d'un attribut dans une entrée

Un autre changement courant consiste à modifier la valeur existante d'un attribut. Nous pouvons le faire en utilisant l'optionreplace: souschangetype: modify.

Cela fonctionne presque de la même manière que la commandeadd:, mais par défaut, supprime chaque occurrence existante de l'attribut de l'entrée et la remplace par les valeurs définies par la suite. Par exemple, si nous remarquons que notre dernière commandeadd: avait un email incorrect, nous pourrions le modifier avec la commandereplace comme ceci:

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: [email protected]

Gardez à l'esprit que cela remplacera l'instanceevery demail dans l'entrée. Ceci est important pour les attributs à valeurs multiples qui peuvent être définis plus d'une fois par entrée (commemail). Si vous souhaitez remplacer une seule occurrence d'un attribut, vous devez utiliser l'option d'attributdelete: (décrite ci-dessous) en combinaison avec l'option d'attributadd: (décrite ci-dessus).

Si cette modification a été stockée dans un fichier appelésbrownchangemail.ldif, nous pouvons remplacer l'e-mail de Sally en tapant:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif

Supprimer des attributs d'une entrée

Si vous souhaitez supprimer un attribut d'une entrée, vous pouvez utiliser la commandedelete:. Vous spécifierez l'attribut que vous souhaitez supprimer comme valeur de l'option. Si vous souhaitez supprimer une instance spécifique de l'attribut, vous pouvez spécifier l'occurrence d'attribut clé-valeur spécifique sur la ligne suivante. Sinon, chaque occurrence de cet attribut dans l'entrée sera supprimée.

Par exemple, cela effacerait tous les attributs de description de l’entrée de John Smith:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: description

Cependant, cela ne supprimerait que le courrier électronique spécifié:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
mail: [email protected]

Puisque nous avons déjà donné deux adresses électroniques à John, cette demande ne devrait pas modifier l’autre.

Si ces changements se trouvaient dans des fichiers appelésjsmithrmdesc.ldif etjsmithrmextramail.ldif, nous pourrions les appliquer en tapant:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmextramail.ldif

Spécification de plusieurs changements d'attribut

C'est un bon moment pour parler de la spécification de plusieurs changements d'attribut en même temps. Pour une seule entrée dans un fichier LDIF, vous pouvez spécifier plusieurs changements d'attribut en les séparant par une ligne remplie uniquement avec le caractère-. Après le séparateur, le type de changement d'attribut doit être spécifié et les attributs requis doivent être spécifiés.

Par exemple, nous pourrions supprimer l’attribut de courrier électronique restant de John, changer son nom en "Johnny Smith" et ajouter son emplacement en créant un fichier avec le contenu suivant:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
-
replace: cn
cn: Johnny Smith
-
add: l
l: New York

Pour appliquer toutes ces modifications en une seule commande, nous utiliserions le même formatldapmodify que nous utilisons depuis le début:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f multichange.ldif

Renommer et déplacer des entrées

L'optionchangetype: modrdn permet de renommer ou de déplacer des entrées existantes. Après avoir spécifié lesdn: que vous souhaitez cibler, définissez l'optionchangetype: modrdn.

Renommer une entrée

Disons que nous avons mal entré le nom d'utilisateur de Sally lorsque nous l'avons entré pour la première fois dans le système. Comme cela est utilisé dans le DN de l'entrée, il ne peut pas être simplement remplacé par les optionschangetype: modify etreplace: car le RDN de l'entrée serait invalide. Si son vrai nom d'utilisateur estsbrown200, nous pourrions changer le DN de l'entrée, en créant tous les attributs nécessaires en cours de route, avec un fichier LDIF comme celui-ci:

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown200
deleteoldrdn: 0

Nous pourrions appliquer ce changement avec cette commande:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fixsallydn.ldif

Cela ferait que l'entrée complète ressemble à ceci:

dn: uid=sbrown200,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
 e for designing the blue prints and testing the structural int
 egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20
uid: sbrown200
mail: [email protected]

Comme vous pouvez le constater, votre DM a été ajustée pour utiliser le nouveau couple attribut / valeur. L'attribut a été ajouté à l'entrée pour rendre cela possible.

Vous avez peut-être remarqué deux choses dans l'exemple ci-dessus. Tout d'abord, nous définissons une option appeléedeleteoldrdn sur «0». Deuxièmement, l'entrée résultante a à la foisuid: sbrown20 etuid: sbrown200.

L'optiondeleteoldrdn doit être définie lors de la modification du DN d'une entrée. Si vous définissezdeleteoldrdn sur «0», LDAP conserve l'ancien attribut utilisé dans le DN à côté du nouvel attribut dans l'entrée. Parfois, c'est ce que vous voulez, mais vous voudrez souvent supprimer complètement l'ancien attribut de l'entrée après le changement du DN. Vous pouvez le faire en réglantdeleteoldrdn sur «1» à la place.

Supposons que nous ayons à nouveau commis une erreur et que le nom d’utilisateur réel de Sally soitsbrown2. Nous pouvons définirdeleteoldrdn sur «1» pour supprimer l'instancesbrown200 actuellement utilisée dans le DN de l'entrée après le changement de nom. Nous allons aller de l'avant et inclure une paire supplémentaire dechangetype: modify etdelete: pour nous débarrasser de l'autre nom d'utilisateur errant,sbrown20, puisque nous l'avons conservé lors du premier changement de nom:

dn: uid=sbrown200,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 1

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modify
delete: uid
uid: sbrown20

Appliquez le fichier comme ceci:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fix2sallydn.ldif

Cette combinaison n'ajoutera pas de nouveau nom d'utilisateur avec la modification (sbrown200 sera supprimé), et la deuxième modification d'entrée supprimera la valeur d'origine du nom d'utilisateur (sbrown20).

Déplacer une entrée

Si vous devez déplacer l'entrée vers un nouvel emplacement, un paramètre supplémentaire pourchangetype: modrdn est l'optionnewsuperior:. Lorsque vous utilisez cette option, vous pouvez spécifier un nouvel emplacement sur le DIT vers lequel déplacer l’entrée. Cela placera l'entrée sous le DN parent spécifié lors de la modification.

Par exemple, si nous voulions déplacer Sally sous l'entréeou=superusers, nous pourrions ajouter cette entrée puis la déplacer vers elle en tapant:

dn: ou=superusers,dc=example,dc=com
changetype: add
objectClass: organizationalUnit
ou: superusers

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 0
newsuperior: ou=superusers,dc=example,dc=com

En supposant que cela soit stocké dans un fichier appelémksuperuser.ldif, nous pourrions appliquer les modifications comme ceci:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f mksuperuser.ldif

Cela entraîne un déménagement et jamais une copie.

Dans ce cas, nous ne souhaitons pas modifier réellement le RDN de l'entrée, nous définissons donc la valeurnewrdn: sur la même valeur qu'elle a actuellement. Nous pourrions aussi facilement renommer pendant le déménagement si nous le souhaitions. Dans ce cas, le paramètrenewsuperior: est la seule ligne de la deuxième modification qui affecte réellement l'état de l'entrée.

Un côté: Ajouter des données binaires à une entrée

Cette section est distincte des informations ci-dessus car elle pourrait s’inscrire dans les sections sur la création d’une entrée ou sur la définition d’attributs supplémentaires.

LDAP a la capacité de stocker des données binaires pour certains attributs. Par exemple, la classeinetOrgPerson autorise un attribut appeléjpegPhoto, qui peut être utilisé pour stocker la photo ou l'icône de l'utilisateur d'une personne. Un autre attribut de cette objectClass qui peut utiliser des données binaires est l'attributaudio.

Pour ajouter ce type de données à une entrée LDAP, vous devez utiliser un format spécial. Lorsque vous spécifiez l'attribut, juste après les deux points, utilisez un caractère inférieur à (<) et un espace. Ensuite, incluez le chemin du fichier en question.

Par exemple, si vous avez un fichier appeléjohn.jpg dans le répertoire/tmp, vous pouvez ajouter le fichier à l'entrée de Jean avec un fichier LDIF qui ressemble à ceci:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///tmp/john.jpg

Portez une attention particulière à l'emplacement du côlon, moins que caractère, et de l'espace. Si votre fichier se trouve sur le disque, le préfixefile:// peut être utilisé. Le chemin ajoutera une barre oblique supplémentaire pour indiquer le répertoire racine si vous utilisez un chemin absolu.

Cela fonctionnerait de la même manière avec un fichier audio:

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: audio
audio:< file:///tmp/hellojohn.mp3

Une fois que vous avez traité le fichier LDIF, le fichier réel sera codé dans votre service d'annuaire LDAP. Il est important de garder cela à l'esprit, car l'ajout d'un nombre important de fichiers de ce type aura un impact sur la taille et les performances de votre service.

Lorsque vous devez récupérer les données encodées à l'aide de l'outilldapsearch, vous devrez ajouter l'indicateur-t, qui permettra au fichier d'être écrit dans le répertoire/tmp. Le nom de fichier généré sera indiqué dans les résultats.

Par exemple, nous pourrions utiliser cette commande pour écrire les données binaires dans un fichier temporaire:

ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"

Le résultat de la recherche ressemblera à ceci:

sortie ldapsearch

dn: uid=jsmith1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
sn: Smith
uid: jsmith1
cn: Johnny Smith
l: New York
audio:< file:///tmp/ldapsearch-audio-n5GRF6

Si nous allons dans le répertoire/tmp, nous pouvons trouver le fichier. Il peut être renommé si nécessaire et doit être dans l'état exact dans lequel il se trouvait avant de le saisir dans le répertoire.

Soyez prudent lorsque vous effectuez cette opération à plusieurs reprises, car un nouveau fichier est écrit chaque fois que la recherche est effectuée. Vous pouvez facilement remplir un disque sans vous en rendre compte si vous ne faites pas attention.

Conclusion

A présent, vous devriez avoir une assez bonne maîtrise de la manière de manipuler les entrées dans une arborescence d'informations de l'annuaire LDAP à l'aide de fichiers au format LDIF et de quelques outils. Certains clients LDAP peuvent rendre les fichiers LDIF inutiles pour les opérations quotidiennes, mais les fichiers LDIF peuvent constituer le meilleur moyen d'effectuer des opérations de traitement par lots sur vos entrées DIT. Il est également important de savoir comment modifier vos entrées à l'aide de ces méthodes à des fins d'administration, lors de la configuration du service d'annuaire initial et lors de la résolution de problèmes susceptibles d'empêcher les clients d'accéder correctement à vos données.