6. Configurer l'accès client au serveur LDAP

Ici, on part du principe qu'un annuaire LDAP existe et qu'il contient des utilisateurs. Vous allez configurer un système client pour qu'il obtienne les informations sur les comptes utilisateurs de l'annuaire de façon transparente.

6.1. Interroger l'annuaire LDAP à distance

Dans cette section, vous reprendrez les requêtes de consultation des entrées de l'annuaire présentées dans la Section 5, « Composer un nouvel annuaire LDAP ». Cette fois-ci, les requêtes sont émises depuis un hôte réseau différent du serveur LDAP. L'utilisation de l'URI ldapi:/// n'est donc plus possible.

Q135.

Quelles sont les conditions à réunir pour interroger l'annuaire LDAP directement depuis un hôte distant ?

Recherchez à nouveau le paquet qui contient la commande ldapsearch.

Copiez le mot de passe de l'administrateur de l'annuaire depuis le serveur.

Assemblez l'URL avec les options utilisées dans la section précédentes pour lancer des requêtes analogues.

Installez le paquet ldap-utils qui contient la commande ldapsearch.

sudo apt -y install ldap-utils

Copiez le mot de passe administrateur avec la commande scp.

scp ldap-srvr:~/.ldap_admin_pass .
[Note] Note

Le nom d'hôte ldap-srvr est résolu via multicast DNS dans le contexte de la maquette de travaux pratiques où le serveur et le client appartiennent au même VLAN. Dans un contexte différent, utilisez l'adresse IPv6 ou IPv4 pour désigner l'hôte à contacter.

Lancez une requête au service LDAP.

ldapsearch -LLL -H ldap://ldap-srvr \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -b "dc=lab,dc=local" \
    uid=padme
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:: e0FSR09OMn0kYXJnb24yaWQkdj0xOSRtPTcxNjgsdD01LHA9MSQvOTczeTNEanJ
 0SXZrcFBQNnpTcGhRJGtzNnlIVmZNUVRLMElZSXFJQkdCL3pCcFltbEduODYyd3laV2RPU0ZZSHM=
shadowLastChange: 20586
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 10000
homeDirectory: /ahome/padme
gecos: Padme Amidala

Lancez une autre requête en utilisant l'adresse IPv6 du serveur.

ldapsearch -LLL -H ldap://[2001:678:3fc:65:baad:caff:fefe:3] \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -b "dc=lab,dc=local" \
    ou=groups
dn: ou=groups,dc=lab,dc=local
objectClass: organizationalUnit
ou: groups

Si vous avez laissé le paramètre de configuration de la journalisation olcLogLevel: à la valeur stats côté serveur, vous pouvez retrouver la trace des connexions depuis le serveur LDAP.

journalctl -n 10 -u slapd
ldap-srvr slapd[1054]: conn=1009 op=2 UNBIND
ldap-srvr slapd[1054]: conn=1009 fd=13 closed
ldap-srvr slapd[1054]: conn=1010 fd=13 ACCEPT from IP=[2001:678:3fc:65:baad:caff:fefe:4]:58012 (IP=[::]:389)
ldap-srvr slapd[1054]: conn=1010 op=0 BIND dn="cn=admin,dc=lab,dc=local" method=128
ldap-srvr slapd[1054]: conn=1010 op=0 BIND dn="cn=admin,dc=lab,dc=local" mech=SIMPLE bind_ssf=0 ssf=0
ldap-srvr slapd[1054]: conn=1010 op=0 RESULT tag=97 err=0 qtime=0.000031 etime=0.032708 text=
ldap-srvr slapd[1054]: conn=1010 op=1 SRCH base="dc=lab,dc=local" scope=2 deref=0 filter="(uid=padme)"
ldap-srvr slapd[1054]: conn=1010 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000037 etime=0.002431 nentries=1 text=
ldap-srvr slapd[1054]: conn=1010 op=2 UNBIND
ldap-srvr slapd[1054]: conn=1010 fd=13 closed

