8. Sécuriser les transactions NFS

L'objectif des manipulations de cette section est d'offrir un niveau de protection élevé contre les tentatives d'interception de trafic et d'usurpation d'identité dans les échanges entre le serveur NFS et son client de test.

La représentation graphique de la Section 3, « Protocole NFSv4 » fait apparaître plusieurs briques de sécurité intégrées au protocole NFSv4.2. Nous devons choisir celles qui permettent d'atteindre un niveau de sécurité satisfaisant.

Voici une représentation du processus suivi dans cette section.

8.1. Choisir les mécanismes de sécurisation

Pour respecter les bonnes pratiques, nous devons utiliser le protocole Kerberos V5, qui permet d'établir une authentification mutuelle entre un client et un serveur avant la transmission des données du système de fichiers partagé.

La configuration de Kerberos V5 avec NFSv4.2 nécessite :

  • Un serveur KDC (Key Distribution Center) correctement configuré.

  • Des certificats et principaux de service appropriés pour le serveur NFS, le client et les utilisateurs.

  • Une synchronisation temporelle précise entre tous les systèmes.

Les pages de manuel (man 5 exports) détaillent les paramètres de l'option sec=, suivie d'une liste de types de sécurité délimités par des deux-points. Cette option limite l'exportation aux clients utilisant ces types. Les types de sécurité disponibles sont les suivants :

  • sys : c'est cette valeur par défaut, sans sécurité cryptographique, qui a été utilisée pour toutes les manipulations des sections précédentes. L'interception du trafic avec l'outil tshark a révélé que les données contenues dans les échanges NFS pouvaient être lues par un tiers.

  • krb5 : à ce niveau, seule l'authentification est assurée. La vérification cryptographique de l'identité des utilisateurs empêche toute usurpation.

  • krb5i : cette option ajoute le contrôle d'intégrité à l'authentification. On s'assure ainsi que les données échangées n'ont pas été modifiées pendant leur transit.

  • krb5p : il s'agit du niveau de sécurité le plus élevé, car il allie authentification, intégrité et confidentialité, garantissant ainsi que les données échangées restent secrètes.

Pour la négociation du type de sécurité entre le serveur et les clients, l'ordre est important : les types préférés doivent être listés en premier.

Le choix retenu pour la configuration à mettre en place est : sec=krb5p.

L'API GSS-API, via le framework RPCSEC_GSS, fournit une abstraction des mécanismes de sécurité en offrant la possibilité d'utiliser différents protocoles (Kerberos, SPKM) via une interface unifiée. Elle permet également de négocier de manière transparente les capacités de sécurité entre le client et le serveur.

Nous n'avons pas de choix de configuration à faire pour cette brique de la pile du protocole NFSv4.2.

L'utilisation de TLS sur RPC (RPC-over-TLS selon la RFC 9289) en complément de Kerberos apporte des avantages considérables, avec une protection indépendante au niveau de la couche de transport :

  • Le chiffrement au niveau de la couche transport protège tous les protocoles qui utilisent RPC, dont rpcbind.

  • La protection contre les attaques de surveillance systématique et continue des flux réseau qui permettent d'exploiter les métadonnées.

  • Le chiffrement opportuniste permettant la coexistence avec des systèmes non TLS.

Pour conclure cette partie, on aboutit à la répartition des rôles suivante :

TLS

Authentification des hôtes et chiffrement des appels RPC dans la couche transport.

Kerberos

Authentification des utilisateurs, chiffrement et contrôle d'accès des transactions NFS.

Cette séparation permet de mettre en place une architecture de sécurité en profondeur plus robuste.

8.2. Modifier les configurations NFS du serveur et du client

Avant d'aborder la mise en place des outils de sécurité, commençons par adapter les configurations de l'exportation par le serveur et du service autofs du client.

Q90.

Quelles sont les modifications à apporter au fichier /etc/exports du serveur NFS pour activer les fonctions de sécurité choisies ?

Recherchez dans les pages de manuel les options à ajouter.

Consultez le manuel avec : man 5 exports et identifiez les paramètres utiles relativement aux choix retenus.

Créez un nouveau script de génération du fichier /etc/exports.

#!/bin/bash

IPV4_NETWORK=172.28.101.0/24
IPV6_NETWORK=2001:678:3fc:65::/64

