5. Composer un nouvel annuaire LDAP

Une fois la configuration du nouvel annuaire terminée, vous pouvez ajouter de nouvelles entrées. Comme le fil conducteur de cette série de travaux pratiques est la gestion d'une base de comptes utilisateurs, vous devez ajouter les objets suivants :

  • Les branches : Trois unités organisationnelles (users, groups et hosts).

  • Les feuilles : Quatre comptes utilisateurs (papa et maman Skywalker ainsi que leurs deux enfants).

Q125.

Comment visualiser la liste des entrées du domaine dans l'annuaire LDAP ?

Consultez les pages de manuel de la commande ldapsearch pour obtenir des informations sur les méthodes d'authentification, la base de données dans laquelle la recherche est effectuée et le nom distinctif utilisé pour se connecter à l'annuaire.

La commande ldapsearch propose plusieurs modes d'authentification qui influent sur la liste des attributs affichés pour une même entrée.

Méthode 1 : Authentification système (SASL/EXTERNAL)

C'est le comportement par défaut sous Debian, que vous avez déjà configuré dans votre script bootstrap.

Puisque vous êtes sur le serveur lui-même, vous n'avez pas besoin du mot de passe pour effectuer des tâches administratives via la socket Unix locale (ldapi:///) avec les privilèges root. Le noyau Linux certifie au serveur LDAP qu'il s'agit bien de l'utilisateur root (UID 0), ce qui permet à OpenLDAP de lui accorder automatiquement les droits d'administration.

sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// \
    -b "dc=lab,dc=local"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
No such object (32)
  • Le résultat No such object (32) montre que l'annuaire est vide à ce stade.

  • L'option -LLL désactive l'affichage des commentaires et de la version LDIF utilisée dans la réponse.

  • L'option -b désigne le point de départ de la recherche.

Méthode 2 : Authentification par lecture directe du fichier de secret

Pour l'authentification classique par mot de passe (Simple Bind avec l'option -D) via le réseau local (TCP/389) ou pour simuler le comportement d'une application tierce, vous pouvez utiliser l'option -y fournie par tous les outils OpenLDAP.

Cette option demande au client de lire le mot de passe directement depuis un fichier. Puisque vous êtes le propriétaire du fichier d'origine, vous pouvez le lire directement.

ldapsearch -LLL -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y ~/.ldap_admin_pass \
    -b "dc=lab,dc=local
No such object (32)
  • Le résultat No such object (32) montre que l'annuaire est aussi vide à ce stade.

  • L'option -LLL désactive l'affichage des commentaires et de la version LDIF utilisée dans la réponse.

  • L'option -D spécifie le Distinguished Name (DN) de l'administrateur.

  • L'option -y va chercher le mot de passe en clair dans le fichier de sauvegarde créé lors de la configuration initiale de l'annuaire.

[Important] Important

Vous devez utiliser l'une ou l'autre des deux méthodes présentées ici pour vérifier la présence et la validité des attributs stockés dans l'annuaire LDAP, et pour traiter les questions à venir.

Q126.

Comment activer la journalisation des manipulations sur les entrées de l'annuaire LDAP ?

Cette question revient sur l'arbre de configuration cn=config.

Recherchez l'entrée relative au niveau de journalisation dans le DIT et modifier sa valeur de façon à obtenir des messages dans les journaux système à chaque opération sur l'annuaire.

La modification de l'entrée du DIT doit se faire à l'aide d'un fichier LDIF avec la nouvelle valeur de l'attribut .

Recherchez la clé olcLogLevel dans la base de configuration cn=config.

sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// \
    -b "cn=config" \
    olcLogLevel | grep ^olcLogLevel
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcLogLevel: none

Créez le fichier LDIF qui remplace la valeur none par stats de façon à journaliser les connexions, les opérations et les résultats. Voici un exemple de fichier :

rm -f setolcLogLevel2stats.ldif
cat << EOF >setolcLogLevel2stats.ldif
# Set olcLogLevel to "stats"
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF

Appliquez cette nouvelle valeur avec la commande ldapmodify, puis vérifiez que l'attribut a bien changé.

sudo ldapmodify -Y EXTERNAL -H ldapi:/// \
    -f setolcLogLevel2stats.ldif
CSASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// \
    -b "cn=config" \
    olcLogLevel | grep ^olcLogLevel
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcLogLevel: stats

