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-server

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

systemctl status nfs-server

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-server.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.

Installez les paquets suivants :

sudo apt install krb5-kdc krb5-admin-server krb5-user

Lors de l'installation de ces paquets, une série de questions apparaît. Voici ce qu'il faut saisir pour rester conforme au contexte de ces manipulations.

  • Default Kerberos version 5 realm : LAB.LOCAL

  • Kerberos servers for your realm : nfs-server.lab.local

  • Administrative server for your Kerberos realm : nfs-server.lab.local

Q93.

Comment créer et définir le mot de passe d'administration du nouveau royaume Kerberos ?

Lancez une recherche dans les pages de manuels.

recherchez les options de la commande openssl qui permettent de générer un mot de passe suffisamment solide.

Lancez une recherche par mot clé dans les pages de manuels.

man -k kerberos | grep realm
krb5_newrealm (8)    - Create a new Kerberos Realm
man krb5_newrealm

Générez le mot de passe de l'administrateur Kerberos.

openssl rand -base64 8 > krb-admin.password
chmod 600 krb-admin.password
cat krb-admin.password

Copiez le mot de passe et Lancez la commande krb5_newrealm

sudo sudo krb5_newrealm
This script should be run on the master KDC/admin server to initialize
a Kerberos realm.  It will ask you to type in a master key password.
This password will be used to generate a key that is stored in
/etc/krb5kdc/stash.  You should try to remember this password, but it
is much more important that it be a strong password than that it be
remembered.  However, if you lose the password and /etc/krb5kdc/stash,
you cannot decrypt your Kerberos database.
Initializing database '/var/lib/krb5kdc/principal' for realm 'LAB.LOCAL',
master key name 'K/M@LAB.LOCAL'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: Collez le mot de passe
Re-enter KDC database master key to verify: Collez le mot de passe à nouveau
Now that your realm is set up you may wish to create an administrative
principal using the addprinc subcommand of the kadmin.local program.
Then, this principal can be added to /etc/krb5kdc/kadm5.acl so that
you can use the kadmin program on other computers.  Kerberos admin
principals usually belong to a single user and end in /admin.  For
example, if jruser is a Kerberos administrator, then in addition to
the normal jruser principal, a jruser/admin principal should be
created.

Don't forget to set up DNS information so your clients can find your
KDC and admin servers.  Doing so is documented in the administration
guide.

Redémarrez le service Kerberos.

sudo systemctl restart krb5-kdc

Vérifiez l'état du service.

systemctl status krb5-kdc

Q94.

Comment créer le fichier de configuration utilisé par les outils Kerberos ?

Consultez le fichier /etc/krb5.conf installé avec les paquets Kerberos et adaptez le au contexte de ces travaux pratiques en précisant les choix effectués.

Recherchez des informations sur les jeux d'algorithmes de cryptographie recommandés pour NFSv4.2

Remplacez le modèle de fichier /etc/krb5.conf par votre propre fichier.

cat << EOF | sudo tee /etc/krb5.conf
[libdefaults]
        default_realm = LAB.LOCAL
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        rdns = false
        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-server.lab.local
                admin_server = nfs-server.lab.local
                default_domain = lab.local
        }

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

Expliquez le choix des différents paramètres.

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 = false : désactive 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-server.lab.local : désigne le serveur qui distribue les tickets Kerberos (KDC).

  • admin_server = nfs-server.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.

Q95.

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.

Q96.

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.

Q97.

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

Recherchez les informations sur le principal admin/admin.

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

Q98.

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-server@LAB.LOCAL

  • Client : nfs/nfs-client@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-server@LAB.LOCAL"
sudo kadmin.local -q "addprinc -randkey nfs/nfs-client@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.

Q99.

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-server@LAB.LOCAL"
sudo kadmin.local -q "ktadd nfs/nfs-client@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-client@LAB.LOCAL
   2 20/09/2025 18:15:26 nfs/nfs-client@LAB.LOCAL
   2 20/09/2025 18:18:02 nfs/nfs-server@LAB.LOCAL
   2 20/09/2025 18:18:02 nfs/nfs-server@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.

Q100.

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