cat << EOF > /etc/exports
/home/exports           ${IPV4_NETWORK}(rw,sync,fsid=0,crossmnt,no_subtree_check,sec=krb5p,xprtsec=tls:mtls)
/home/exports/home      ${IPV4_NETWORK}(rw,sync,no_subtree_check,sec=krb5p,xprtsec=tls:mtls)

/home/exports           ${IPV6_NETWORK}(rw,sync,fsid=0,crossmnt,no_subtree_check,sec=krb5p,xprtsec=tls:mtls)
/home/exports/home      ${IPV6_NETWORK}(rw,sync,no_subtree_check,sec=krb5p,xprtsec=tls:mtls)
EOF

Relativement à la configuration initiale, les deux options ajoutées sont :

  • sec=krb5p

  • xprtsec=tls:mtls

Si le code du script ci-dessus est enregistré dans un fichier appelé secure-nfs-exports.sh, on peut lancer la création du nouveau fichier /etc/exports.

Créez une copie de sauvegarde de la version actuelle du fichier /etc/exports.

sudo cp /etc/exports /etc/exports.backup

Générez la nouvelle version du fichier de configuration de l'exportation.

sudo bash secure-nfs-exports.sh

Redémarrez le service pour que la nouvelle configuration soit prise en charge.

sudo systemctl restart nfs-srvr

Vérifiez que le service est bien actif et sans erreur de configuration.

systemctl status nfs-srvr

Q91.

Quelles sont les modifications à apporter aux fichiers de configuration du service autofs du client NFS pour activer les fonctions de sécurité choisies ?

Recherchez dans les pages de manuel les options à ajouter.

Consultez les pages des manuels du service autofs. Par exemple : man 5 autofs.

Comme l'objectif est de reproduire le jeu d'options du serveur, on doit retrouver les mêmes éléments que dans la question précédente.

Créez une copie de sauvegarde des fichiers actuels.

sudo cp /etc/auto.master.d/ahome.autofs /etc/auto.master.d/ahome.autofs.backup
sudo cp /etc/auto.home /etc/auto.home.backup

Créez les nouvelles version de ces fichiers.

echo "/ahome  /etc/auto.home --timeout=300" | \
    sudo tee /etc/auto.master.d/ahome.autofs
echo "*    -fstype=nfs4,hard,sec=krb5p,xprtsec=mtls,nosuid,nodev,_netdev    nfs-srvr.lab.local:/home/&" | \
    sudo tee /etc/auto.home

On retrouve les mêmes options que sur le serveur auxquelles on a ajouté les paramètres suivants.

  • sec=krb5p : version Kerberos présentée dans la section précédente.

  • xprtsec=mtls : authentification TLS mutuelle.

  • nosuid : désactive l'interprétation des bits SUID/SGID.

  • nodev : ignore les fichiers de périphériques.

  • _netdev : signale à systemd que le montage doit attendre que le réseau soit disponible.

Redémarrez le service pour que la nouvelle configuration soit prise en charge.

sudo systemctl restart autofs

Vérifiez que le service est bien actif et sans erreur de configuration.

systemctl status autofs

8.3. Installer et configurer le serveur Kerberos

Maintenant que les options d'exportation et de montage dynamiques doivent utiliser Kerberos, il faut configurer le serveur KDC et son client. Les rôles serveur et client sont conservés : le serveur NFS est également le serveur KDC.

Q92.

Quels sont les paquets à installer pour configurer le serveur KDC ?

Recherchez la liste des paquets dont le nom débute par krb5.

Lancez la recherche avec le gestionnaire de paquets.

apt search --names-only ^krb5

On obtient ainsi une liste d'une vingtaine de paquets. Affichez les informations de chaque paquet pour décider s'il faut le retenir dans le contexte d'un serveur KDC.

apt show krb5-kdc | grep -A5 "This package"
 This package contains the Kerberos key server (KDC).  The KDC manages all
 authentication credentials for a Kerberos realm, holds the master keys
 for the realm, and responds to authentication requests.  This package
 should be installed on both master and slave KDCs.

Répétez cette opération pour les autres paquets de la liste.

Au minimum, on retient deux paquets :

  • krb5-kdc : Installe le Centre de Distribution des Clés (KDC), le moteur principal qui vérifie les identités et distribue les tickets d'accès.

  • krb5-admin-server : Fournit le démon d'administration (kadmind) nécessaire pour gérer la base de données Kerberos (création de comptes, génération de keytabs) via le réseau.

