NFS kerberized - le gardien de vos données
Contexte
La protection des données d'une entreprise est un enjeu primordial dans un système d'information pour bâtir une relation de confiance avec leurs clients. Suite à la refonte d'une infrastructure client, nous devions trouver un protocole de transfert de fichier principalement utilisé sous Linux ainsi qu'un mécanisme d'authentification. Notre objectif était de trouver la solution la plus sécurisée et par conséquent appliquer les droits les plus restrictifs sur les partages. Pour répondre à cette objectif, nous avons choisis un protocole de transfert de fichier ainsi qu'un mécanisme d'authentification qui sont respectivement NFS et Kerberos.
Le protocole NFS
NFS (Network File System) est un protocole de transfert de fichier qui permet d’accéder à des partages réseaux distants. Dans ses premières versions, le protocole proposait une sécurisation élémentaire des exports (partages) qui se basait sur l'adresse réseau d'un ordinateur (client).
Prenons un exemple: si nous paramétrons un export (partage) avec l'adresse de sous-réseau 172.30.150.0/24, tous les clients ayant une adresse dans cette plage (par exemple 172.30.150.165) pourront accéder aux données présentes dans l'export. Ainsi il est impossible d'authentifier l'utilisateur mais seulement l'ordinateur grâce à son IP. Notre objectif n'est alors pas respecté.
Pour correspondre aux dernières normes d'Internet, NFS sera totalement réformé et deviendra NFS version 4. Cette rupture totale avec la version 3 entraînera une rétro compatibilité impossible. Dans cet article, nous allons nous concentrer sur une nouvelle fonctionnalité de NFS: la sécurisation avec Kerberos.
Le protocole Kerberos
Kerberos est un protocole d'authentification réseau se basant sur un chiffrement symétrique et l'utilisation de tickets. Lors de l'ouverture d'une session, le client Kerberos va contacter le serveur d'authentification en fournissant un couple login/mot de passe.
Une fois ces informations vérifiées, le centre distributeur de clés va transmettre un ticket à l'utilisateur. L'utilisateur utilisera son ticket pour accéder aux autres services nécessitant une authentification Kerberos.
Dans le cas de notre serveur NFS, il fallait identifier à la fois un service (NFS) et une machine (le serveur).
Pour cela nous avons utilisé un SPN (Service Principal Name) qui se présente sous la forme:
type_de_service/hostname_ou_FQDN #Exemple nfs/servernfs@LABO.YAEL-TRAMIER.COM
Construction du labo
Le serveur d'authentification
Nous avons utilisé un contrôleur de domaine Samba qui aura ici un rôle de:
- centre distributeur de clés
- service d'authentification
Nous utilisons un schéma LDAP avec la norme RFC2307 qui permet l'utilisation des uid et gid UNIX.
Pour tester notre KDC (centre distributeur de clés), nous ajoutons un poste Debian dans le domaine avec SSSD. SSSD fournit un ensemble de démons pour gérer l'accès aux répertoires distants, les mécanismes d'authentification tels que LDAP, Kerberos etc…
Dans un second temps nous demandons un ticket manuellement, pour ça:
$ kinit yael $ Password for yael@LABO.YAEL-TRAMIER.COM:
Nous retrouvons bien ici la phase d'authentification avec le couple login/mot de passe.
Pour vérifier la bonne réception du ticket, il suffit d’exécuter la commande klist pour l'afficher.
$ klist Ticket cache: FILE:/tmp/krb5cc_10006 Default principal: yael@LABO.YAEL-TRAMIER.COM Valid starting Expires Service principal 02/21/2022 11:41:01 02/21/2022 21:41:01 krbtgt/LABO.YAEL-TRAMIER.COM@LABO.YAEL-TRAMIER.COM renew until 02/22/2022 11:40:55
A cette étape-là, nous confirmons le fonctionnement du KDC.
Maintenant passons à la configuration du serveur NFS.
Le serveur NFS
La première étape sera d'ajouter aussi le serveur dans le domaine avec SSSD et d'ajouter un SPN pour le service NFS.
$ net ads keytab add_update_ads nfs/$(hostname -f) -U Administrator
Dans un second temps, il faut installer le package du serveur NFS nfs-kernel-server.
Maintenant passons à sa configuration !
Un export NFS se présente sous cette forme:
<dossier partagé> <hôte>(<options>) <hôte2>(<options>)...
Ainsi nous avons:
- dossier partagé: chemin vers le dossier partagé
- hôte: qui peut se présenter sous différentes formes:
- un domaine: *.labo.yael-tramier.com
- un sous-réseau: 172.30.140.0/24
- etc…
- options:
- rw : le système de fichiers est exporté en lecture/écriture
- sec: la sécurité qui va être mise en place. Dans notre cas avec Kerberos nous avons plusieurs options:
- sec=krb5: utilise l'authentification Kerberos à la place des uid,gid locaux
- sec=krb5i: vérifie en plus l'intégrité des échanges NFS à l'aide d'un checksum
- sec=krb5p: en plus de l'intégrité, les données vont être chiffrées.
Ainsi nous allons ajouter notre export !
#Créations du dossier qui sera partagé $ mkdir -p /EXPORTS/nfs #Ajout de l'export $ echo "EXPORTS/nfs 172.30.140.0/24(rw,sec=krb5p)" >> /etc/exports #Partage du nouvel export $ exportfs -a
Pour vérifier la bonne prise en compte de notre configuration, sur le client nous pouvons voir les exports disponibles avec:
$ showmount -e servernfs Export list for servernfs: /EXPORTS/nfs 172.30.140.0/24
Le client NFS
A cette étape-là, notre client NFS est dans le même domaine que le serveur et l'utilisateur est authentifié grâce à son ticket Kerberos.
Pour utiliser Kerberos avec NFS, nous activons le service rpc-gssd. Ce service permet l'utilisation de l'API gss-api afin de sécuriser tous les protocoles basés sur rpc (dans notre cas NFS).
service rpc-gssd start
Une fois ce service activé, il suffit de monter le volume en précisant le sécurité que l'on veut utiliser.
mount -t nfs4 servernfs:/EXPORTS/nfs /mnt/nfs -o sec=krb5p
Définir des ACLs
Maintenant que nous pouvons monter notre partage grâce au ticket Kerberos, nous pouvons créer des ACLs (access control list) qui permettent de définir des permissions différentes sur un fichier/répertoire pour un ou plusieurs utilisateurs/groupes. Grâce au ticket, le serveur NFS va pouvoir reconnaître l'utilisateur et appliquer les permissions en fonction.
Un exemple de permissions:
#Permission lecture/écriture/execution setfacl -m g:'nfswrite':rwx EXPORTS/nfs/admin setfacl -m g:'domain users':rwx EXPORTS/nfs/partage
Conclusion
Pour conclure, le mariage entre NFSv4 et Kerberos nous permet d'accéder à des ressources en réseaux tout en authentifiant l'utilisateur de la machine.
Ainsi nous pouvons construire des ACLs en se basant sur un/des groupe(s) ou un/des utilisateur(s). Nos données sont alors bien gardées et même chiffrées !