Q101.

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 = false
        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-server.lab.local
                admin_server = nfs-server.lab.local
                default_domain = lab.local
        }

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

Q102.

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.

Q103.

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

Q104.

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-server.crt
    x509.private_key = /etc/ssl/private/nfs-server.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-client.crt
    x509.private_key = /etc/ssl/private/nfs-client.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é.

Q105.

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-client.crt
nfs-server.crt
nfs-ca.crt
nfs-client.crt
nfs-server.crt
/etc/ssl/private/ nfs-client.key nfs-server.key

Q106.

Comment générer les certificats et la 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 toutes 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
#!/bin/bash
set -e

NFS_CA=nfs-ca
NFS_SERVER=nfs-server
NFS_CLIENT=nfs-client
CERT_DIR="$HOME/certs"

# 1. Créer le dossier des certificats si nécessaire
mkdir -p "${CERT_DIR}"
chmod 700 "${CERT_DIR}"
cd "${CERT_DIR}"

# 2. Créer les fichiers de configuration OpenSSL pour les extensions
cat > ca_extensions.conf << EOF
[v3_ca]
basicConstraints = critical,CA:TRUE
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
EOF

cat > server_extensions.conf << EOF
[v3_server]
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = critical,digitalSignature,keyEncipherment
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
EOF

cat > client_extensions.conf << EOF
[v3_client]
basicConstraints = CA:FALSE
extendedKeyUsage = clientAuth
keyUsage = critical,digitalSignature,keyEncipherment
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
EOF

# 3. Générer la clé privée de la CA (RSA 4096)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ${NFS_CA}.key

# 4. Générer le certificat auto-signé de la CA avec extensions X.509
openssl req -x509 -new -nodes -key ${NFS_CA}.key \
    -sha256 -days 3650 -subj "/CN=NFS-CA" \
    -out ${NFS_CA}.crt \
    -extensions v3_ca \
    -config <(cat ca_extensions.conf; echo "[req]"; echo "distinguished_name=req")

# 5. Générer la clé privée et CSR du serveur
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ${NFS_SERVER}.key
openssl req -new -key ${NFS_SERVER}.key -out ${NFS_SERVER}.csr -subj "/CN=${NFS_SERVER}.lab.local"

# 6. Signer le certificat serveur via la CA avec extensions TLS serveur
openssl x509 -req -in ${NFS_SERVER}.csr -CA ${NFS_CA}.crt -CAkey ${NFS_CA}.key -CAcreateserial \
    -out ${NFS_SERVER}.crt -days 730 -sha256 \
    -extfile server_extensions.conf -extensions v3_server

# 7. Générer la clé privée et CSR du client
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ${NFS_CLIENT}.key
openssl req -new -key ${NFS_CLIENT}.key -out ${NFS_CLIENT}.csr -subj "/CN=${NFS_CLIENT}.lab.local"

# 8. Signer le certificat client via la CA avec extensions TLS client
openssl x509 -req -in ${NFS_CLIENT}.csr -CA ${NFS_CA}.crt -CAkey ${NFS_CA}.key -CAcreateserial \
    -out ${NFS_CLIENT}.crt -days 730 -sha256 \
    -extfile client_extensions.conf -extensions v3_client

echo "Certificats et clés générés dans ${CERT_DIR}"
echo "Transférez ${NFS_CA}.crt, ${NFS_CLIENT}.key, ${NFS_CLIENT}.crt vers le client."

# 9. Effacer les fichiers de configuration temporaires
rm -f *_extensions.conf

exit 0

Q107.

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-server.key /etc/ssl/private/
    sudo cp certs/nfs-ca.crt \
      certs/nfs-client.crt \
      certs/nfs-server.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-client '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-client.crt \
      certs/nfs-server.crt \
      certs/nfs-client.key \
      nfs-client:~/certs/

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

    ssh nfs-client << 'EOF'
    sudo cp "$HOME/certs/nfs-client.key" /etc/ssl/private/
    sudo cp "$HOME/certs/nfs-ca.crt" \
      "$HOME/certs/nfs-client.crt" \
      "$HOME/certs/nfs-server.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.