Q93.

Comment installer et configurer le Key Distribution Center (KDC) sur le serveur NFS ?

Contrairement au service NFS, pour lequel on a séparé l'installation des paquets de la configuration, le service Kerberos ne le permet pas nativement. Vous devez donc créer un script de bootstrap dédié à Kerberos qui procède à l'installation des paquets avec une configuration fournie en mode pre-seeding, en utilisant les outils debconf.

Créez le script Bash bootstrap-kdc.sh avec les parties suivantes :

  1. Charger les variables et le secret maître

    Définissez le domaine lab.local, le royaume Kerberos et le nom du serveur KDC nfs-srvr.LAB.LOCAL, puis récupérer de manière sécurisée le mot de passe maître stocké dans .kdc_master_pass.
  2. Pré-configurer Debconf pour une installation non interactive

    Préparez l'injection via debconf-set-selections du nom du royaume, du serveur KDC et du serveur d'administration.
  3. Installer les paquets du serveur Kerberos

    Installez les paquest krb5-kdc et krb5-admin-server en mode non interactif.
  4. Déployer la configuration kerberos

    Créez le fichier de configuration système /etc/krb5.conf en désactivant les chiffrements faibles et en forçant AES-256/128 pour les tickets et les TGS.
  5. Initialiser la base cryptographique du KDC

    Appelez kdb5_util en injectant le mot de passe maître de manière non interactive via l'option -P.
  6. Redémarrer et activer les services Kerberos

    Activez et redémarrez les services krb5-kdc et krb5-admin-server avec la commande systemctl.

Copiez l'exemple de code ci-dessous dans le fichier bootstrap-kdc.sh.

#!/usr/bin/env bash

set -euo pipefail

echo "1. Loading variables and secrets"
readonly DOMAIN="lab.local"
readonly REALM="${DOMAIN^^}"
readonly KDCSERVER="nfs-srvr.${DOMAIN}"
readonly ADMINPASSFILE="${HOME}/.kdc_master_pass"

if [[ ! -f ${ADMINPASSFILE} ]]; then
        openssl rand -base64 28 | cut -c -24 >"${ADMINPASSFILE}"
        chmod 400 "${ADMINPASSFILE}"
        echo "Master password generated in ${ADMINPASSFILE}"
fi

KDCMASTERPWD="$(head -n 1 "${ADMINPASSFILE}")"
readonly KDCMASTERPWD

echo "2. Pre-configure Debconf for silent installation"
sudo debconf-set-selections <<EOF
krb5-config krb5-config/default_realm string ${REALM}
krb5-config krb5-config/kerberos_servers string ${KDCSERVER}
krb5-config krb5-config/admin_server string ${KDCSERVER}
krb5-config krb5-config/add_servers boolean true
EOF

echo "3. Installing Kerberos packages"
sudo DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
        krb5-kdc krb5-admin-server

echo "4. Deploying system configuration /etc/krb5.conf"
cat <<EOF | sudo tee /etc/krb5.conf >/dev/null
[libdefaults]
    default_realm = ${REALM}
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true
    rdns = true
    allow_weak_crypto = false
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
    permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96

[realms]
    ${REALM} = {
        kdc = ${KDCSERVER}
        admin_server = ${KDCSERVER}
        default_domain = ${DOMAIN}
    }

[domain_realm]
    .${DOMAIN} = ${REALM}
    ${DOMAIN} = ${REALM}
EOF

echo "5. Initializing cryptographic database"
sudo kdb5_util create -s -r "${REALM}" -P "${KDCMASTERPWD}"

echo "6. Create minimal ACL and restart services"
echo "*/admin@${REALM} *" | sudo tee /etc/krb5kdc/kadm5.acl >/dev/null
sudo systemctl enable krb5-kdc krb5-admin-server
sudo systemctl restart krb5-kdc krb5-admin-server

echo ""
echo "Success — Kerberos KDC is installed and configured."
echo "  Active realm  : ${REALM}"
echo "  Master server : ${KDCSERVER}"
echo "  Master password stored in : ${ADMINPASSFILE}"

Lancez le script sur le serveur NFS.

bash bootstrap-kdc.sh

Vérifiez que les deux services sont actifs et sont initialisés correctement.

