7. Accès transparent aux ressources LDAP & NFS depuis le client

L'annuaire LDAP du serveur est désormais complet et accessible, et le client obtient déjà de façon transparente les informations sur les comptes utilisateurs qu'il héberge : résolution NSS/PAM authentifiée via le compte de service nslcd-proxy et bind SASL/GSSAPI du principal machine validés dans la Section 4.4, « Configurer l'accès transparent à l'annuaire depuis le client ». Le schéma autofs.schema et les cartes de montage auto.master/auto.home ont, de leur côté, été publiés dans l'unité ou=automount de ce même annuaire (Section 6, « Intégrer la configuration de l'automontage dans l'annuaire LDAP »).

Il reste donc à obtenir, de façon tout aussi transparente, la localisation et le montage des répertoires personnels exportés par le service NFSv4 : c'est le rôle du service autofs, configuré pour interroger directement l'annuaire plutôt que des fichiers locaux. Cette partie termine la synthèse en configurant ce dernier maillon sur le client, puis en validant l'ensemble de la chaîne, de la résolution du compte jusqu'au montage NFSv4 sécurisé.

7.1. Automontage NFS à partir de la configuration publiée par l'annuaire LDAP

Le paquet autofs-ldap a déjà été installé sur le client, avec sa dépendance autofs, pour fournir le schéma de la partie automontage au serveur LDAP (Section 6.1, « Installer le support LDAP pour l'automontage »). Le démon automount lui-même n'a en revanche reçu aucune configuration : il faut lui indiquer qu'il doit interroger l'annuaire, avec quel serveur, sous quelle base de recherche, et avec quelle identité, puisque l'unité ou=automount est couverte par les mêmes règles olcAccess que ou=users : sa lecture exige un bind authentifié (Section 6.3, « Publier la configuration de l'automontage dans l'annuaire »).

Q222.

Quelle est la modification à apporter au fichier /etc/nsswitch.conf pour que le démon automount accède aux ressources de l'annuaire LDAP ?

Recherchez la directive qui spécifie la source des cartes d'automontage.

On ajoute une ligne automount, au même titre que les lignes passwd, group et shadow déjà modifiées pour nslcd (Section 4.4, « Configurer l'accès transparent à l'annuaire depuis le client »).

grep ^automount /etc/nsswitch.conf ||\
  echo -e "\nautomount:      ldap" | sudo tee -a /etc/nsswitch.conf

Q223.

Quels sont les paramètres à porter dans /etc/default/autofs et dans /etc/autofs_ldap_auth.conf pour que le service se connecte à l'annuaire avec les mêmes garanties que nslcd, et pour qu'il retrouve les cartes publiées avec le schéma autofs.schema ?

Rassemblez ces réglages dans un script unique, à l'image des scripts configure-nslcd-proxy.sh et publish-autofs-schema.sh déjà utilisés dans ce support.

Trois fichiers sont à écrire ou compléter :

  • /etc/default/autofs : le nom de la carte maîtresse, le serveur et la base de recherche LDAP, ainsi que les noms de classes d'objets et d'attributs correspondant au schéma autofs.schema (automountMap/automount, attributs ou/cn/automountInformation), puisque le programme suppose par défaut l'ancien schéma nisMap/nisObject.

  • /etc/autofs_ldap_auth.conf : l'unité ou=automount refusant tout accès anonyme, ce fichier porte les paramètres d'authentification du bind. Plutôt que de créer un compte de service supplémentaire, on réutilise directement l'identité machine déjà déployée pour le bind SASL/GSSAPI de la Section 4.4, « Configurer l'accès transparent à l'annuaire depuis le client » : le principal host/clnt.lab.local@LAB.LOCAL et son keytab système /etc/krb5.keytab (Q : Q192).

cat << 'SCRIPT_EOF' >configure-autofs.sh
#!/usr/bin/env bash
# ==============================================================================
# configure-autofs.sh
# Configures autofs on Debian GNU/Linux to query LDAP maps over LDAPS
# using SASL/GSSAPI with the machine's host Kerberos principal.
# ==============================================================================
set -euo pipefail

readonly DOMAIN="lab.local"
readonly REALM="${DOMAIN^^}"
readonly CLIENT_FQDN="clnt.${DOMAIN}"
readonly HOST_PRINCIPAL="host/${CLIENT_FQDN}@${REALM}"
readonly KEYTAB_FILE="/etc/krb5.keytab"

# Validate host keytab presence
if [[ ! -s "${KEYTAB_FILE}" ]]; then
  echo "[-] Error: System keytab '${KEYTAB_FILE}' not found or empty." >&2
  echo "    Ensure 'install-lab-host-keytab.sh' was executed successfully." >&2
  exit 1
fi

echo "=== 1. Configuring /etc/nsswitch.conf for automount ==="
if grep -q '^automount:' /etc/nsswitch.conf; then
  if ! grep -E '^automount:.*\<ldap\>' /etc/nsswitch.conf >/dev/null; then
    sed -i -E 's/^(automount:[[:space:]]*)(.*)$/\1\2 ldap/' /etc/nsswitch.conf
  fi
else
  echo "automount:      files ldap" >> /etc/nsswitch.conf
fi

echo "=== 2. Writing /etc/default/autofs ==="
cat << 'EOF' > /etc/default/autofs
# Master map entry point in LDAP DIT
MASTER_MAP_NAME="ou=auto.master,ou=automount,dc=lab,dc=local"
TIMEOUT=300
BROWSE_MODE="no"
LOGGING="verbose"

# LDAP Target URI (native LDAPS on port 636)
LDAP_URI="ldaps://ldap-srvr.lab.local"
SEARCH_BASE="ou=automount,dc=lab,dc=local"

# Schema mapping corresponding to autofs.schema (RFC 2307bis extended)
MAP_OBJECT_CLASS="automountMap"
ENTRY_OBJECT_CLASS="automount"
MAP_ATTRIBUTE="ou"
ENTRY_ATTRIBUTE="cn"
VALUE_ATTRIBUTE="automountInformation"

# Explicit path to the credentials configuration file
AUTH_CONF_FILE="/etc/autofs_ldap_auth.conf"
EOF

echo "=== 3. Writing /etc/autofs_ldap_auth.conf (SASL/GSSAPI) ==="
# Notes:
# - usetls/tlsrequired are set to "no" as transport is natively wrapped in ldaps://.
# - authtype="GSSAPI" with clientprinc instructs autofs to authenticate
#   directly using the machine credentials stored in /etc/krb5.keytab.
# - Omitting 'user' prevents Cyrus SASL from injecting an incompatible authzid.
cat << EOF > /etc/autofs_ldap_auth.conf
<?xml version="1.0" ?>
<autofs_ldap_sasl_conf
    usetls="no"
    tlsrequired="no"
    authrequired="yes"
    authtype="GSSAPI"
    clientprinc="${HOST_PRINCIPAL}"
/>
EOF

chmod 600 /etc/autofs_ldap_auth.conf
chown root:root /etc/autofs_ldap_auth.conf

echo "=== 4. Restarting autofs service ==="
systemctl restart autofs

echo ""
echo "[+] Success: autofs configured against LDAP using GSSAPI machine authentication."
SCRIPT_EOF
sudo bash configure-autofs.sh
[Note] Note

La confidentialité de la connexion entre automount et l'annuaire est déjà assurée par l'URI ldaps://ldap-srvr.lab.local : l'attribut usetls de autofs_ldap_auth.conf, qui commande l'utilisation de StartTLS sur une connexion ldap:// en clair, reste donc à no, exactement comme nslcd/ldap-starttls l'a été pour nslcd (Section 4.4, « Configurer l'accès transparent à l'annuaire depuis le client »). La confiance dans l'autorité de certification labCA est héritée du fichier /etc/ldap/ldap.conf déjà déployé sur ce client (Section 4.2, « Sécuriser les échanges avec TLS et l'authentification SASL/GSSAPI »), commun à tous les outils construits sur libldap.

Q224.

Comment vérifier que le service autofs a bien pris en compte cette configuration et s'est connecté à l'annuaire LDAP ?

systemctl status autofs
sudo systemctl status autofs
● autofs.service - Automounts filesystems on demand
     Loaded: loaded (/usr/lib/systemd/system/autofs.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-09-07 18:13:10 CEST; 5s ago
 Invocation: 17385f2a553d43438154449af7ef1fb3
       Docs: man:autofs(8)
    Process: 5743 ExecStart=/usr/sbin/automount $OPTIONS --pid-file /var/run/autofs.pid (code=exited, status=0/SUCCESS)
   Main PID: 5744 (automount)
      Tasks: 5 (limit: 971)
     Memory: 3.7M (peak: 4.8M)
        CPU: 69ms
     CGroup: /system.slice/autofs.service
             └─5744 /usr/sbin/automount --pid-file /var/run/autofs.pid

sept. 07 18:13:10 clnt systemd[1]: Starting autofs.service - Automounts filesystems on demand...
sept. 07 18:13:10 clnt (automount)[5743]: autofs.service: Referenced but unset environment variable evaluates to an empty string: OPTIONS
sept. 07 18:13:10 clnt automount[5744]: Starting automounter version 5.1.9, master map ou=auto.master,ou=automount,dc=lab,dc=local
sept. 07 18:13:10 clnt automount[5744]: using kernel protocol version 5.06
sept. 07 18:13:10 clnt automount[5744]: reading ldap master ou=auto.master,ou=automount,dc=lab,dc=local
sept. 07 18:13:10 clnt automount[5744]: connected to uri ldaps://ldap-srvr.lab.local
sept. 07 18:13:10 clnt automount[5744]: reading ldap map ldap:ou=auto.home,ou=automount,dc=lab,dc=local
sept. 07 18:13:10 clnt automount[5744]: mounted indirect on /ahome with timeout 300, freq 75 seconds
sept. 07 18:13:10 clnt systemd[1]: Started autofs.service - Automounts filesystems on demand.

La ligne connected to uri ldaps://ldap-srvr.lab.local confirme que le démon a bien authentifié son bind avec le principal machine host/clnt.lab.local@LAB.LOCAL : un keytab absent ou périmé, ou une unité ou=automount encore fermée à l'accès anonyme, se traduirait ici par une erreur GSS-API error ou Insufficient access et l'absence du point de montage indirect /ahome.

7.2. Diagnostiquer et compléter l'authentification Kerberos par utilisateur

Le service autofs configuré, un premier changement d'identité vers un compte de l'annuaire semble aboutir, mais révèle un blocage inattendu.

su - anakin
Password:
su: warning: cannot change directory to /ahome/anakin: Permission non accordée
-bash: /ahome/anakin/.bash_profile: Permission non accordée
anakin@clnt:/home/etu$ ls -l /ahome/anakin/
ls: impossible d'ouvrir le répertoire '/ahome/anakin/': Panne d'accès au fichier
anakin@clnt:/home/etu$ mount | grep anakin
nfs-srvr.lab.local:/home/anakin on /ahome/anakin type nfs4 \
(rw,nosuid,nodev,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,
proto=tcp6,timeo=600,retrans=2,sec=krb5p,
clientaddr=2001:db8:VVVV::baad:caff:fefe:6,local_lock=none,
xprtsec=mtls,addr=2001:db8:VVVV::baad:caff:fefe:5,_netdev)

Le mot de passe a bien été accepté, le service autofs a bien déclenché le montage NFSv4 avec les options de sécurité attendues, et pourtant tout accès au contenu du répertoire est refusé.

Q225.

Pourquoi l'accès au contenu du répertoire est-il refusé alors que l'authentification et le montage ont, en apparence, réussi ?

L'option sec=krb5p ne se limite pas à sécuriser la négociation du montage : elle impose, pour chaque opération RPC ultérieure (ouverture de répertoire, lecture, écriture), la construction d'un contexte RPCSEC_GSS propre à l'identifiant numérique de l'utilisateur qui effectue l'appel. Ce contexte ne peut être construit qu'à partir d'un ticket Kerberos appartenant à cet utilisateur : c'est le rôle du démon rpc.gssd, qui recherche un tel ticket dans les caches présents sous /tmp.

Or aucune des identités déployées jusqu'ici n'est un ticket personnel : le principal host/clnt.lab.local (Q : Q192) authentifie la machine, et le compte nslcd-proxy (Section 4.4, « Configurer l'accès transparent à l'annuaire depuis le client ») authentifie un service. Ni l'un ni l'autre ne circule au nom d'anakin. Vérifiez qu'aucun ticket personnel n'a été délivré.

klist
klist: No credentials cache found while getting default ccache

C'est cette absence de ticket, et non l'échec d'une authentification, qui provoque le refus Permission non accordée : la connexion elle-même a réussi via le compte nslcd-proxy côté NSS/PAM, mais aucun mécanisme n'a jamais demandé de ticket Kerberos pour anakin lui-même.

Q226.

Le paquet libpam-krb5 a pourtant déjà été installé sur le client dès la partie Section 3.4, « Installer et initialiser le service Kerberos » : pourquoi n'a-t-il jamais délivré de ticket jusqu'ici ?

Le paquet libpam-krb5 déclenche cette commande automatiquement lors de son installation : le module est donc déjà intégré à la pile d'authentification commune depuis la partie Section 3.4, « Installer et initialiser le service Kerberos ». Vérifiez sa présence, aux côtés du module fourni par libpam-ldapd.

grep -nE 'pam_krb5|pam_ldap' /etc/pam.d/common-auth
17:auth   [success=3 default=ignore]      pam_krb5.so minimum_uid=1000
19:auth [success=1 default=ignore]      pam_ldap.so minimum_uid=1000 use_first_pass

La pile PAM examine ces lignes dans leur ordre d'apparition : le premier module qui réussit interrompt les suivants grâce à son contrôle [success=N default=ignore]. Le numéro de ligne renvoyé par grep -n permet de vérifier lequel des deux modules est sollicité en premier :

  • Si pam_krb5.so précède pam_ldap.so (ordre attendu par défaut sur Debian, Kerberos étant considéré comme le mécanisme fort), l'authentification Kerberos est tentée en premier. Tant qu'aucun principal anakin@LAB.LOCAL n'existe dans le royaume, cette tentative échoue silencieusement (utilisateur inconnu du KDC) et la pile se rabat sur pam_ldap.so, qui valide le mot de passe par un simple bind à l'annuaire : la connexion aboutit, mais sans jamais passer par Kerberos ni obtenir de ticket.

  • Si l'ordre observé sur votre client est inversé, pam_ldap.so réussit en premier et court-circuite pam_krb5.so, qui n'est alors jamais sollicité : la création du principal, seule, ne suffirait pas à obtenir un ticket. Il faudrait alors redonner la priorité au profil krb5 avant de poursuivre.

Q227.

Comment provisionner, dans le royaume Kerberos, un principal par compte Skywalker, sans redemander de nouveaux mots de passe ?

Les mots de passe individuels ont déjà été enregistrés sur le serveur lors de la création des comptes dans l'annuaire (Section 4.3, « Construire l'arbre et peupler l'annuaire »), précisément pour permettre cette synchronisation ultérieure avec le KDC.

Sur le serveur, réutilisez les fichiers ~/.ldap_<uid>_pass pour créer, ou resynchroniser si le principal existe déjà, un principal par compte.

cat << 'SCRIPT_EOF' >provision-skywalker-principals.sh
#!/usr/bin/env bash
set -euo pipefail

readonly DOMAIN="lab.local"
readonly REALM="${DOMAIN^^}"
readonly USERS=(padme anakin leia luke)

echo "=== 1. Provisioning Kerberos principals from the LDAP secrets ==="
for user in "${USERS[@]}"; do
  PASS_FILE="${HOME}/.ldap_${user}_pass"
  if [[ ! -s "${PASS_FILE}" ]]; then
    echo "Error: Secret not found in ${PASS_FILE}." >&2
    exit 1
  fi
  USER_PASS=$(head -n 1 "${PASS_FILE}")

  sudo kadmin.local -q "addprinc -pw ${USER_PASS} ${user}@${REALM}" >/dev/null 2>&1 || \
  sudo kadmin.local -q "cpw -pw ${USER_PASS} ${user}@${REALM}" >/dev/null 2>&1
  echo "  - ${user}@${REALM} : principal is synchronised with the LDAP directory"
done

echo -e "\nSuccess: Skywalkers' family Kerberos principals are provisioned in the realm ${REALM}"
SCRIPT_EOF
bash provision-skywalker-principals.sh
=== 1. Provisioning Kerberos principals from the LDAP secrets ===
  - padme@LAB.LOCAL : principal is synchronised with the LDAP directory
  - anakin@LAB.LOCAL : principal is synchronised with the LDAP directory
  - leia@LAB.LOCAL : principal is synchronised with the LDAP directory
  - luke@LAB.LOCAL : principal is synchronised with the LDAP directory

Success: Skywalkers' family Kerberos principals are provisioned in the realm LAB.LOCAL.

Contrôlez la liste des principaux du royaume, en complément de la Section 3.4, « Installer et initialiser le service Kerberos ».

sudo kadmin.local -q "listprincs" | grep -E '^(padme|anakin|leia|luke)@LAB.LOCAL'
anakin@LAB.LOCAL
leia@LAB.LOCAL
luke@LAB.LOCAL
padme@LAB.LOCAL
[Attention] Attention

Le mot de passe Kerberos et le mot de passe LDAP de chaque compte sont désormais deux secrets distincts, qui ne restent identiques qu'à l'instant de ce script : un changement de mot de passe ultérieur d'un seul côté (par exemple via passwd côté PAM) romprait cette synchronisation. Ce support ne traite pas cette question, qui relève de la fédération d'identités.

Q228.

Le test initial peut-il maintenant être repris avec succès ?

Depuis le client, reprenez exactement la même commande : aucune reconfiguration n'est nécessaire côté client, puisque pam_krb5.so était déjà en place (Section 3.4, « Installer et initialiser le service Kerberos ») et n'attendait que l'existence du principal.

su - anakin
Password:
anakin@clnt:~$ pwd
/ahome/anakin
anakin@clnt:~$ klist
Ticket cache: FILE:/tmp/krb5cc_10001_WeX3hF
Default principal: anakin@LAB.LOCAL

Valid starting       Expires              Service principal
07/09/2026 18:34:14  08/09/2026 04:34:14  krbtgt/LAB.LOCAL@LAB.LOCAL
        renew until 08/09/2026 18:34:14
07/09/2026 18:34:14  08/09/2026 04:34:14  nfs/nfs-srvr.lab.local@LAB.LOCAL
renew until 08/09/2026 18:34:14
anakin@clnt:~$ ls -lAh
total 16K
-rw------- 1 anakin anakin   64  6 sept. 17:24 .bash_history
-rw-r--r-- 1 anakin anakin  220  6 sept. 17:22 .bash_logout
-rw-r--r-- 1 anakin anakin 3,5K  6 sept. 17:22 .bashrc
-rw-r--r-- 1 anakin anakin  807  6 sept. 17:22 .profile

Le ticket obtenu automatiquement par pam_krb5.so au nom du principal anakin@LAB.LOCAL permet désormais à rpc.gssd de construire le contexte RPCSEC_GSS attendu par le montage sec=krb5p : l'accès au répertoire personnel est cette fois complet, sans qu'aucun paramètre du montage NFSv4 lui-même n'ait changé.

7.3. Valider l'accès transparent de bout en bout

Cette dernière sous-partie ne configure plus rien : elle isole les vérifications qui qualifient l'ensemble de la chaîne construite depuis la Section 4, « Déployer l'annuaire LDAP », en synthétisant les résultats déjà obtenus au fil des sous-parties précédentes.

Q229.

Comment synthétiser l'ensemble des vérifications réalisées au fil de ce support de travaux pratiques ?

Le tableau ci-dessous reprend, dans l'ordre de la progression, chaque brique validée et la commande qui en apporte la preuve.

Tableau 4. Synthèse des tests de validation

Brique vérifiée Commande Résultat attendu
Annuaire LDAP en TLS ldapwhoami -H ldaps://ldap-srvr.lab.local Connexion chiffrée acceptée, seuil SSF satisfait
Bind SASL/GSSAPI machine ldapwhoami -Y GSSAPI dn:cn=clnt.lab.local,ou=hosts,dc=lab,dc=local
Résolution NSS des comptes getent passwd Comptes Skywalker visibles avec leur uidNumber
Exportation NFSv4 sécurisée exportfs -v Options sec=krb5p,xprtsec=tls:mtls déclarées
Cartes autofs publiées dans l'annuaire systemctl status autofs connected to uri ldaps://…, montage indirect actif
Ticket Kerberos personnel su - anakin && klist Principal anakin@LAB.LOCAL valide
Montage NFSv4 effectivement sécurisé mount | grep nfs4 Options sec=krb5p et xprtsec=mtls appliquées, pas seulement déclarées
Accès effectif au répertoire personnel ls -la /ahome/anakin/ Contenu lisible, sans Permission non accordée

Les deux dernières lignes bouclent la démarche : elles apportent, côté client, la preuve que les options de sécurité choisies dès l'écriture du fichier /etc/exports (Section 5.1, « Configurer l'exportation sur le serveur NFSv4 ») et reprises dans l'entrée automountInformation publiée dans l'annuaire (Section 6.3, « Publier la configuration de l'automontage dans l'annuaire ») sont bien celles qui protègent, de bout en bout, un montage auquel l'utilisateur accède réellement : ni la déclaration côté serveur, ni le montage lui-même, ne suffisent sans le ticket Kerberos personnel mis en évidence dans la Section 7.2, « Diagnostiquer et compléter l'authentification Kerberos par utilisateur ».