L'affichage des paramètres de la connexion révèlent un problème de sécurité majeur : le mot de passe de connexion a transité en clair sur le réseau.

  • La méthode 128 correspond à la signature de la trame réseau. Dans la norme d'encodage ASN.1 du protocole LDAP, ce choix correspond à une authentification simple. Une requête SASL aurait affiché une méthode différente. Le client a donc construit et envoyé une requête Bind simple.

  • mech=SIMPLE : Le serveur confirme qu'il traite une authentification simple.

  • ssf=0 (Security Strength Factor) : Un SSF de 0 signifie qu'aucune couche de chiffrement (TLS/SSL) n'est active. Le mot de passe a transité en clair dans le segment TCP.

[Attention] Attention

La sécurisation des échanges entre clients et serveur LDAP sera traitée dans les parties suivantes.

Q136.

Quelle est la syntaxe de la commande ldappasswd qui permet de changer le mot de passe d'un compte utilisateur de l'annuaire ?

Recherchez la liste des options à utiliser pour attribuer un nouveau mot de passe.

Créez un script de changement de mot de passe qui regroupe toutes les opérations. Ce script peut recevoir le nom d'utilisateur en paramètre.

Créez le script new-password.sh avec le code exemple ci-dessous :

cat << EOF >new-password.sh
#!/usr/bin/env bash

set -euo pipefail

USERNAME="$1"
if [[ -z ${USERNAME} ]]; then
        echo "Usage: $0 <username>"
        exit 1
fi

USER_PASS_FILE="${HOME}/.ldap_${USERNAME}_pass"
rm -f "${USER_PASS_FILE}"

USER_PASS=$(openssl rand -base64 28 | cut -c -24)
printf "%s" "${USER_PASS}" >"${USER_PASS_FILE}"
chmod 400 "${USER_PASS_FILE}"

ldappasswd -H ldap://ldap-srvr \
        -D cn=admin,dc=lab,dc=local \
        -y ~/.ldap_admin_pass \
        -S uid="${USERNAME}",ou=users,dc=lab,dc=local \
        -s "${USER_PASS}"

# Sync the new password into the Kerberos KDC only when Kerberos tooling is available.
if command -v kadmin >/dev/null 2>&1; then
        if [[ -f ${HOME}/.kadmin_pass ]]; then
                KADMIN_PASS=$(head -n 1 "${HOME}/.kadmin_pass")
                kadmin -p admin/admin -w "${KADMIN_PASS}" -q "cpw -pw ${USER_PASS} ${USERNAME}"
        else
                echo "Warning: Kerberos admin password file not found; LDAP password updated only." >&2
        fi
else
        echo "Warning: kadmin not available; LDAP password updated only." >&2
fi

EOF

Lancez le script pour modifier le mot de passe d'un utilisateur.

bash new-password.sh luke

Interrogez l'annuaire en utilisant l'identité qui vient d'être modifiée.

ldapsearch -LLL -H ldap://ldap-srvr \
    -D "uid=luke,ou=users,dc=lab,dc=local" \
    -y .ldap_luke_pass \
    -b "dc=lab,dc=local" \
    uid=luke
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
shadowLastChange: 20586
loginShell: /bin/bash
uidNumber: 10003
gidNumber: 10003
homeDirectory: /ahome/luke
gecos: Luke Skywalker
userPassword:: e0FSR09OMn0kYXJnb24yaWQkdj0xOSRtPTcxNjgsdD01LHA9MSQyc1V4a1gyTHN
0R0JxS0VjRk1ZaXN3JGJISUlxc1crSnpHdU1sRFRkU3dsdDJtZnAvQVlaU1RzTVdJMGZPT3hDN1kA

6.2. Configurer l'accès transparent à l'annuaire LDAP sur un système client