systemctl status krb5-kdc krb5-admin-server

Expliquez le choix des différents paramètres de configuration.

Section [libdefaults]
  • default_realm = LAB.LOCAL : spécifie le domaine Kerberos par défaut pour les authentifications.

  • kdc_timesync = 1 : active la synchronisation d'horloge avec le KDC, ce qui est essentiel pour éviter l'échec des tickets.

  • ccache_type = 4 : définit le format du cache de tickets (KEYRING est recommandé avec Linux pour plus de sécurité et pour la gestion des sessions par utilisateur).

  • forwardable = true / proxiable = true : autorise la délégation de tickets si nécessaire, par exemple pour qu’un serveur NFS puisse agir pour le compte d’un utilisateur.

  • rdns = true : active la résolution inverse DNS des hôtes lors de l'utilisation de Kerberos.

  • allow_weak_crypto = false : interdit les algorithmes obsolètes (DES, RC4).

  • default_tkt_enctypes / default_tgs_enctypes / permitted_enctypes : restreint Kerberos aux suites robustes AES-256 et AES-128 (conforme aux recommandations actuelles de sécurité).

Section [realms]

LAB.LOCAL est défini comme le realm Kerberos principal.

  • kdc = nfs-srvr.lab.local : désigne le serveur qui distribue les tickets Kerberos (KDC).

  • admin_server = nfs-srvr.lab.local : désigne le gestionnaire des identités Kerberos (kadmin).

  • default_domain = lab.local : associe ce domaine DNS au realm Kerberos.

Section [domain_realm]
  • Associe le suffixe DNS .lab.local et le domaine lab.local au realm Kerberos LAB.LOCAL.

  • Cela permet aux clients de résoudre automatiquement vers le bon realm sans configuration explicite pour chaque hôte.

Q94.

Quelle est la définition d'un principal Kerberos ?

Quel est le rôle du keytab Kerberos ?

Recherchez les informations en ligne sur les notions de principal et de keytab.

Un principal Kerberos est une identité unique utilisée pour l'authentification sécurisée au sein d'un domaine. Il est généralement composé d'un nom d'utilisateur ou de service, d'une instance optionnelle et d'un royaume (realm). Cette combinaison, enregistrée dans la base de données Kerberos, permet d'associer des clés de chiffrement à l'identité et de garantir qu'un utilisateur, un service ou un hôte dispose d'une entité distincte pour établir des communications sécurisées.

Un keytab Kerberos est un fichier qui stocke de manière sécurisée les identités (principaux) et leurs clés de chiffrement associées pour des services ou des hôtes. Il permet à ces services de s'authentifier automatiquement auprès du serveur Kerberos (KDC) sans intervention humaine ni saisie de mot de passe, ce qui facilite l'authentification forte et automatisée au sein du domaine Kerberos.

Q95.

Quelles sont les commandes qui permettent d'administrer la base Kerberos ?

Recherchez dans les paquets installés les commandes qui correspondent à kadmin.

Lancez la recherche des commandes contenant la chaîne kadmin.

sudo dpkg -S kadmin | grep bin
krb5-admin-server: /usr/sbin/kadmind
krb5-user: /usr/bin/kadmin.mit
krb5-admin-server: /usr/sbin/kadmin.local

Notez que kadmin est un lien symbolique vers la commande kadmin.mit.

ls -l /usr/bin/kadmin
lrwxrwxrwx 1 root root 24 23 févr.  2025 /usr/bin/kadmin -> /etc/alternatives/kadmin
ls -l /etc/alternatives/kadmin
lrwxrwxrwx 1 root root 19 23 févr.  2025 /etc/alternatives/kadmin -> /usr/bin/kadmin.mit

On distingue deux commandes fournies par deux paquets différents.

  • Le paquet krb5-user fournit kadmin qui permet d'administrer les objets Kerberos via authentification.

  • Le paquet krb5-admin-server fournit kadmin.local qui donne un accès direct aux objets sur le serveur KDC. Dans le contexte simplifié de ces manipulations, le serveur NFS est aussi le serveur KDC.

Q96.

Comment créer le principal pour administrer le domaine Kerberos à distance ?

Donnez une définition du rôle de principal dans l'architecture Kerberos.

Recherchez les informations sur le principal admin/admin.