Enfin, on relève les traces de la dernière opération dans les journaux système.

journalctl -o cat -n 20 -u slapd --grep="conn"
conn=1009 fd=13 closed
conn=1009 op=2 UNBIND
conn=1009 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000018 etime=0.000171 nentries=10 text=
conn=1009 op=1 SRCH attr=olcLogLevel
conn=1009 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=*)"
conn=1009 op=0 RESULT tag=97 err=0 qtime=0.000028 etime=0.000143 text=
conn=1009 op=0 BIND dn="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" mech=EXTERNAL bind_ssf=0 ssf=71
conn=1009 op=0 BIND authcid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" authzid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
conn=1009 op=0 BIND dn="" method=163
conn=1009 fd=13 ACCEPT from PATH=/var/run/slapd/ldapi (PATH=/var/run/slapd/ldapi)
conn=1008 fd=13 closed
conn=1008 op=2 UNBIND
conn=1008 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000027 etime=0.000377 nentries=10 text=
conn=1008 op=1 SRCH attr=olcLogLevel
conn=1008 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=*)"
conn=1008 op=0 RESULT tag=97 err=0 qtime=0.000029 etime=0.000199 text=
conn=1008 op=0 BIND dn="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" mech=EXTERNAL bind_ssf=0 ssf=71
conn=1008 op=0 BIND authcid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" authzid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
conn=1008 op=0 BIND dn="" method=163
conn=1008 fd=13 ACCEPT from PATH=/var/run/slapd/ldapi (PATH=/var/run/slapd/ldapi)
[Note] Note

Dans le cadre des travaux pratiques, le nombre d'entrées de l'annuaire reste très limité, et la journalisation n'a pas d'impact mesurable sur les performances du système. En revanche, dans un contexte d'exploitation réelle, avec un annuaire contenant au moins dix mille entrées, la situation est très différente et il est nécessaire de limiter au maximum la journalisation des transactions sur l'annuaire.

Pour revenir à la valeur initiale de l'attribut olcLogLevel, il suffit de créer un autre fichier LDIF avec la valeur none.

cat << EOF > setolcLogLevel2none.ldif
# Set olcLogLevel to "none"
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: none
EOF

5.1. Créer les branches de l'annuaire

Q127.

Quelle est la syntaxe du fichier LDIF qui permet de créer l'arbre et les branches de l'annuaire LDAP ?

Recherchez la syntaxe de définition d'une organisation (o:) et des unités organisationnelles (ou:) demandées.

Déclarez trois branches : users, groups et hosts.

Voici un exemple de fichier LDIF contenant les déclarations des trois unités organisationnelles à ajouter.

rm -f add_tree.ldif
cat <<EOF >add_tree.ldif
# DIT root (Base DN)
dn: dc=lab,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: Lab Local Organisation
dc: lab

# Users branch
dn: ou=users,dc=lab,dc=local
objectClass: organizationalUnit
ou: users

# Groups branch
dn: ou=groups,dc=lab,dc=local
objectClass: organizationalUnit
ou: groups

# Hosts branch
dn: ou=hosts,dc=lab,dc=local
objectClass: organizationalUnit
ou: hosts
EOF

Q128.

Comment ajouter de nouveaux éléments à l'annuaire à partir des définitions d'un fichier LDIF ?

Recherchez la commande d'ajout dans la liste des outils fournis avec le paquet ldap-utils.

Utilisez la commande ldapadd pour créer les branches de l'annuaire de travaux pratiques à partir des entrées définies dans le fichier LDIF add_tree.ldif.

ldapadd -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y ~/.ldap_admin_pass \
    -f add_tree.ldif
adding new entry "dc=lab,dc=local"

adding new entry "ou=users,dc=lab,dc=local"

adding new entry "ou=groups,dc=lab,dc=local"

adding new entry "ou=hosts,dc=lab,dc=local"

Vérifiez ensuite la présence des branches dans l'annuaire avec la commande ldapsearch.

ldapsearch -LLL -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -b "dc=lab,dc=local"
dn: dc=lab,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: Lab Local Organisation
dc: lab

dn: ou=users,dc=lab,dc=local
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=lab,dc=local
objectClass: organizationalUnit
ou: groups

dn: ou=hosts,dc=lab,dc=local
objectClass: organizationalUnit
ou: hosts

Q129.