Les manipulations présentées ici couvrent plusieurs points :

  1. Le rôle d'aiguillage du Name Service Switch (NSS)

    Sur les systèmes d'exploitation GNU/Linux, la résolution des identités (utilisateurs, groupes, hôtes) ne se limite pas aux fichiers locaux historiques, tels que /etc/passwd ou /etc/group. Le Name Service Switch (NSS) joue le rôle de mécanisme d'aiguillage centralisé et modulaire. Il permet d'intégrer de manière transparente des sources d'informations réseau, comme un annuaire LDAP, au processus d'authentification et de résolution du système. Ainsi, lorsqu'une application ou le noyau demande à identifier un UID ou un nom d'utilisateur, NSS redirige dynamiquement la requête vers l'annuaire centralisé qui devient alors le référentiel d'identité.
  2. L'application du principe de moindre privilège : Le compte de service (Proxy NSS)

    Par défaut, interroger un annuaire pour résoudre des identités à la volée nécessite un accès en lecture à ses branches. Autoriser ces requêtes de manière anonyme constitue un risque majeur pour la sécurité, car n'importe quelle machine connectée au réseau pourrait alors effectuer un balayage et dresser un inventaire exhaustif des ressources humaines et techniques de l'organisation. Pour respecter le principe du moindre privilège, notre architecture repose sur l'utilisation d'un compte de service dédié (proxy NSS, par exemple nslcd-proxy). Ce compte possède des droits d'accès en lecture strictement limités par les listes de contrôle d'accès (ACL) du serveur OpenLDAP, ce qui garantit que seules les machines clientes légitimes et préauthentifiées peuvent consulter les attributs des utilisateurs.
  3. L'automatisation et la reproductibilité

    Pour dépasser l'approche de configuration manuelle interactive avec les interfaces de type debconf, le déploiement du sous-système client (démons nslcd et bibliothèques NSS/PAM) est réalisé par injection automatisée des paramètres (pre-seeding). Cette méthode non interactive permet d'éviter les erreurs de saisie, de documenter l'infrastructure sous forme de code (Infrastructure as Code) et de garantir la reproductibilité des configurations pour l'ensemble des systèmes clients LDAP.

Q137.

Comment ajouter un compte de service nslcd-proxy à l'annuaire LDAP ?

Recherchez la syntaxe LDIF de définition des attributs de ce nouveau compte de service.

Créez le fichier LDIF, générez le mot de passe de l'utilisateur nslcd-proxy et insérez le dans ce fichier.

Ajoutez le nouvel utilisateur avec la commande ldapadd.

Suivez la même démarche que celle suivie dans les questions précédentes pour créer le script create-nslcd-proxy.sh. Voici un exemple de code pour ce script :

#!/usr/bin/env bash

set -euo pipefail

readonly DOMAIN="lab.local"
readonly BASE_DN="dc=${DOMAIN%%.*},dc=${DOMAIN#*.}"
readonly USERS_OU="ou=users,${BASE_DN}"
readonly PROXY_UID="nslcd-proxy"
readonly PROXY_DN="uid=${PROXY_UID},${USERS_OU}"

readonly LDIF_FILE="/tmp/create_${PROXY_UID}.ldif"
readonly PROXY_PASS_FILE="${HOME}/.ldap_${PROXY_UID}_pass"

echo "=== 1. Password generation ==="
PROXY_PASS=$(openssl rand -base64 28 | cut -c -24)

rm -f "${PROXY_PASS_FILE}"
printf "%s" "${PROXY_PASS}" >"${PROXY_PASS_FILE}"
chmod 400 "${PROXY_PASS_FILE}"

PROXY_HASH=$(sudo slappasswd -o module-load=argon2.la -h "{ARGON2}" -s "${PROXY_PASS}")

echo "=== 2. LDIF file creation ==="
rm -f "${LDIF_FILE}"
cat <<EOF >"${LDIF_FILE}"
dn: ${PROXY_DN}
objectClass: inetOrgPerson
uid: ${PROXY_UID}
cn: NSLCD Proxy Service
sn: Service
description: Read-only service account for NSS/PAM resolution
userPassword: ${PROXY_HASH}
EOF

echo "=== 3. Insertion into the LDAP directory ==="
sudo ldapdelete -Y EXTERNAL -H ldapi:/// "${PROXY_DN}" 2>/dev/null || true
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f "${LDIF_FILE}"

rm -f "${LDIF_FILE}"