Dans l'environnement Kerberos, un principal est un identifiant cryptographique unique attribué à chaque entité du réseau (utilisateur, machine ou service). Il permet à cette entité de prouver son identité au centre de distribution de clés (KDC) et d'obtenir des tickets d'accès sécurisés.

Créez le principal à partir du serveur KDC.

sudo kadmin.local -q "addprinc admin/admin"

Entrez un mot de passe sécurisé. Cette commande ajoute le principal admin/admin@LAB.LOCAL à la base Kerberos.

Vérifiez la présence de ce nouveau principal.

sudo kadmin.local -q "listprincs"
K/M@LAB.LOCAL
kadmin/admin@LAB.LOCAL

Décommentez ou ajoutez la ligne suivante dans le fichier /etc/krb5kdc/kadm5.acl.

 sudo grep -v ^# /etc/krb5kdc/kadm5.acl
*/admin *

Redémarrez le service d'administration Kerberos.

sudo systemctl restart krb5-admin-server

Testez l'accès au service d'administration Kerberos depuis le client NFS pour valider l'accès à distance.

sudo kadmin -p kadmin/admin -q "listprincs"
Authenticating as principal kadmin/admin with password.
Password for kadmin/admin@LAB.LOCAL:
K/M@LAB.LOCAL
kadmin/admin@LAB.LOCAL

Il est possible de renouveler ou changer le mot de passe depuis le serveur KDC à l'aide de la commande suivante :

sudo kadmin.local -q "cpw kadmin/admin"
Authenticating as principal root/admin@LAB.LOCAL with password.
Enter password for principal "kadmin/admin@LAB.LOCAL":
Re-enter password for principal "kadmin/admin@LAB.LOCAL":
Password for "kadmin/admin@LAB.LOCAL" changed.
sudo kadmin.local -q "listprincs"
K/M@LAB.LOCAL
kadmin/admin@LAB.LOCAL
kadmin/changepw@LAB.LOCAL

Q97.

Comment créer les principaux Kerberos du serveur, du client et du compte utilisateur de test ?

Consultez les pages de manuels de la commande kadmin.local fournie avec le paquet krb5-admin-server.

Commencez par définir les principaux à créer :

  • Serveur : nfs/nfs-srvr@LAB.LOCAL

  • Client : nfs/nfs-clnt@LAB.LOCAL

  • Utilisateur : etu-nfs@LAB.LOCAL

Créez les objets de la base Kerberos depuis le serveur NFS et KDC.

sudo kadmin.local -q "addprinc -randkey nfs/nfs-srvr@LAB.LOCAL"
sudo kadmin.local -q "addprinc -randkey nfs/nfs-clnt@LAB.LOCAL"
sudo kadmin.local -q "addprinc etu-nfs@LAB.LOCAL"

Dans le cas de l'utilisateur etu-nfs, il faut impérativement saisir le même mot de passe que celui utilisé lors de la création du compte. Cette double saisie est la conséquence de l'absence de gestion d'identité intégrée.

Q98.

Comment enregistrer les objets du serveur et du client NFS dans le fichier keytab ?

Consultez les pages de manuels de la commande kadmin.local.

C'est l'instruction ktadd qui permet l'enregistrement des objets.

Ajoutez les objets serveur et client NFS au keytab.

sudo kadmin.local -q "ktadd nfs/nfs-srvr@LAB.LOCAL"
sudo kadmin.local -q "ktadd nfs/nfs-clnt@LAB.LOCAL"

Affichez la liste des objets enregistrés.

sudo klist -k -t /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   2 20/09/2025 18:15:26 nfs/nfs-clnt@LAB.LOCAL
   2 20/09/2025 18:15:26 nfs/nfs-clnt@LAB.LOCAL
   2 20/09/2025 18:18:02 nfs/nfs-srvr@LAB.LOCAL
   2 20/09/2025 18:18:02 nfs/nfs-srvr@LAB.LOCAL

8.4. Installer et configurer le client Kerberos

Dans cette section, on doit configurer le client Kerberos pour accéder aux objets que l'on vient de créer sur le serveur KDC.

Q99.

Quels sont les paquets à installer sur le client Kerberos :?

Recherchez, dans la liste des paquets Kerberos dont le nom contient krb5, ceux qui sont relatifs aux utilisateurs et à l'authentification.

Affichez la liste des paquets relatifs à Kerberos.

apt search --names-only krb5

