Intégrer Samba et ZFS avec VirtioFS : Surmonter les défis des ACL et XATTR
Le déploiement d'un serveur de fichiers SMB haute performance avec stockage ZFS dans un environnement virtualisé KVM utilisant VirtioFS pose des défis uniques, notamment en ce qui concerne la gestion correcte des listes de contrôle d'accès (ACL) et des attributs étendus (xattr) pour assurer la compatibilité avec les clients Windows. Cet article détaille le processus de configuration et la manière de surmonter les principaux obstacles, garantissant une fonctionnalité complète et un fonctionnement stable du partage de fichiers.
Choisir VirtioFS pour la virtualisation du stockage
Lors de la création d'un système de stockage en réseau (NAS) basé sur ZFS et de la configuration de dossiers partagés via Samba, une méthode efficace pour connecter le pool ZFS à la machine virtuelle (VM) est nécessaire. Initialement, diverses approches ont été envisagées, y compris NFS, mais le passage direct de répertoires offert par l'hyperviseur KVM a suscité une attention particulière. Parmi les options disponibles, telles que virtio-9p et VirtioFS, cette dernière a été choisie.
virtio-9p a été écarté en raison de son instabilité, de son support POSIX limité et de ses performances médiocres, le rendant inadapté aux tâches critiques de serveur de fichiers. VirtioFS, en revanche, a montré un potentiel nettement supérieur grâce à son architecture, qui permet aux machines virtuelles d'accéder directement au système de fichiers de l'hôte avec des performances élevées.
Cependant, malgré ses avantages évidents, VirtioFS avait ses particularités. Les paramètres standard de virt-manager n'offraient pas d'options pour activer le support des attributs étendus (xattr) et des listes de contrôle d'accès (ACL), cruciaux pour le bon fonctionnement de Samba avec les clients Windows. Les attributs étendus permettent de stocker des informations supplémentaires sur les fichiers, tandis que les ACL définissent des droits d'accès détaillés pour les utilisateurs et les groupes, formant la base des permissions NTFS sous Windows. Sans ces fonctionnalités, une intégration complète de Samba et ZFS serait impossible.
Configurer VirtioFS pour le support des ACL et XATTR
Le principal défi était de s'assurer que le démon virtiofsd, exécuté sur l'hôte, démarrait avec les paramètres nécessaires --xattr et --posix-acl. L'édition directe de la configuration XML de la VM via libvirt ou Qemu s'est avérée inefficace, car il n'était pas possible de transmettre correctement tous les paramètres requis pour le démarrage de virtiofsd.
La solution a été d'utiliser un wrapper – un script simple qui lance virtiofsd avec les drapeaux souhaités. Cette approche a contourné les limitations de libvirt et a garanti l'activation du support complet des ACL et xattr pour le répertoire passé en direct. Le processus de création et d'application du wrapper implique les étapes suivantes :
- *Création du script wrapper*** :
Créez un fichier /usr/libexec/virtiofsdfix avec le contenu suivant :
```bash
#!/bin/bash
exec /usr/libexec/virtiofsd "$@" --xattr --posix-acl --sandbox none
```
Le paramètre --sandbox none a été ajouté lors des expérimentations et vise à désactiver l'isolation, ce qui peut être important dans certains cas.
- Définition des permissions :
Accordez les permissions d'exécution au script et copiez les contextes de sécurité du démon virtiofsd original :
```bash
sudo chmod +x /usr/libexec/virtiofsdfix
sudo chcon --reference=/usr/libexec/virtiofsd /usr/libexec/virtiofsdfix
```
- Modification de la configuration de la VM :
Dans la configuration XML de la machine virtuelle (via virt-manager ou virsh edit), spécifiez le chemin vers le script wrapper créé comme module VirtioFS principal.
Après ces étapes, VirtioFS transmettra correctement le système de fichiers de l'hôte à la machine virtuelle avec le support actif des xattr et des ACL POSIX. Cela constitue la base fondamentale pour une intégration ultérieure avec ZFS et Samba.
Configuration ZFS pour un fonctionnement correct des ACL
Même avec VirtioFS correctement configuré pour transmettre les attributs étendus et les ACL POSIX, le système de fichiers ZFS nécessite une configuration spécifique pour un support complet de ces fonctionnalités. Pour permettre à un dataset ZFS de gérer correctement les ACL similaires à celles utilisées sous Windows (ACL NTFS), plusieurs propriétés clés doivent être définies :
zfs set acltype=posixacl pool/smbfs:
Cette propriété active le support des ACL POSIX Linux standard pour le dataset spécifié. Elle permet aux commandes comme getfacl et setfacl de fonctionner correctement, ce qui est une condition préalable pour Samba.
zfs set aclinherit=passthrough pool/smbfs:
Cette propriété définit le comportement d'héritage des ACL. La valeur passthrough garantit que lorsque de nouveaux fichiers ou répertoires sont créés au sein du dataset, ils héritent automatiquement des droits d'accès du répertoire parent. Ceci est essentiel pour maintenir des permissions cohérentes au sein de la structure des fichiers, en particulier dans le contexte des partages Windows.
zfs set aclmode=passthrough pool/smbfs:
Cette propriété définit le mode de non-interférence de ZFS pour les ACL. En mode passthrough, ZFS n'essaie pas d'interpréter ou de modifier les ACL mais les transmet simplement telles quelles. Cela garantit une compatibilité maximale avec les systèmes externes, tels que Samba, qui gèrent leurs propres ACL.
Après avoir configuré ZFS et VirtioFS, la seule étape restante est de monter le répertoire passé en direct à l'intérieur de la VM invitée. Cela peut être fait en ajoutant la ligne appropriée à /etc/fstab :
fs /fs virtiofs rw,noatime,_netdev,nofail
Après l'exécution de mount -a, le répertoire ZFS sera accessible dans la VM à /fs, prêt à être utilisé par Samba.
Problèmes de Samba avec acl_xattr et security.NTACL
Avec la configuration de base de VirtioFS et ZFS, l'étape suivante est la configuration de Samba. Une configuration typique pour un répertoire local, incluant vfs objects = acl_xattr, fonctionne parfaitement, permettant à Samba d'écrire des attributs étendus, y compris ceux utilisés pour les ACL Windows. Cependant, en tentant d'appliquer cette configuration à un répertoire passé en direct via VirtioFS, un problème survient : Samba refuse d'écrire les attributs XATTR, spécifiquement security.NTACL.
Le problème se manifeste par le fait que les commandes setfacl standard pour les ACL POSIX fonctionnent correctement à la fois sur le disque local et sur VirtioFS, mais l'écriture d'attributs spécifiques à Samba comme security.NTACL échoue. Cela empêche une fonctionnalité complète avec les permissions Windows, car Samba ne peut pas enregistrer les informations nécessaires du descripteur de sécurité. Même la désactivation de SELinux sur l'hôte n'a pas donné le résultat escompté.
Des tests menés avec setfattr pour simuler l'écriture d'attributs Samba ont révélé un problème clé. Lors de la tentative d'écriture de l'attribut security.NTACL en tant qu'utilisateur de domaine, l'opération a échoué à la fois pour un fichier local et pour un fichier sur VirtioFS. Cependant, lors de la même opération en tant que superutilisateur (root), l'écriture de security.NTACL sur un disque local a réussi, tandis que sur VirtioFS, elle a toujours échoué.
Cela indique une différence fondamentale dans la manière dont les attributs étendus sont gérés :
security.NTACL: Cet attribut réside dans l'espace de nomssecurityet est utilisé par Samba pour stocker les permissions Windows (ACL NTFS). L'écriture dans cet espace de noms est strictement restreinte et nécessite les privilègesCAP_SYS_ADMIN, équivalents aux droitsroot. Les utilisateurs réguliers, même les propriétaires de fichiers, ne peuvent pas modifier ou supprimer directement cet attribut.user.NTACL: Cet attribut réside dans l'espace de nomsuser. Tout utilisateur ayant des permissions d'écriture sur le fichier peut modifier les attributs dans cet espace de noms.
La raison principale de l'échec avec VirtioFS est que même avec le paramètre --sandbox none et une tentative d'écriture en tant que root (via sudo), VirtioFS, au niveau du noyau ou de sa propre implémentation, bloque apparemment l'écriture dans l'espace de noms security.NTACL. Cela empêche le bon enregistrement des permissions Windows de Samba.
Solution : Redirection de security.NTACL vers user.NTACL et intégration des instantanés ZFS
Puisque Samba ne peut pas écrire correctement les attributs dans l'espace de noms security.NTACL via VirtioFS, la seule solution viable est de rediriger ces attributs vers l'espace de noms utilisateur user.NTACL. Bien qu'il s'agisse d'une solution de contournement plutôt que d'une solution complète au problème fondamental de VirtioFS, elle permet à Samba de stocker toutes les informations de permission Windows nécessaires. Il est important de noter que cette approche est acceptable lorsque les utilisateurs interagissent avec le serveur exclusivement via SMB et n'ont pas d'accès direct au système de fichiers de l'hôte ou de la VM invitée.
Pour implémenter cette solution, les paramètres suivants doivent être ajoutés au fichier de configuration Samba (smb.conf) :
[VirtioFS]
path = /fs
writable = yes
admin users = "domain\admin-domain" "superadmin"
vfs objects = acl_xattr shadow_copy2
# user.NTACL
acl_xattr:security_acl_name = user.NTACL
acl_xattr:ignore system acls = yes
shadow:basedir = /fs
shadow:snapdir = .zfs/snapshot
shadow:format = GMT-%Y.%m.%d_%H.%M.%S
shadow:sort = desc
shadow:localtime = yes
Ici, les lignes clés sont :
acl_xattr:security_acl_name = user.NTACL: Indique à Samba d'utiliseruser.NTACLau lieu desecurity.NTACLpour stocker les descripteurs de sécurité.acl_xattr:ignore system acls = yes: Ce paramètre indique à Samba d'ignorer les ACL système, en s'appuyant sur ses propres mécanismes de stockage des permissions.
Intégration des instantanés ZFS avec Samba
Pour offrir la fonctionnalité de copies d'ombre (Shadow Copies) aux clients Windows, permettant aux utilisateurs de restaurer des versions précédentes de fichiers, le module shadow_copy2 est utilisé. Il s'intègre aux capacités d'instantanés de ZFS. Dans la configuration fournie :
vfs objects = acl_xattr shadow_copy2: Active le moduleshadow_copy2.shadow:basedir = /fs: Spécifie le répertoire de base pour les copies d'ombre.shadow:snapdir = .zfs/snapshot: Définit le sous-répertoire où ZFS stocke ses instantanés. Pour un fonctionnement correct, le pool ZFS doit avoir la propriétélistsnapshots=ondéfinie (par exemple,zpool set listsnapshots=on nom_du_pool), ce qui permet à Samba de découvrir et d'afficher les instantanés disponibles.shadow:format,shadow:sort,shadow:localtime: Configurent le format d'affichage et le tri des instantanés.
Ainsi, cette configuration permet la création d'un serveur de fichiers Samba entièrement fonctionnel sur ZFS via VirtioFS, garantissant un fonctionnement correct avec les ACL Windows et les copies d'ombre, malgré les difficultés initiales avec security.NTACL.
Points clés à retenir
- VirtioFS et ACL/xattr : Pour une fonctionnalité Samba complète avec les ACL Windows via VirtioFS, le démon
virtiofsddoit être lancé avec les paramètres--xattret--posix-acl, nécessitant souvent un script wrapper. - Configuration ZFS : Les datasets ZFS utilisés pour le partage Samba doivent être configurés avec les propriétés
acltype=posixacl,aclinherit=passthroughetaclmode=passthroughpour une gestion correcte des ACL. - Problème
security.NTACL: Samba tente par défaut d'écrire les descripteurs de sécurité Windows danssecurity.NTACL, ce qui nécessite des privilègesrootet peut être bloqué par VirtioFS. - Solution via
user.NTACL: Une solution de contournement efficace consiste à rediriger Samba pour qu'il utiliseuser.NTACLpour stocker les attributs de sécurité via le paramètreacl_xattr:security_acl_name = user.NTACL. - Instantanés ZFS et Samba : L'intégration des instantanés ZFS pour les copies d'ombre Windows est réalisée via le module
shadow_copy2de Samba, nécessitant une configuration appropriée des propriétés du pool ZFS.
— Editorial Team
Aucun commentaire pour le moment.