Quelle est la syntaxe du fichier LDIF qui permet de retirer les branches et l'arbre de l'annuaire LDAP ?

Recherchez la syntaxe de suppression d'une organisation (o:) et des deux unités organisationnelles (ou:) demandées.

Voici un exemple de fichier LDIF contenant les suppressions des unités organisationnelles et de l'organisation racine.

rm -f delete_tree.ldif
cat <<EOF >delete_tree.ldif
# Hosts branch
dn: ou=hosts,dc=lab,dc=local
changetype: delete

# Users branch
dn: ou=users,dc=lab,dc=local
changetype: delete

# Groups branch
dn: ou=groups,dc=lab,dc=local
changetype: delete

# DIT root
dn: dc=lab,dc=local
changetype: delete

Q130.

Comment supprimer les éléments de l'annuaire à partir des définitions d'un fichier LDIF ?

Recherchez la commande d'ajout dans la liste des outils fournis avec le paquet ldap-utils.

Utilisez la commande ldapmodify pour supprimer les branches de l'annuaire de travaux pratiques à partir des entrées définies dans le fichier LDIF delete_tree.ldif.

ldapmodify -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -f delete_tree.ldif
deleting entry "ou=hosts,dc=lab,dc=local"

deleting entry "ou=users,dc=lab,dc=local"

deleting entry "ou=groups,dc=lab,dc=local"

deleting entry "dc=lab,dc=local"

Vérifiez que l'annuaire LDAP est à nouveau vide avec la commande ldapsearch.

ldapsearch -LLL -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -b "dc=lab,dc=local"
No such object (32)
[Attention] Attention

Assurez-vous que l'annuaire contient un arbre avec les deux branches users et groups avant de passer aux questions suivantes.

5.2. Ajouter des utilisateurs à l'annuaire

Q131.

Comment générer un mot de passe utilisateur aléatoire et le condensat correspondant à insérer dans l'annuaire ?

Recherchez les options de la commande openssl qui permettent de générer une chaîne de caractères lisibles de 24 caractères.

Recherchez les options de la commande slappasswd qui permettent d'appliquer le module Argon2 au calcul de condensat (ou au hachage) du mot de passe de l'utilisateur.

Pour créer un mot de passe sécurisé, commencez par générer 28 octets aléatoires en base64. Ensuite, réduisez la sortie à 24 caractères lisibles.

openssl rand -base64 28 | cut -c -24

Utilisez ce secret pour le calcul de condensat avec l'algorithme Argon2.

USER_PASS=$(openssl rand -base64 28 | cut -c -24)
USER_PASS_HASH=$(sudo slappasswd -o module-load=argon2.la -h "{ARGON2}" -s "${USER_PASS}")
echo "${USER_PASS_HASH}"

Dans le contexte de ces travaux pratiques, vous devez attribuer un mot de passe aux quatre membres de la famille Skywalker.

Q132.

Comment générer un mot de passe distinct pour chaque utilisateur et comment sauvegarder le hachage correspondant dans un fichier TOML qui servira à la génération LDIF ?