De cette longue liste on retient deux paquets : krb5-user et libpam-krb5.

Installez les paquets identifiés.

sudo apt install krb5-user libpam-krb5

Q100.

Quel doit être le contenu du fichier /etc/krb5.conf d'un client Kerberos ?

Recherchez les informations sur les bonnes pratiques de gestion des fichiers de configuration Kerberos.

Le serveur KDC et les clients doivent notamment s'accorder sur le domaine par défaut, les emplacements des KDC (noms de domaine complets et ports), les serveurs d'administration, etc. Toute incompatibilité peut entraîner des échecs d'authentification.

Il est donc conseillé de maintenir des fichiers /etc/krb5.conf identiques entre les KDC Kerberos et les clients, afin d'assurer une interopérabilité optimale.

Remplacez le contenu du fichier /etc/krb5.conf par celui appliqué sur le serveur dans la section précédente.

cat << EOF | sudo tee /etc/krb5.conf
[libdefaults]
        default_realm = LAB.LOCAL
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        rdns = true
        allow_weak_crypto = false
        default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
        default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
        permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96

[realms]
        LAB.LOCAL = {
                kdc = nfs-srvr.lab.local
                admin_server = nfs-srvr.lab.local
                default_domain = lab.local
        }

[domain_realm]
    .lab.local = LAB.LOCAL
    lab.local = LAB.LOCAL
EOF

Q101.

Comment tester la configuration Kerberos seule côté client ?

Utilisez l'identité du compte utilisateur dédié et recherchez la syntaxe de la commande kinit qui permet de lancer une requête de ticket Kerberos.

Commencez par prendre l'identité créée dans la base Kerberos.

su - etu-nfs
Password:
etu-nfs@clnt:~$

Lancez la demande de ticket

kinit etu-nfs@LAB.LOCAL
Password for etu-nfs@LAB.LOCAL:

Affichez la liste des tickets.

klist
Ticket cache: FILE:/tmp/krb5cc_1002_4zwha6
Default principal: etu-nfs@LAB.LOCAL

Valid starting       Expires              Service principal
28/09/2025 15:39:09  29/09/2025 01:39:09  krbtgt/LAB.LOCAL@LAB.LOCAL
        renew until 29/09/2025 15:39:06

Le résultat affiché par la commande klist montre qu'un ticket associé à l'identité etu-nfs a bien été obtenu et que celui-ci est présent dans le cache de cet utilisateur.

ls -l /tmp/krb5cc_1002_4zwha6
-rw------- 1 etu-nfs etu-nfs 960 28 sept. 15:39 /tmp/krb5cc_1002_4zwha6

Avec ce dernier test, la configuration kerberos est complète puisque les échanges de tickets entre le KDC et le client NFS sont fonctionnels.

8.5. Installer et configurer le service TLS sur le serveur et le client

Dans le cadre de ces travaux pratiques nous devons créer une autorité de certification et un jeu de certificats auto-signés afin de mettre en œuvre le protocole TLS entre le serveur et le client NFS.

Dans un contexte professionnel, l'utilisation d'une véritable autorité de certification (tiers de confiance) permet de produire des certificats correspondant à une cryptographie asymétrique valide.

[Important] Important

Dans les questions qui suivent, il faut être particulièrement vigilant sur l'exécution des traitements sur le serveur et/ou le client.

Q102.

Quels sont les paquets à installer sur le serveur et le client NFS pour la mies en œuvre de TLS ?

Recherchez les informations sur la configuration du service tlshd.

Lancez une recherche à l'aide du gestionnaire de paquets en combinant les clés tls et nfs.

apt search tls.*nfs
ktls-utils/testing,now 1.2.1-3+b1 amd64 [installé]
  TLS handshake support for NFS and other in-kernel TLS users

Installez le paquet ktls-utils sur le serveur et sur le client NFS.

sudo apt install ktls-utils

Q103.

Quel est le fichier de configuration associé au service tlshd fourni avec le paquet ktls-utils ?

Recherchez la chaîne conf dans la liste des fichiers du paquet ktls-utils.

Consultez les pages de manuels associées au fichier de configuration et proposez le contenu des fichiers de configuration du serveur et du client NFS.

Proposez un jeu de fichiers de configuration pour le client et le serveur NFS.

Lancez la recherche dans la liste des fichiers du paquet.