echo ""
echo "================================================================="
echo " Success: Service account '${PROXY_UID}' has been created."
echo " Bind DN: ${PROXY_DN}"
echo " Plaintext password (keep this for NSLCD configuration):"
echo " -> ${PROXY_PASS}"
echo " (This secret is also saved in: ${PROXY_PASS_FILE})"
echo "================================================================="

Adaptez la syntaxe de la commande ldapadd en fonction du système sur lequel vous lancez le script. Dans l'exemple ci-dessus, les options de ldapadd supposent que un lancement sur le serveur LDAP avec une authentification système.

Ajoutez le nouveau compte de service à l'annuaire :

bash create-nslcd-proxy.sh
=== 1. Password generation ===
=== 2. LDIF file creation ===
=== 3. Insertion into the LDAP directory ===
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "uid=nslcd-proxy,ou=users,dc=lab,dc=local"


=================================================================
 Success: Service account 'nslcd-proxy' has been created.
 Bind DN: uid=nslcd-proxy,ou=users,dc=lab,dc=local
 Plaintext password (keep this for NSLCD configuration):
 -> ioFOFQUMOpBJTexzjRVGj4Ed
 (This secret is also saved in: /home/etu/.ldap_nslcd-proxy_pass)
=================================================================

Q138.

Quel est le paquet de bibliothèque Name Service Switch à installer sur le client LDAP ?

Quel est le paquet essentiel qui dépend de cette bibliothèque et quel est son rôle ?

Recherchez les informations utiles à l'aide du gestionnaire de paquet et installez les bibliothèques et leurs dépendances.

Lancez un recherche avec l'empreinte libnss.*ldap.

apt search --names-only libnss.*lda
libnss-ldapd/testing 0.9.13-2+b1 amd64
NSS module for using LDAP as a naming service

Affichez la liste des dépendance de ce paquet de bibliothèques.

apt depends libnss-ldapd
libnss-ldapd
 |Dépend: debconf (>= 0.5)
  Dépend: <debconf-2.0>
    cdebconf
    debconf
  Dépend: libc6 (>= 2.17)
 |Dépend: nslcd (>= 0.9.0)
  Dépend: <nslcd-2>
    nslcd
    pynslcd
      Est en conflit avec: <libnss-ldap>

Affichez les informations fournies par le gestionnaire de paquets sur nslcd.

apt show nslcd
Package: nslcd
Version: 0.9.13-2+b1
Priority: optional
Section: admin
Source: nss-pam-ldapd (0.9.13-2)
Maintainer: Arthur de Jong <adejong@debian.org>
Installed-Size: 438 kB
Provides: nslcd-2
Pre-Depends: debconf (>= 0.5) | debconf-2.0
Depends: libc6 (>= 2.38), libgssapi-krb5-2 (>= 1.6.dfsg.2), libldap2 (>= 2.6.2), adduser, ca-certificates
Recommends: nscd, libnss-ldapd | libnss-ldap, libpam-ldapd | libpam-ldap | libpam-krb5 | libpam-heimdal | libpam-sss, nslcd-utils, ldap-utils, bind9-host | host
Suggests: kstart
Conflicts: nslcd-2
Breaks: libnss-ldapd (<< 0.9.0), libpam-ldapd (<< 0.9.0)
Replaces: libnss-ldapd (<< 0.7.0), nslcd-2
Homepage: https://arthurdejong.org/nss-pam-ldapd/
Tag: admin::login, admin::user-management, implemented-in::c,
 interface::daemon, protocol::ldap, role::program,
 security::authentication, use::configuring
Download-Size: 175 kB
APT-Sources: mirror+file:/etc/apt/mirrors/debian.list testing/main amd64 Packages
Description: démon de recherche NSS et PAM en utilisant LDAP
 Ce paquet fournit un démon pour retrouver les comptes d’utilisateurs et des
 informations de système similaires à partir de LDAP. Il est utilisé par les
 paquets libnss-ldapd et libpam-ldapd, mais n’est pas très utile en lui-même.

