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.
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.
Les manipulations présentées ici couvrent plusieurs points :
-
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/passwdou/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é. -
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. -
L'automatisation et la reproductibilité
Pour dépasser l'approche de configuration manuelle interactive avec les interfaces de typedebconf, le déploiement du sous-système client (démonsnslcdet 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 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 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 #!/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 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 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 Installez le paquet 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 |
|
|
Q139. |
Comment installer le paquet libnss-ldapd et ses dépendances en mode non-interactif ? Installez le paquet Par exemple : sudo debconf-show libnss-ldapd Recherchez la liste des paramètres utilsés par 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 #!/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 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) ? |
Le rôle de l'interface PAM/LDAP (via le paquet |
|
|
Q141. |
Quelles modifications ont été apportées par l'installation du paquet Vérifiez le contenu du fichier |
grep ldap /etc/nsswitch.conf passwd: files systemd ldap group: files systemd ldap shadow: files systemd ldap Le mot-clé |
|
|
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 |
dpkg -L libc-bin | grep "bin/" La commande getent fournie avec le paquet getent passwd Plutôt que de lire directement le fichier 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. |
|
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.

![[Note]](/images/note.png)
![[Attention]](/images/caution.png)