dpkg -L ktls-utils | grep conf
/etc/tlshd.conf
/usr/share/man/man5/tlshd.conf.5.gz

Consultez les pages de manuels du fichiers /etc/tlshd.conf et repérez les entrées des certificats X.509.

man tlshd.conf

Créez les fichiers de configuration du serveur et du client NFS.

  • Serveur NFS :

    cat << EOF | sudo tee /etc/tlshd.conf
    [authenticate.server]
    x509.certificate = /etc/ssl/certs/nfs-srvr.crt
    x509.private_key = /etc/ssl/private/nfs-srvr.key
    x509.truststore = /etc/ssl/certs/nfs-ca.crt
    EOF
  • Client NFS :

    cat << EOF | sudo tee /etc/tlshd.conf
    [authenticate.client]
    x509.certificate = /etc/ssl/certs/nfs-clnt.crt
    x509.private_key = /etc/ssl/private/nfs-clnt.key
    x509.truststore = /etc/ssl/certs/nfs-ca.crt
    EOF

Sur les systèmes Debian GNU/Linux, le répertoire /etc/ssl/certs/ contient les certificats publics utilisés pour l'authentification des services et la validation des connexions sécurisées. Le répertoire /etc/ssl/private/ stocke les clés privées associées, qui sont indispensables au chiffrement. Ce répertoire doit rester strictement protégé et accessible uniquement à l'administrateur système afin de garantir la sécurité.

Q104.

Comment répartir les certificats et les clés privées associées sur le serveur et le client NFS ?

Créez un tableau qui reprend le contenu des propositions des fichiers de configuration /etc/tlshd.conf.

Proposez un tableau respectant la règle selon laquelle Chaque extrémité de la session TLS détient sa propre clé privée, tandis que les certificats sont partagés.

Tableau 3. Certificats et des clés privées pour le service TLS

Répertoire Client Serveur
/etc/ssl/certs/ nfs-ca.crt
nfs-clnt.crt
nfs-srvr.crt
nfs-ca.crt
nfs-clnt.crt
nfs-srvr.crt
/etc/ssl/private/ nfs-clnt.key nfs-srvr.key

Q105.

Comment générer les certificats et les clés privées du serveur et du client NFS ?

Recherchez des exemples d'utilisation de la commande openssl qui permettent de générer une clé et un certificat de type CA, ainsi que le jeu de clés et de certificats pour le serveur et le client NFS.

Recherchez les propriétés de l'option -x509 de la commande openssl qui permet de générer directement un certificat auto-signé conforme au standard X.509 à partir d’une clé privée, sans passer par une demande de signature (CSR). Ce certificat peut ensuite être utilisé immédiatement comme certificat serveur ou client pour des usages TLS, ce qui simplifie le déploiement dans des environnements de test ou internes.

Codez un script qui rassemble tous les traitements et stocke les clés et les certificats dans un répertoire dédié.

Si le code du script qui suit est enregistré sur le serveur dans le fichier generate-nfs-certs.sh, on lance le traitement en tant qu'utilisateur normal.

bash generate-nfs-certs.sh
#!/usr/bin/env bash

set -euo pipefail

NFS_CA="nfs-ca"
NFS_SERVER="nfs-srvr"
NFS_CLIENT="nfs-clnt"
DOMAIN="lab.local"
CERT_DIR="${HOME}/certs"
CA_REQ_CONF="ca_req.conf"

mkdir -p "${CERT_DIR}"
chmod 700 "${CERT_DIR}"
cd "${CERT_DIR}"

gen_key() {
    local name="$1"
    local algo="$2"
    case "${algo}" in
    ed25519) openssl genpkey -algorithm ed25519 -out "${name}.key" ;;
    rsa) openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out "${name}.key" ;;
    *)
        echo "Unsupported algorithm: ${algo}" >&2
        exit 1
        ;;
    esac
}

