Ceci est une ancienne révision du document !
Samba AD DC - Partage NFSv4 avec authentification Kerberos
Le partage de données se fait communément avec le protocole SMB (Server Message Block). Ce protocole a l'avantage d'être supporté par l'ensemble des plate-formes (Windows, Apple, Linux, Unix).
Une alternative à celui-ci est NFS (Network File System) qui, historiquement, est le protocole de partage de données dans le monde Unix et plus tard Linux. Ces trois premières versions manquaient cruellement de sécurité. La quatrième version apporte des éléments de sécurité concrets dont :
- L'authentification des intervenants qui a pour but de vérifier l'identité de la personne ou de la machine avec qui l'on communique.
- La signature des communications qui a pour but de détecter si la communication a été modifiée entre son émission et sa réception.
- Le chiffrement des communications qui a pour but d'empêcher la compréhension de la communication si elle est interceptée.
Prérequis
- Avoir un contrôleur de domaine Samba AD (ou son équivalent Windows) →Se référer à Samba - Active Directory Domain Controller (AD DC)
- Avoir deux machines dans ce domaine →Se référer à Samba AD DC - Intégration de machines au domaine
- Avoir une connaissance de NFS →Se référer à NFS
Paramètres
Pour cette documentation, les paramètres suivants seront utilisés 1)
Nom de domaine | Royaume (realm) |
---|---|
example.com | EXAMPLE.COM |
Nom de machine | Adresse IP | Role |
---|---|---|
ubndc01 | 192.0.2.11 | Contrôleur de domaine |
ubnfs01 | 192.0.2.12 | Serveur de fichier |
ubnws01 | 192.0.2.13 | Machine client |
Le répertoire partagé sera le répertoire /media/example/home présent sur le serveur de fichier et contenant les répertoires home des utilisateurs du domaine. Ce répertoire sera monté sur chaque machine du domaine afin de permettre à chaque utilisateur d'accéder à son répertoire home depuis n'importe quelle machine du domaine.
Mécanisme d'authentification Kerberos
Ult.
Configuration du serveur de fichier
Installation du serveur NFS
L'installation de NFS se fait avec le paquet nfs-kernel-server
sudo apt-get install nfs-kernel-server
Définition des partages NFS
Avant de faire fonctionner NFS, il faut préparer le partage. NFSv4 base son partage sur une racine virtuelle définie. Bien qu'il soit possible d'utiliser des répertoires déjà existants, il est recommandé d'en créer un à la racine du système de fichier, par exemple /export. Ensuite pour chaque répertoire qui sera partagé, il faut créer un sous répertoire, par exemple /export/home. A ce stade, les données partagées le serait sur la partition Root ce qui n'est pas une bonne pratique. Afin de ne pas modifier le reste du serveur de fichier, il faut procéder à la jonction du répertoire /export/home avec le répertoire qui stockera réellement les données, /media/example/home.
En ligne de commande
sudo mount --bind /media/example/home /export/home
Ou en ajoutant une ligne dans le fichier /etc/fstab pour que l'opération soit effectuée à chaque redémarrage
- /etc/fstab
# Export NFS4 /media/example/home /export/home none bind 0 0
Cette structure de répertoires sous /export doit être considérée comme une structure virtuelle permettant le fonctionnement de NFS et non pas comme une structure pour le stockage de fichiers directement. Ainsi, l'impact en espace disque sur la partition Root est quasi nul.
La configuration des partages se fait au travers du fichier /etc/exports
- /etc/exports
/export 192.0.2.0/24(rw,sync,fsid=0,no_subtree_check,crossmnt,sec=krb5) /export/home 192.0.2.0/24(rw,sync,no_subtree_check,sec=krb5)
La première ligne avec l'option fsid=0 (ou fsid=root) défint la racine virtuelle du système de fichier partagé. Ainsi, tout les fichiers et répertoires sous /export sont accessibles par le partage NFS.
L'option sec=krb5 définit le niveau de sécurité exigé. Il en existe 3:
- krb5: Authentification Kerberos
- krb5i: Authentification Kerberos avec signature des communications (i pour integrity)
- krb5p: Authentification Kerberos avec chiffrement des communications (p pour privacy)
Lancement du service NFS
A ce stade, le démarrage du serveur NFS ne devrait pas encore fonctionner.
sudo service nfs-kernel-server start * Exporting directories for NFS kernel daemon... [ OK ] * Starting NFS kernel daemon [fail]
Afin de remédier au problème, il faut avant tout l'identifier correctement. Et pour ce faire, il faut accéder aux logs (fichiers d'historique d’événements).
- /var/log/syslog
Oct 6 18:13:26 ubnfs01 rpc.svcgssd[25763]: unable to obtain root (machine) credentials Oct 6 18:13:26 ubnfs01 rpc.svcgssd[25763]: do you have a keytab entry for nfs/<your.host>@<YOUR.REALM> in /etc/krb5.keytab?
Le service n'arrive pas à démarrer parce qu'il ne trouve pas son SPN (Service Principal Name) dans le fichier keytab par défaut (/etc/krb5.keytab) qui, par défaut, serait nfs/ubnfs01.example.com@EXAMPLE.COM. Plus clairement, le service ne trouve pas sa clé de chiffrement. Pour modifier le fichier keytab, il faut utiliser l'outil net avec les commandes ads keytab. Il faut également avoir les droits super-utilisateurs. Pour rappel, vu l'importance de ce fichier, les permissions sur celui-ci sont très restrictives root:root 600. Seul l'utilisateur root peut y accéder en lecture et écriture. Il faut également interagir avec le serveur Kerberos présent sur le DC. Pour cela, il y a deux possibilités s'authentifier avec un compte administrateur du domaine à chaque commande avec l'option -U Administrator ou sur base d'un ticket Kerberos avec l'option -k. Voici deux méthodes pour arriver au même résultat.
sudo net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM sudo net ads keytab flush -U Administrator Enter Administrator's password: sudo net ads keytab list Vno Type Principal sudo net ads keytab create -U Administrator Enter Administrator's password: sudo net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM sudo net ads keytab add nfs -U Administrator Enter Administrator's password: sudo net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM 6 des-cbc-crc nfs/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 nfs/ubnfs01@EXAMPLE.COM | sudo -i kinit Administrator Password for Administrator@EXAMPLE.COM: net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM net ads keytab flush -k net ads keytab list Vno Type Principal net ads keytab create -k net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM net ads keytab add nfs -k net ads keytab list Vno Type Principal 6 des-cbc-crc host/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 UBNFS01$@EXAMPLE.COM 6 des-cbc-crc nfs/ubnfs01.example.com@EXAMPLE.COM ... 6 arcfour-hmac-md5 nfs/ubnfs01@EXAMPLE.COM kdestroy exit |
La commande list liste les UPN et SPN présents dans le fichier keytab.
La commande flush vide le fichier keytab.
La commande create crée le fichier keytab par défaut avec l'UPN <Hostname$>@<Realm> et les SPN host/<Hostname>@<Realm> et host/<FQDN>@<Realm>.
La commande add <service> ajoute deux SPN au fichier keytab (un pour le hostname et un pour le fqdn). De plus, deux attributs 'servicePrincipalName' sont ajoutés à l'object Active Directory représentant l'ordinateur (ubnfs01) (<service>/<hostname> et <service>/<fqdn>). La commande flush supprimera également ces attributs supplémentaires.
Conseils
Le service nfs-kernel-server lorsqu'il démarre va lire le fichier de configuration /etc/default/nfs-kernel-server. Par défaut, il ne faut rien y changer. Cependant, si l'on veut augmenter la quantité d'informations envoyées dans le fichier log. On peut ajouter l'option très bavard au démon rpc.svcgssd (responsable de l'authentification de la machine vis-à-vis du serveur Kerberos)
- /etc/default/nfs-kernel-server
RPCSVCGSSDOPTS="-vvv"
De façon plus générale, la page de manuel du démon rpc.svcgssd propose d'autres options plus avancées.
Configuration de la machine cliente
Installation du client NFS
L'installation du client NFS se fait avec le paquet nfs-common
sudo apt-get install nfs-common
Montage du partage
Le partage se monte avec la commande mount et le type nfs4 qui va rediriger l'appel vers la commande spécifique mount.nfs4.
sudo mount -t nfs4 -o sec=krb5 ubnfs01.example.com:/home /mnt/home
L'option sec=krb5 précise que le montage se fera avec authentification Kerberos.
Erreurs et solutions
Pourquoi faire une documentation, si c'était aussi simple
DNS inversé
Dans le fichier log, on identifie vite le problème
- /var/log/syslog
Oct 6 22:09:42 ubnws01 rpc.gssd[3609]: ERROR: unable to resolve 192.0.2.12 to hostname: Name or service not known Oct 6 22:09:42 ubnws01 rpc.gssd[3609]: ERROR: failed to read service info
La cause est l'absence de résolution inverse sur le serveur DNS (également fournit par Samba AD DC). Pour y remédier, il faut ajouter la zone 2.0.192.in-addr.arpa et le pointeur ubnfs01.example.com pour l'adresse 12
samba-tool dns zonecreate ubndc01 2.0.192.in-addr.arpa Zone 2.0.192.in-addr.arpa created successfully samba-tool add ubndc01 2.0.192.in-addr.arpa 12 PTR ubnfs01.example.com Record added successfully
A cause du Bug 9404 de Samba 4, la zone fraîchement créée n'est pas automatiquement chargée par le serveur DNS interne de Samba. Il faut redémarre le service samba-ad-dc sur le contrôleur de domaine.
ssh ubndc01 ... sudo service samba-ad-dc restart samba-ad-dc stop/waiting samba-ad-dc start/running, process 11129 exit
En résumé
Sur le serveur de fichier
Installation du paquets NFS server
sudo apt-get install nfs-kernel-server
Création de la structure de répertoire pour NFS
sudo mkdir -p /export/home
Jonction du répertoire réel avec la structure NFS
- /etc/fstab
# Export NFS4 /media/example/home /export/home none bind 0 0
sudo mount /export/home
Ajout du SPN dans le keytab
sudo net ads keytab add nfs -U Administrator
Lancement du service
sudo service nfs-kernel-server start
Références
Contributeur principal : Qedinux