Le paquet nslcd (Name Service LDAP Connection Daemon) installe un démon local qui agit comme un pont transparent. Il traduit les requêtes d'identité du système (via NSS) en interrogations vers l'annuaire LDAP, tout en gérant de manière centralisée et sécurisée l'authentification et la connexion réseau.

Installez le paquet libnss-ldapd et relevez la liste des dépendances installées.

sudo apt install libnss-ldapd
Installation de :
  libnss-ldapd

Installation de dépendances :
  libpam-ldapd  nscd  nslcd  nslcd-utils

Paquets suggérés :
  kstart

Sommaire :
  Mise à niveau de : 0. Installation de : 5, Supprimé : 0. Non mis à jour : 0
Taille du téléchargement : 380 ko
  Espace nécessaire : 991 ko / 118 Go disponible

Continuer ? [O/n]

Appuyez sur n pour refuser l'installation interactive avec debconf.

Q139.

Comment installer le paquet libnss-ldapd et ses dépendances en mode non-interactif ?

Installez le paquet debconf-utils, puis utilisez la commande debconf-show pour obtenir la liste des paramètres de configuration du paquet à installer.

Par exemple :

sudo debconf-show libnss-ldapd

Recherchez la liste des paramètres utilsés par debconf pour les paquets libnss-ldapd et nslcd.

Composez un script Bash qui alimente la commande debconf-set-selections avant le lancement de l'installation des paquets.

Vérifiez que les utilisateurs qui appartiennent à l'annuaire LDAP sont bien visibles par le système du client.

Copiez l'exemple de code ci-dessous dans le fichier install-ldap-clnt.sh.

#!/usr/bin/env bash

set -euo pipefail

echo "=== 1. Environment preparation ==="
sudo apt update
sudo apt install -y --no-install-recommends debconf-utils

echo "=== 2. Configure ldap-utils defaults ==="
sudo install -d /etc/ldap
sudo tee /etc/ldap/ldap.conf >/dev/null <<'EOF'
URI ldap://ldap-srvr.lab.local
BASE dc=lab,dc=local
EOF

echo "=== 3. Centralized configuration (Pre-seeding) ==="
PROXY_PASS=$(cat ~/.ldap_nslcd-proxy_pass)
readonly PROXY_PASS

sudo debconf-set-selections <<EOF
# --- Directory targeting ---
nslcd nslcd/ldap-uris string ldap://ldap-srvr
nslcd nslcd/ldap-base string dc=lab,dc=local

# --- Network security ---
# StartTLS is disabled at this stage of the lab (it will be set to 'true' later)
nslcd nslcd/ldap-starttls boolean false

# --- Name service daemon authentication (Least privilege) ---
nslcd nslcd/ldap-binddn string uid=nslcd-proxy,ou=users,dc=lab,dc=local
nslcd nslcd/ldap-bindpw password ${PROXY_PASS}

# --- Automatic system integration ---
libnss-ldapd libnss-ldapd/nsswitch multiselect passwd, group, shadow
EOF

echo "=== 4. Non-interactive package installation ==="
sudo DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
        libnss-ldapd \
        libpam-ldapd \
        nslcd \
        nslcd-utils

echo ""
echo "================================================================="
echo " Success: The system is now connected to the LDAP directory."
echo " You can test name resolution with: id luke"
echo "================================================================="

Copiez le mot de passe du compte de service nslcd-proxy dans le fichier local ~/.ldap_nslcd-proxy_pass avant de lancez le script install-ldap-clnt.sh.

sudo bash install-ldap-clnt.sh

Vérifiez que les utilisateurs de l'annuaire sont accessibles depuis le système client.

id luke
uid=10003(luke) gid=10003(luke) groupes=10003(luke),100(users)

Pour termineri, affichez la liste des paramètres effectivement appliqués lors de l'installation et la configuration des paquets avec la commande debconf-get-selections.