Suivez une démarche en plusieurs étapes :

  1. Créez le fichier skywalkers_nopass.toml qui contient les attributs utilisateurs et une valeur clé à substituer par le hachage une fois qu'il aura été calculé.

  2. Créez le script generate_skywalker_passwords.sh qui génère le mot de passe et le sauve dans un fichier avec des permissions d'accès limités. Le mot de passe de chaque utilisateur est haché et inséré dans le fichier cible skywalkers.toml.

  3. Lancez le script generate_skywalker_passwords.sh et affichez le contenu du fichier de description TOML skywalkers.toml.

  1. Copiez la description des comptes utilisateurs ci-dessous dans le fichier skywalkers_nopass.toml.

    [global]
    base_dn = "dc=lab,dc=local"
    users_ou = "ou=users"
    groups_ou = "ou=groups"
    start_id = 10000
    default_shell = "/bin/bash"
    default_home_base = "/ahome"
    
    # --- Shared system group
    shared_group_name = "users"
    shared_group_gid = 100
    
    [[users]]
    firstname = "Padme"
    lastname = "Amidala"
    uid = "padme"
    password_hash = "padme_password_hash"
    
    [[users]]
    firstname = "Anakin"
    lastname = "Skywalker"
    uid = "anakin"
    password_hash = "anakin_password_hash"
    
    [[users]]
    firstname = "Leia"
    lastname = "Organa"
    uid = "leia"
    password_hash = "leia_password_hash"
    
    [[users]]
    firstname = "Luke"
    lastname = "Skywalker"
    uid = "luke"
    password_hash = "luke_password_hash"
  2. Copiez le code exemple de script Bash ci-dessous dans le fichier generate_skywalker_passwords.sh.

    #!/usr/bin/env bash
    
    set -euo pipefail
    
    if [[ ! -f skywalkers_nopass.toml ]]; then
            echo "skywalkers_nopass.toml file not found. Please create it with the user attributes."
            exit 1
    fi
    
    cp skywalkers_nopass.toml skywalkers.toml
    
    for user in padme anakin leia luke; do
            password_file="${HOME}/.ldap_${user}_pass"
            rm -f "${password_file}"
            USER_PASS=$(openssl rand -base64 28 | cut -c -24)
            # Create the password file and set its permissions.
            printf '%s' "${USER_PASS}" >"${password_file}"
            chmod 400 "${password_file}"
            USER_PASS_HASH=$(sudo slappasswd -o module-load=argon2.la -h "{ARGON2}" -s "${USER_PASS}")
            ESCAPED_USER_PASS_HASH=${USER_PASS_HASH//&/\\&}
            # Replace each user's placeholder with the generated password hash.
            sed -i "s|${user}_password_hash|${ESCAPED_USER_PASS_HASH}|g" skywalkers.toml
    done
    

    Ce script reprend les instructions de génération de mot de passe et de calcul de condensat de la question précédente.

    Lancez le script generate_skywalker_passwords.sh.

    bash generate_skywalker_passwords.sh

    Prenez l'exemple de l'utilisatrice leia : son mot de passe est stocké dans le fichier ${HOME}/.ldap_leia_pass et le condensat a été substitué à la clé leia_password_hash.

  3. Affichez le fichier de description TOML complété avec le condensat de chaque utilisateur.

    cat skywalkers.toml
    [global]
    base_dn = "dc=lab,dc=local"
    users_ou = "ou=users"
    groups_ou = "ou=groups"
    start_id = 10000
    default_shell = "/bin/bash"
    default_home_base = "/ahome"
    
    # --- Shared system group
    shared_group_name = "users"
    shared_group_gid = 100
    
    [[users]]
    firstname = "Padme"
    lastname = "Amidala"
    uid = "padme"
    password_hash = "{ARGON2}$argon2id$v=19$m=7168,t=5,p=1$/973ycw..."
    
    [[users]]
    firstname = "Anakin"
    lastname = "Skywalker"
    uid = "anakin"
    password_hash = "{ARGON2}$argon2id$v=19$m=7168,t=5,p=1$/kL62VI..."
    
    [[users]]
    firstname = "Leia"
    lastname = "Organa"
    uid = "leia"
    password_hash = "{ARGON2}$argon2id$v=19$m=7168,t=5,p=1$i+D6mue..."
    
    [[users]]
    firstname = "Luke"
    lastname = "Skywalker"
    uid = "luke"
    password_hash = "{ARGON2}$argon2id$v=19$m=7168,t=5,p=1$hTdclEx..."

Q133.

Comment coder le script Python qui génère le format LDIF à partir de la description TOML des attributs des comptes utilisateurs ?

À partir de l'exemple de liste d'attributs LDAP ci-dessous, codez le formatage LDIF de chaque compte utilisateur.

dn: uid=luke,ou=users,dc=lab,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: luke
cn: Luke Skywalker
givenName: Luke
sn: Skywalker
mail: luke@lab.local
userPassword: {ARGON2}$argon2id$v=19$m=7168,t=5,p=1$hTdc...
shadowLastChange: 20586
loginShell: /bin/bash
uidNumber: 10003
gidNumber: 10003
homeDirectory: /ahome/luke
gecos: Luke Skywalker
  • La valeur de shadowLastChange: définit la date de dernière modification du mot de passe. On initialise cet attribut avec le nombre de jours écoulés depuis le 1er janvier 1970.

  • uidNumber: et gidNumber: sont calculés dynamiquement à partir de la valeur initiale 10000.

De plus, il faut aussi créer un groupe privé pour chaque utilisateur avec le gidNumber: calculé.

Codez le script Python generate_users_ldif.py qui assemble tous les DN dans le fichier LDIF import_skywalkers.ldif.

Copiez l'exemple de code ci-dessous dans le fichier generate_users_ldif.py.

#!/usr/bin/env python3
import argparse
import time
import tomllib


def generate_ldif(toml_path, output_path):
    # 1. Directly read the TOML file
    with open(toml_path, "rb") as f:
        data = tomllib.load(f)

    cfg, users = data["global"], data["users"]
    base_dn = cfg["base_dn"]
    domain = ".".join(p[3:] for p in base_dn.split(",") if p.startswith("dc="))
    shadow_day = int(time.time() // 86400)

    with open(output_path, "w", encoding="utf-8") as ldif:
        # 2. Generate private groups (UPG)
        ldif.write("# --- PRIVATE GROUPS (UPG) ---\n")
        for idx, u in enumerate(users):
            gid = cfg["start_id"] + idx
            ldif.write(
                f"dn: cn={u['uid']},{cfg['groups_ou']},{base_dn}\n"
                f"objectClass: posixGroup\ncn: {u['uid']}\ngidNumber: {gid}\n\n"
            )

        # 3. Generate user accounts
        ldif.write("# --- USER ACCOUNTS ---\n")
        for idx, u in enumerate(users):
            uid = cfg["start_id"] + idx
            full_name = f"{u['firstname']} {u['lastname']}"
            password_hash = u["password_hash"]
            ldif.write(
                f"dn: uid={u['uid']},{cfg['users_ou']},{base_dn}\n"
                "objectClass: inetOrgPerson\nobjectClass: posixAccount\nobjectClass: shadowAccount\n"
                f"uid: {u['uid']}\ncn: {full_name}\ngivenName: {u['firstname']}\nsn: {u['lastname']}\n"
                f"mail: {u['uid']}@{domain}\nuserPassword: {password_hash}\n"
                f"shadowLastChange: {shadow_day}\nloginShell: {cfg['default_shell']}\n"
                f"uidNumber: {uid}\ngidNumber: {uid}\n"
                f"homeDirectory: {cfg['default_home_base']}/{u['uid']}\ngecos: {full_name}\n\n"
            )

        # 4. Generate the shared system group
        ldif.write(
            "# --- SHARED SYSTEM GROUP ---\n"
            f"dn: cn={cfg['shared_group_name']},{cfg['groups_ou']},{base_dn}\n"
            f"objectClass: posixGroup\ncn: {cfg['shared_group_name']}\n"
            f"gidNumber: {cfg['shared_group_gid']}\n"
        )
        for u in users:
            ldif.write(f"memberUid: {u['uid']}\n")

    print(
        f"Success: generated '{output_path}' with membership in group {cfg['shared_group_name']}."
    )


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Directory LDIF generator.")
    parser.add_argument("toml", nargs="?", default="skywalkers.toml")
    parser.add_argument("output", nargs="?", default="import_skywalkers.ldif")
    args = parser.parse_args()
    generate_ldif(args.toml, args.output)

Lancez le script :

python3 generate_users_ldif.py
Success: generated 'import_skywalkers.ldif' with membership in group users.

Affichez le contenu du fichier import_skywalkers.ldif produit par le code Python.

cat import_skywalkers.ldif
# --- PRIVATE GROUPS (UPG) ---
dn: cn=padme,ou=groups,dc=lab,dc=local
objectClass: posixGroup
cn: padme
gidNumber: 10000

dn: cn=anakin,ou=groups,dc=lab,dc=local
objectClass: posixGroup
cn: anakin
gidNumber: 10001

dn: cn=leia,ou=groups,dc=lab,dc=local
objectClass: posixGroup
cn: leia
gidNumber: 10002

dn: cn=luke,ou=groups,dc=lab,dc=local
objectClass: posixGroup
cn: luke
gidNumber: 10003

# --- USER ACCOUNTS ---
dn: uid=padme,ou=users,dc=lab,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: padme
cn: Padme Amidala
givenName: Padme
sn: Amidala
mail: padme@lab.local
userPassword: {ARGON2}$argon2id$v=19$m=7168,t=5,p=1$/973y...
shadowLastChange: 20586
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 10000
homeDirectory: /ahome/padme
gecos: Padme Amidala

...

Q134.

Comment insérer les nouveaux utilisateurs dans l'annuaire LDAP et comment tester l'accès d'un utilisateur particulier à l'annuaire ?

Utilisez la commande ldapadd pour importer les nouvelles « feuilles » sur les branches existantes de l'annuaire LDAP.

Une fois l'importation faite, utilisez la commande ldapsearch pour afficher la liste des objets de l'annuaire en tant qu'utilisateur membre de la famille Skywalker.

Lancez l'importation du fichier LDIF import_skywalkers.ldif.

ldapadd -x -H ldap://localhost \
    -D "cn=admin,dc=lab,dc=local" \
    -y ~/.ldap_admin_pass \
    -f import_skywalkers.ldif
adding new entry "cn=padme,ou=groups,dc=lab,dc=local"

adding new entry "cn=anakin,ou=groups,dc=lab,dc=local"

adding new entry "cn=leia,ou=groups,dc=lab,dc=local"

adding new entry "cn=luke,ou=groups,dc=lab,dc=local"

adding new entry "uid=padme,ou=users,dc=lab,dc=local"

adding new entry "uid=anakin,ou=users,dc=lab,dc=local"

adding new entry "uid=leia,ou=users,dc=lab,dc=local"

adding new entry "uid=luke,ou=users,dc=lab,dc=local"

adding new entry "cn=users,ou=groups,dc=lab,dc=local"

Notez que les entrées ont été ajoutées dans les unités organisationnelles ou=users et ou=groups.

Lancez des recherches dans l'annuaire en tant qu'utilisateur luke en précisant l'attribut demandé.

  • Recherchez l'attribut uid: :

    ldapsearch -LLL -x -H ldap://localhost \
        -D "uid=luke,ou=users,dc=lab,dc=local" \
        -y .ldap_luke_pass \
        -b "dc=lab,dc=local" \
        uid
    dn: dc=lab,dc=local
    
    dn: ou=users,dc=lab,dc=local
    
    dn: ou=groups,dc=lab,dc=local
    
    dn: cn=padme,ou=groups,dc=lab,dc=local
    
    dn: cn=anakin,ou=groups,dc=lab,dc=local
    
    dn: cn=leia,ou=groups,dc=lab,dc=local
    
    dn: cn=luke,ou=groups,dc=lab,dc=local
    
    dn: uid=padme,ou=users,dc=lab,dc=local
    uid: padme
    
    dn: uid=anakin,ou=users,dc=lab,dc=local
    uid: anakin
    
    dn: uid=leia,ou=users,dc=lab,dc=local
    uid: leia
    
    dn: uid=luke,ou=users,dc=lab,dc=local
    uid: luke
    
    dn: cn=users,ou=groups,dc=lab,dc=local

    L'utilisateur luke a la capacité à parcourir l'annuaire et afficher les attributs uid: de tous les autres utilisateurs.

  • Recherchez l'attirbut userPassword: :

    ldapsearch -LLL -x -H ldap://localhost \
        -D "uid=luke,ou=users,dc=lab,dc=local" \
        -y .ldap_luke_pass \
        -b "dc=lab,dc=local" \
        userPassword
    dn: dc=lab,dc=local
    
    dn: ou=users,dc=lab,dc=local
    
    dn: ou=groups,dc=lab,dc=local
    
    dn: cn=padme,ou=groups,dc=lab,dc=local
    
    dn: cn=anakin,ou=groups,dc=lab,dc=local
    
    dn: cn=leia,ou=groups,dc=lab,dc=local
    
    dn: cn=luke,ou=groups,dc=lab,dc=local
    
    dn: uid=padme,ou=users,dc=lab,dc=local
    
    dn: uid=anakin,ou=users,dc=lab,dc=local
    
    dn: uid=leia,ou=users,dc=lab,dc=local
    
    dn: uid=luke,ou=users,dc=lab,dc=local
    userPassword:: e0FSR09OMn0kYXJnb24yaWQkdj0xOSRtPTcxNjgsdD01LHA9MSRoVGRjbEV4SXh
     IOU1uNDFUZityQ3BBJFF1WTYxa2tYVmkzOXR3TFZCUlhGQ0QyaDAxSU5leTdHWkVsaGUwMU13NkE=
    
    dn: cn=users,ou=groups,dc=lab,dc=local

    L'utilisateur luke a seulement le droit d'afficher le condensat de son propre mot de passe encodé en base64.