Integración Avanzada de Samba y ZFS con VirtioFS: Solución a Retos de ACL y XATTR
La implementación de un servidor de archivos SMB de alto rendimiento con almacenamiento ZFS en un entorno virtualizado KVM utilizando VirtioFS presenta desafíos únicos, especialmente en lo que respecta al manejo correcto de las Listas de Control de Acceso (ACLs) y los atributos extendidos (xattr) para asegurar la compatibilidad con clientes Windows. Este artículo detalla el proceso de configuración y cómo superar los obstáculos clave, garantizando la plena funcionalidad y una operación estable del recurso compartido de archivos.
Elección de VirtioFS para la Virtualización de Almacenamiento
Al crear un Almacenamiento Conectado a la Red (NAS) basado en ZFS y luego configurar carpetas compartidas a través de Samba, se requiere un método eficiente para conectar el pool de ZFS a la máquina virtual (VM). Inicialmente, se consideraron varios enfoques, incluido NFS, pero el paso directo de directorios ofrecido por el hipervisor KVM captó una atención particular. Entre las opciones disponibles, como virtio-9p y VirtioFS, se eligió esta última.
virtio-9p fue descartado debido a su inestabilidad, soporte POSIX limitado y bajo rendimiento, lo que lo hacía inadecuado para tareas críticas de servidor de archivos. VirtioFS, en contraste, mostró un potencial significativamente mayor gracias a su arquitectura, que permite a las máquinas virtuales acceder directamente al sistema de archivos del host con un alto rendimiento.
Sin embargo, a pesar de sus claras ventajas, VirtioFS tenía sus particularidades. La configuración estándar de virt-manager no proporcionaba opciones para habilitar el soporte de atributos extendidos (xattr) y Listas de Control de Acceso (ACLs), que son cruciales para que Samba funcione correctamente con clientes Windows. Los atributos extendidos permiten almacenar información adicional del archivo, mientras que las ACLs definen derechos de acceso detallados para usuarios y grupos, formando la base de los permisos NTFS en Windows. Sin estas características, la integración completa de Samba y ZFS sería imposible.
Configuración de VirtioFS para Soporte de ACL y XATTR
El principal desafío era asegurar que el demonio virtiofsd, ejecutándose en el host, se iniciara con los parámetros necesarios --xattr y --posix-acl. La edición directa de la configuración XML de la VM a través de libvirt o Qemu resultó ineficaz, ya que no era posible pasar correctamente todos los parámetros requeridos para el inicio de virtiofsd.
La solución fue utilizar un envoltorio (wrapper) – un script sencillo que lanza virtiofsd con las banderas deseadas. Este enfoque eludió las limitaciones de libvirt y garantizó la activación del soporte completo de ACL y xattr para el directorio pasado. El proceso de creación y aplicación del envoltorio implica los siguientes pasos:
- Creación del Script Envoltorio:
Cree un archivo /usr/libexec/virtiofsdfix con el siguiente contenido:
```bash
#!/bin/bash
exec /usr/libexec/virtiofsd "$@" --xattr --posix-acl --sandbox none
```
El parámetro --sandbox none se añadió durante la experimentación y tiene como objetivo deshabilitar el aislamiento, lo que puede ser importante en algunos casos.
- Establecimiento de Permisos:
Otorgue permisos de ejecución al script y copie los contextos de seguridad del demonio virtiofsd original:
```bash
sudo chmod +x /usr/libexec/virtiofsdfix
sudo chcon --reference=/usr/libexec/virtiofsd /usr/libexec/virtiofsdfix
```
- Modificación de la Configuración de la VM:
En la configuración XML de la máquina virtual (a través de virt-manager o virsh edit), especifique la ruta al script envoltorio creado como el módulo principal de VirtioFS.
Después de estos pasos, VirtioFS pasará correctamente el sistema de archivos del host a la máquina virtual con soporte activo para xattr y ACL POSIX. Esto forma la base fundamental para una mayor integración con ZFS y Samba.
Configuración de ZFS para el Correcto Funcionamiento de ACL
Incluso con VirtioFS correctamente configurado para pasar atributos extendidos y ACL POSIX, el sistema de archivos ZFS requiere una configuración específica para el soporte completo de estas características. Para permitir que un conjunto de datos ZFS maneje correctamente las ACLs similares a las utilizadas en Windows (ACLs NTFS), se deben establecer varias propiedades clave:
zfs set acltype=posixacl pool/smbfs:
Esta propiedad habilita el soporte para las ACLs POSIX estándar de Linux para el conjunto de datos especificado. Permite que comandos como getfacl y setfacl funcionen correctamente, lo cual es un requisito previo para Samba.
zfs set aclinherit=passthrough pool/smbfs:
Esta propiedad define el comportamiento de herencia de ACL. El valor passthrough asegura que cuando se crean nuevos archivos o directorios dentro del conjunto de datos, estos hereden automáticamente los derechos de acceso del directorio padre. Esto es crítico para mantener permisos consistentes dentro de la estructura de archivos, especialmente en el contexto de recursos compartidos de Windows.
zfs set aclmode=passthrough pool/smbfs:
Esta propiedad establece el modo de no interferencia de ZFS para las ACLs. En modo passthrough, ZFS no intenta interpretar o modificar las ACLs, sino que simplemente las pasa tal cual. Esto asegura la máxima compatibilidad con sistemas externos, como Samba, que gestionan sus propias ACLs.
Después de configurar ZFS y VirtioFS, el único paso restante es montar el directorio pasado dentro de la VM invitada. Esto se puede hacer añadiendo la línea apropiada a /etc/fstab:
fs /fs virtiofs rw,noatime,_netdev,nofail
Después de ejecutar mount -a, el directorio ZFS será accesible en la VM en /fs, listo para ser utilizado por Samba.
Problemas de Samba con acl_xattr y security.NTACL
Con la configuración básica de VirtioFS y ZFS, el siguiente paso es la configuración de Samba. Una configuración típica para un directorio local, incluyendo vfs objects = acl_xattr, funciona perfectamente, permitiendo a Samba escribir atributos extendidos, incluidos los utilizados para las ACLs de Windows. Sin embargo, al intentar aplicar esta configuración a un directorio pasado a través de VirtioFS, surge un problema: Samba se niega a escribir atributos XATTR, específicamente security.NTACL.
El problema se manifiesta en que los comandos setfacl estándar para ACLs POSIX funcionan correctamente tanto en el disco local como en VirtioFS, pero la escritura de atributos específicos de Samba como security.NTACL falla. Esto impide la funcionalidad completa con los permisos de Windows, ya que Samba no puede guardar la información necesaria del descriptor de seguridad. Incluso deshabilitar SELinux en el host no produjo el resultado deseado.
Las pruebas realizadas con setfattr para simular la escritura de atributos de Samba revelaron un problema clave. Al intentar escribir el atributo security.NTACL como un usuario de dominio, la operación falló tanto para un archivo local como para un archivo en VirtioFS. Sin embargo, al realizar la misma operación como superusuario (root), la escritura de security.NTACL en un disco local tuvo éxito, mientras que en VirtioFS, siguió fallando.
Esto indica una diferencia fundamental en cómo se manejan los atributos extendidos:
security.NTACL: Este atributo reside en el espacio de nombressecurityy es utilizado por Samba para almacenar permisos de Windows (ACLs NTFS). La escritura en este espacio de nombres está estrictamente restringida y requiere privilegiosCAP_SYS_ADMIN, equivalentes a los derechos deroot. Los usuarios regulares, incluso los propietarios de archivos, no pueden modificar o eliminar directamente este atributo.user.NTACL: Este atributo reside en el espacio de nombresuser. Cualquier usuario con permisos de escritura sobre el archivo puede modificar atributos en este espacio de nombres.
La razón principal del fallo con VirtioFS es que incluso con el parámetro --sandbox none y un intento de escribir como root (a través de sudo), VirtioFS, a nivel del kernel o su propia implementación, aparentemente bloquea la escritura en el espacio de nombres security.NTACL. Esto impide el guardado correcto de los permisos de Windows de Samba.
Solución: Redirección de security.NTACL a user.NTACL e Integración de Instantáneas ZFS
Dado que Samba no puede escribir correctamente atributos en el espacio de nombres security.NTACL a través de VirtioFS, la única solución viable es redirigir estos atributos al espacio de nombres de usuario user.NTACL. Si bien esto es una solución alternativa (workaround) más que una solución completa al problema raíz de VirtioFS, permite a Samba almacenar toda la información necesaria de permisos de Windows. Es importante tener en cuenta que este enfoque es aceptable cuando los usuarios interactúan con el servidor exclusivamente a través de SMB y no tienen acceso directo al sistema de archivos del host o de la VM invitada.
Para implementar esta solución, se deben añadir los siguientes parámetros al archivo de configuración de 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
Aquí, las líneas clave son:
acl_xattr:security_acl_name = user.NTACL: Instruye a Samba para que useuser.NTACLen lugar desecurity.NTACLpara almacenar descriptores de seguridad.acl_xattr:ignore system acls = yes: Este parámetro le indica a Samba que ignore las ACLs del sistema, confiando en sus propios mecanismos para almacenar permisos.
Integración de Instantáneas ZFS con Samba
Para proporcionar la funcionalidad de Copias de Sombra (Shadow Copies) para clientes Windows, permitiendo a los usuarios restaurar versiones anteriores de archivos, se utiliza el módulo shadow_copy2. Este se integra con las capacidades de instantáneas de ZFS. En la configuración proporcionada:
vfs objects = acl_xattr shadow_copy2: Activa el móduloshadow_copy2.shadow:basedir = /fs: Especifica el directorio base para las copias de sombra.shadow:snapdir = .zfs/snapshot: Define el subdirectorio donde ZFS almacena sus instantáneas. Para un funcionamiento correcto, el pool de ZFS debe tener la propiedadlistsnapshots=onconfigurada (por ejemplo,zpool set listsnapshots=on pool_name), lo que permite a Samba descubrir y mostrar las instantáneas disponibles.shadow:format,shadow:sort,shadow:localtime: Configuran el formato de visualización y la ordenación de las instantáneas.
Así, esta configuración permite la creación de un servidor de archivos Samba completamente funcional en ZFS a través de VirtioFS, asegurando el correcto funcionamiento con ACLs de Windows y copias de sombra, a pesar de las dificultades iniciales con security.NTACL.
Puntos Clave
- VirtioFS y ACL/xattr: Para una funcionalidad completa de Samba con ACLs de Windows a través de VirtioFS, el demonio
virtiofsddebe iniciarse con los parámetros--xattry--posix-acl, a menudo requiriendo un script envoltorio. - Configuración de ZFS: Los conjuntos de datos ZFS utilizados para el recurso compartido de Samba deben configurarse con las propiedades
acltype=posixacl,aclinherit=passthroughyaclmode=passthroughpara un manejo correcto de las ACLs. - Problema de
security.NTACL: Samba, por defecto, intenta escribir descriptores de seguridad de Windows ensecurity.NTACL, lo que requiere privilegios derooty puede ser bloqueado por VirtioFS. - Solución a través de
user.NTACL: Una solución alternativa efectiva es redirigir a Samba para que useuser.NTACLpara almacenar atributos de seguridad a través del parámetroacl_xattr:security_acl_name = user.NTACL. - Instantáneas ZFS y Samba: La integración de instantáneas ZFS para las Copias de Sombra de Windows se logra a través del módulo
shadow_copy2en Samba, requiriendo una configuración apropiada de las propiedades del pool de ZFS.
— Editorial Team
Aún no hay comentarios.