issue_cert() {
    local ca_name="$1"
    local cert_name="$2"
    local usage="$3"
    local algo="$4"
    local ext

    gen_key "${cert_name}" "${algo}"
    openssl req -new -key "${cert_name}.key" -out "${cert_name}.csr" -subj "/CN=${cert_name}.${DOMAIN}"

    if [[ ${usage} == "server" ]]; then
        ext="extendedKeyUsage=serverAuth\nsubjectAltName=DNS:${cert_name}.${DOMAIN},DNS:${cert_name}"
    else
        ext="extendedKeyUsage=clientAuth"
    fi

    openssl x509 -req -in "${cert_name}.csr" -CA "${ca_name}.crt" -CAkey "${ca_name}.key" -CAcreateserial \
        -out "${cert_name}.crt" -days 730 -extensions v3 -extfile <(printf '%b\n' "[v3]" \
            "basicConstraints=CA:FALSE" "keyUsage=critical,digitalSignature" \
            "subjectKeyIdentifier=hash" "authorityKeyIdentifier=keyid,issuer" "${ext}")
}

gen_key "${NFS_CA}" rsa
cat >"${CA_REQ_CONF}" <<'EOF'
[req]
distinguished_name=req
[v3_ca]
basicConstraints=critical,CA:TRUE
keyUsage=critical,keyCertSign,cRLSign
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
EOF
openssl req -x509 -new -nodes -key "${NFS_CA}.key" -days 3650 -subj "/CN=NFS-CA" -out "${NFS_CA}.crt" \
    -extensions v3_ca -config "${CA_REQ_CONF}"

issue_cert "${NFS_CA}" "${NFS_SERVER}" server rsa
issue_cert "${NFS_CA}" "${NFS_CLIENT}" client rsa

rm -f -- ./*.csr ./*.srl "${CA_REQ_CONF}"

echo "Certificates and keys generated in ${CERT_DIR}"
echo "Transfer to the client: ${NFS_CA}.crt"
echo "  NFS: ${NFS_SERVER}.crt  ${NFS_CLIENT}.key  ${NFS_CLIENT}.crt"

exit 0

Q106.

Comment déposer ou transférer les certificats et les clés dans les répertoires précédemment choisis ?

À partir des répertoires cibles définis, il faut copier directement les fichiers sur le serveur, alors qu'il faut d'abord les transférer sur le client pour ensuite les copier.

Redémarrez le service tlshd.service sur le client et le serveur NFS une fois que les fichiers ont été déposés dans les répertoires système.

  • Copiez directement les fichiers sur le serveur NFS.

    sudo cp certs/nfs-srvr.key /etc/ssl/private/
    sudo cp certs/nfs-ca.crt \
      certs/nfs-clnt.crt \
      certs/nfs-srvr.crt \
      /etc/ssl/certs/
  • Créez le répertoire utilisateur de stockage des certificats et de la clé sur le client NFS à partir du serveur.

    ssh nfs-clnt 'mkdir "$HOME/certs" && chmod 700 "$HOME/certs"'

    Transférez les fichiers dans le répertoire utilisateur dédié du client NFS.

    scp certs/nfs-ca.crt \
      certs/nfs-clnt.crt \
      certs/nfs-srvr.crt \
      certs/nfs-clnt.key \
      nfs-clnt:~/certs/

    Copiez les fichiers dans les répertoires système du client NFS.

    ssh nfs-clnt << 'EOF'
    sudo cp "$HOME/certs/nfs-clnt.key" /etc/ssl/private/
    sudo cp "$HOME/certs/nfs-ca.crt" \
      "$HOME/certs/nfs-clnt.crt" \
      "$HOME/certs/nfs-srvr.crt" \
      /etc/ssl/certs/
    EOF

Redémarrez le service tlshd.service sur le serveur et le client NFS.

sudo systemctl restart tlshd.service

Vérifiez que le service est bien actif après redémarrage.

systemctl status tlshd.service
● tlshd.service - Handshake service for kernel TLS consumers
     Loaded: loaded (/usr/lib/systemd/system/tlshd.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-09-27 15:57:45 CEST; 1 day 19h ago
 Invocation: 8310411c0f7c4b5694e16326574252cc
       Docs: man:tlshd(8)
   Main PID: 381 (tlshd)
      Tasks: 1 (limit: 973)
     Memory: 5.1M (peak: 6.1M)
        CPU: 94ms
     CGroup: /system.slice/tlshd.service
             └─381 /usr/sbin/tlshd

sept. 27 15:57:45 srvr tlshd[381]: Built from ktls-utils 1.2.1 on Sep 24 2025 11:38:29
Notice: journal has been rotated since unit was started, output may be incomplete.

Une fois que les services Kerberos et TLS sont en place, on peut passer aux tests des transactions NFS sécurisées.