sudo debconf-get-selections | grep ^nslcd
nslcd     nslcd/ldap-auth-type    select  simple
nslcd   nslcd/ldap-base string  dc=lab,dc=local
nslcd   nslcd/ldap-binddn       string  uid=nslcd-proxy,ou=users,dc=lab,dc=local
nslcd   nslcd/ldap-bindpw       password
nslcd   nslcd/ldap-cacertfile   string  /etc/ssl/certs/ca-certificates.crt
nslcd   nslcd/ldap-reqcert      select
nslcd   nslcd/ldap-sasl-authcid string
nslcd   nslcd/ldap-sasl-authzid string
nslcd   nslcd/ldap-sasl-krb5-ccname     string
nslcd   nslcd/ldap-sasl-mech    select
nslcd   nslcd/ldap-sasl-realm   string
nslcd   nslcd/ldap-sasl-secprops        string
nslcd   nslcd/ldap-starttls     boolean false
nslcd   nslcd/ldap-uris string  ldap://ldap-srvr

À ce stade de la progression des questions, la relation entre le client et le serveur LDAP est opérationnelle, mais avec un niveau de sécurité très insuffisant.

Q140.

Quel est le rôle du sous-système PAM (Pluggable Authentication Modules) dans une architecture d'annuaire centralisée, et en quoi ses fonctions diffèrent-elles de celles du Name Service Switch (NSS) ?

  • NSS (Name Service Switch) gère l'identité : "Qui est cet utilisateur ?" (Quel est son UID, son GID, son répertoire d'accueil ?). NSS agit comme un annuaire téléphonique.

  • PAM (Pluggable Authentication Modules) gère l'authentification et la session : "Cet utilisateur a-t-il le droit d'entrer ?" (Le mot de passe est-il correct ? Le compte est-il expiré ? Faut-il créer son répertoire personnel à la volée ?). PAM agit comme un agent de sécurité à l'entrée du système.

Le rôle de l'interface PAM/LDAP (via le paquet libpam-ldapd) est donc d'intercepter la saisie du mot de passe par l'utilisateur (lors d'un ssh, d'un su ou sur un écran de connexion), et de demander au démon nslcd de tenter un Bind LDAP sur le serveur avec ces identifiants.

Q141.

Quelles modifications ont été apportées par l'installation du paquet libnss-ldapd pour les directives passwd, group et shadow, et comment interpréter cet ordre de lecture ?

Vérifiez le contenu du fichier /etc/nsswitch.conf et analysez le positionnement de la clé ldap.

grep ldap /etc/nsswitch.conf
passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files systemd ldap

Le mot-clé ldap a été ajouté à la fin des trois catégories. L'ordre des clés est essentiel. Il indique au système de chercher d'abord l'identité dans les fichiers locaux (files), puis via les services système (systemd), et de n'interroger l'annuaire ldap qu'en dernier recours. Cela garantit que les comptes locaux du système (comme root) seront toujours résolus instantanément, même si le réseau ou le serveur LDAP est indisponible.

Q142.

Comment illustrer simplement le fonctionnement du mécanisme name service switch intégrant l'utilisation de l'annuaire LDAP ?

Recherchez la commande de récupération des entrées depuis les bases de données d'administration dans les outils fournis avec les bibliothèques standard (paquet libc-bin).

dpkg -L libc-bin | grep "bin/"

La commande getent fournie avec le paquet libc-bin donne la liste des entrées accessibles pour chaque catégorie du fichier de configuration. Voici un exemple pour la catégorie passwd qui fait apparaître les entrées de l'annuaire LDAP à la suite des comptes utilisateurs système issus des fichiers locaux.

getent passwd

Plutôt que de lire directement le fichier /etc/passwd qui ne contient que les comptes locaux, le système utilise un outil capable d'interroger le mécanisme d'aiguillage NSS. La commande getent, issue des bibliothèques C standard (paquet libc-bin) joue ce rôle. Elle permet de lister les entrées d'une base de données système (comme passwd ou group) indépendamment de la source d'où proviennent ces données.

getent passwd luke
luke:x:10003:10003:Luke Skywalker:/ahome/luke:/bin/bash

Q143.

Comment valider l'authentification d'un utilisateur déclaré dans l'annuaire LDAP ?

Identifiez et testez deux types d'authentifications qui utilise un compte de l'annuaire LDAP.

