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.

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.

Ult.

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)
Bien qu'encore utilisée, les notations gss/krb5, gss/krb5i et gss/krb5p sont dépréciées. Il est recommandé d'utiliser l'option sec=

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.

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

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

Contributeur principal : Qedinux


1)
Conformément aux RFC 2606 (Reserved Top Level DNS Names) et RFC 5737 (IPv4 Address Blocks Reserved for Documentation)
  • utilisateurs/qedinux/samba_ad_dc_nfs4_kerberized.1444164088.txt.gz
  • Dernière modification: Le 06/10/2015, 22:41
  • par Qedinux