Test de bascule d'identité locale (su)

La commande su - (Switch User avec l'environnement complet) est le moyen le plus immédiat de solliciter la pile PAM.

Affichez le mot de passe d'un utilisateur de l'annuaire.

cat .ldap_anakin_pass

Prenez son identité.

su - anakin
Mot de passe :
su: warning: cannot change directory to /ahome/anakin: Aucun fichier ou dossier de ce nom
anakin@ldap-clnt:/home/etu$ exit
déconnexion

Relevez les traces de cette authentification dans les journaux du système.

journalctl -o cat -n 20 --grep="pam_unix" | grep anakin
pam_unix(su-l:session): session closed for user anakin
pam_unix(su-l:session): session opened for user anakin(uid=10001) by etu(uid=1000)
pam_unix(su-l:auth): authentication failure; logname=etu uid=1000 euid=0 tty=/dev/pts/0 ruser=etu rhost=  user=anakin

Vous remarquerez la présence d'une ligne indiquant authentication failure par pam_unix. Ce n'est pas un bug, c'est le fonctionnement normal en cascade de PAM ! Le module pam_unix tente d'abord de vérifier le mot de passe dans le fichier local /etc/shadow. Comme Anakin n'y figure pas, il échoue et trace cet échec. PAM passe alors le relais au module suivant (pam_ldap via nslcd), qui lui réussit et autorise l'ouverture de la session.

Test d'authentification réseau (ssh)

Le même comportement doit se vérifier lors d'une tentative de connexion distante via le service SSH, qui s'appuie lui aussi sur PAM.

ssh anakin@localhost
(anakin@localhost) Password:
Linux ldap-clnt 7.0.4+deb14-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 7.0.4-1 (2026-05-07) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri May 15 15:02:34 2026 from ::1
Could not chdir to home directory /ahome/anakin: No such file or directory
anakin@ldap-clnt:/$

L'intégration de l'annuaire est fonctionnelle. Les identités sont résolues et les mots de passe sont validés. Il ne manque désormais plus que l'accès au système de fichiers (montage réseau ou création à la volée) pour que l'environnement de travail de l'utilisateur soit pleinement opérationnel. Cette partie système de fichiers réseau sera traitée dans le prochain énoncé de travaux pratiques avec l'intégration de l'automontage NFSv4 dans l'annuaire LDAP.

On pourrait se satisfaire de l'état actuel de la configuration et en rester là. Cependant, un aspect essentiel a été négligé : la sécurisation des échanges entre le client et le serveur LDAP.

Pour vous convaincre de la gravité de cette négligence, procédez à une capture de trafic côté serveur pendant qu'une requête est lancée depuis le client.

Si nécessaire, installez le paquet tshark, puis lancez une capture de trafic réseau sur le serveur LDAP.

tshark -i enp0s1 -Y "ldap" -V >ldapi-simple-bind.trace

Maintenant, côté client, lancez une requête de consultation de l'annuaire.

ldapsearch -LLL -x -H ldap://ldap-srvr \
    -D "cn=admin,dc=lab,dc=local" \
    -y .ldap_admin_pass \
    -b "dc=lab,dc=local" \
    uid=padme

Arrêtez la capture avec Ctrl+c, ouvrez le fichier ldapi-simple-bind.trace et cherchez le mot clé authentication.

grep -A8 -i bindrequest ldap-simple-bind.trace
    LDAPMessage bindRequest(1) "cn=admin,dc=lab,dc=local" simple
        messageID: 1
        protocolOp: bindRequest (0)
            bindRequest
                version: 3
                name: cn=admin,dc=lab,dc=local
                authentication: simple (0)
                    simple: ADMIN_PASSWORD_IN_CLEAR_TEXT

C'est la catastrophe ! Il suffit en effet d'une simple capture de trafic pour obtenir le mot de passe de l'administrateur de l'annuaire LDAP. Il n'est donc pas question de s'arrêter là.

L'objectif des parties suivantes de l'énoncé est donc tout trouvé : sécuriser les échanges entre le client et le serveur LDAP.