Zpět na domů

Samba, ZFS, VirtioFS: Nastavení souborového serveru s ACL a XATTR

Podrobný průvodce integrací Samba se ZFS prostřednictvím VirtioFS na KVM, řešením problémů s ACL a xattr pro Windows-kompatibilní práva přístupu a stinné kopie.

Samba, ZFS a VirtioFS: Hloubková analýza problémů ACL a xattr v NAS
Advertisement 728x90

Integrace Samby a ZFS přes VirtioFS: Řešení problémů s ACL a XATTR ve virtualizovaných prostředích

Nasazení vysoce výkonného souborového serveru SMB s úložištěm ZFS ve virtualizovaném prostředí KVM přes VirtioFS s sebou nese jedinečné výzvy, zejména pokud jde o správné zpracování seznamů řízení přístupu (ACL) a rozšířených atributů (xattr) pro zajištění kompatibility s klienty Windows. Tento článek podrobně popisuje proces konfigurace a překonávání klíčových překážek, čímž zajišťuje plnou funkčnost a stabilní provoz sdílené složky.

Volba VirtioFS pro virtualizaci úložiště

Při vytváření síťového úložiště (NAS) na bázi ZFS s následnou organizací sdílených složek přes Sambu vyvstává potřeba efektivního způsobu připojení ZFS poolu k virtuálnímu stroji (VM). Původně byly zvažovány různé přístupy, včetně NFS, avšak zvláštní pozornost si získalo přímé předávání adresáře do VM, nabízené hypervizorem KVM. Mezi dostupnými možnostmi, jako jsou virtio-9p a VirtioFS, padla volba na VirtioFS.

virtio-9p byl vyloučen z důvodu jeho nestability, omezené podpory POSIX a nízkého výkonu, což jej činilo nevhodným pro kriticky důležité úlohy souborového serveru. VirtioFS naopak prokázal výrazně větší potenciál díky své architektuře, která umožňuje virtuálním strojům přímý přístup k souborovému systému hostitele s vysokým výkonem.

Google AdInline article slot

Nicméně, navzdory zjevným výhodám, VirtioFS měl své specifické rysy. Standardní nastavení virt-manager nenabízela možnosti pro zapnutí podpory rozšířených atributů (xattr) a seznamů řízení přístupu (ACL), které jsou kriticky důležité pro správnou funkci Samby s klienty Windows. Rozšířené atributy umožňují ukládat dodatečné informace o souborech a ACL definují detailní přístupová práva uživatelů a skupin, což je základem NTFS oprávnění ve Windows. Bez těchto funkcí by plnohodnotná integrace Samby a ZFS nebyla možná.

Konfigurace VirtioFS pro podporu ACL a XATTR

Hlavním úkolem bylo zajistit, aby démon virtiofsd, běžící na hostiteli, startoval s nezbytnými parametry --xattr a --posix-acl. Přímá editace XML konfigurace virtuálního stroje přes libvirt nebo Qemu se ukázala jako neefektivní, jelikož se nepodařilo správně předat všechny požadované parametry pro spuštění virtiofsd.

Řešením se stalo použití obálky – jednoduchého skriptu, který spouští virtiofsd s potřebnými přepínači. Tento přístup umožnil obejít omezení libvirt a zaručit aktivaci plné podpory ACL a xattr pro předávaný adresář. Proces vytvoření a aplikace obálky zahrnuje následující kroky:

Google AdInline article slot
  • Vytvoření skriptu obálky:

Vytvoří se soubor /usr/libexec/virtiofsdfix s následujícím obsahem:

```bash

#!/bin/bash

Google AdInline article slot

exec /usr/libexec/virtiofsd "$@" --xattr --posix-acl --sandbox none

```

Parametr --sandbox none byl přidán během experimentů a je určen k vypnutí izolace, což může být v některých případech důležité.

  • Nastavení přístupových práv:

Skriptu se udělí práva ke spuštění a zkopírují se bezpečnostní kontexty z původního démona virtiofsd:

```bash

sudo chmod +x /usr/libexec/virtiofsdfix

sudo chcon --reference=/usr/libexec/virtiofsd /usr/libexec/virtiofsdfix

```

  • Změna konfigurace VM:

V XML konfiguraci virtuálního stroje (přes virt-manager nebo virsh edit) je nutné zadat cestu k vytvořenému skriptu obálky jako hlavní modul VirtioFS.

Po těchto krocích VirtioFS bude správně předávat souborový systém hostitele do virtuálního stroje s aktivní podporou xattr a POSIX ACL. To tvoří základní kámen pro další integraci se ZFS a Sambou.

Konfigurace ZFS pro správnou funkci s ACL

I při správné konfiguraci VirtioFS pro předávání rozšířených atributů a POSIX ACL vyžaduje souborový systém ZFS specifickou konfiguraci pro plnou podporu těchto funkcí. Aby ZFS dataset mohl správně zpracovávat ACL, podobné těm, které se používají ve Windows (NTFS ACL), je nutné nastavit několik klíčových vlastností:

  • zfs set acltype=posixacl pool/smbfs:

Tato vlastnost zapíná podporu standardních Linux POSIX ACL pro určený dataset. Umožňuje správnou funkci příkazů jako getfacl a setfacl, což je nezbytná podmínka pro Sambu.

  • zfs set aclinherit=passthrough pool/smbfs:

Tato vlastnost definuje chování dědění ACL. Hodnota passthrough zaručuje, že při vytváření nových souborů nebo adresářů v datasetu automaticky zdědí přístupová práva z nadřazeného adresáře. To je klíčové pro udržení konzistence oprávnění v souborové struktuře, zejména v kontextu sdílených složek Windows.

  • zfs set aclmode=passthrough pool/smbfs:

Tato vlastnost nastavuje režim nezasahování ZFS do ACL. V režimu passthrough se ZFS nepokouší interpretovat ani měnit ACL, ale jednoduše je předává tak, jak jsou. To zajišťuje maximální kompatibilitu s externími systémy, jako je Samba, které spravují vlastní ACL.

Po konfiguraci ZFS a VirtioFS zbývá pouze připojit předaný adresář uvnitř hostovaného VM. To lze provést přidáním odpovídajícího řádku do /etc/fstab:

fs   /fs   virtiofs   rw,noatime,_netdev,nofail

Po spuštění mount -a bude ZFS adresář dostupný ve VM na cestě /fs, připravený k použití Sambou.

Problémy Samby s acl_xattr a security.NTACL

S základním nastavením VirtioFS a ZFS je dalším krokem konfigurace Samby. Typické nastavení pro lokální adresář, zahrnující vfs objects = acl_xattr, funguje bezvadně a umožňuje Sambě zapisovat rozšířené atributy, včetně těch, které se používají pro Windows ACL. Nicméně při pokusu aplikovat tuto konfiguraci na adresář předaný přes VirtioFS nastává problém: Samba odmítá zapisovat atributy XATTR, konkrétně security.NTACL.

Problém se projevuje tak, že standardní příkazy setfacl pro POSIX ACL fungují správně jak na lokálním disku, tak na VirtioFS, ale zápis specifických atributů Samby, jako je security.NTACL, selhává. To vede k nemožnosti plnohodnotné práce s oprávněními Windows, jelikož Samba nemůže uložit potřebné informace o bezpečnostních deskriptorech. Ani vypnutí SELinuxu na hostiteli nepřineslo požadovaný výsledek.

Provedené testy s setfattr pro simulaci zápisu atributů Samby odhalily klíčový problém. Při pokusu o zápis atributu security.NTACL jménem doménového uživatele operace selhala jak pro lokální soubor, tak pro soubor na VirtioFS. Nicméně, při provedení stejné operace jménem superuživatele (root) byl zápis security.NTACL na lokálním disku úspěšný, zatímco na VirtioFS stále selhával.

To poukazuje na zásadní rozdíl v mechanismech práce s rozšířenými atributy:

  • security.NTACL: Tento atribut se nachází v jmenném prostoru security a je používán Sambou pro ukládání oprávnění Windows (NTFS ACL). Zápis do tohoto jmenného prostoru je přísně omezen a vyžaduje oprávnění CAP_SYS_ADMIN, což je ekvivalentní právům root. Běžní uživatelé, dokonce ani vlastníci souborů, nemohou přímo měnit nebo mazat tento atribut.
  • user.NTACL: Tento atribut se nachází v uživatelském jmenném prostoru user. Jakýkoli uživatel, který má práva k zápisu do souboru, může měnit atributy v tomto prostoru.

Hlavní příčina selhání s VirtioFS spočívá v tom, že i s parametrem --sandbox none a pokusem o zápis od root (přes sudo), VirtioFS na úrovni jádra nebo vlastní implementace, zjevně blokuje zápis do jmenného prostoru security.NTACL. To brání správnému uložení oprávnění Windows Sambou.

Řešení: Přesměrování security.NTACL na user.NTACL a integrace ZFS snímků

Jelikož Samba nemůže správně zapisovat atributy do jmenného prostoru security.NTACL přes VirtioFS, jediným funkčním řešením se stává přesměrování těchto atributů do uživatelského prostoru user.NTACL. Ačkoli se jedná o obejití problému, nikoli o úplné řešení kořenové příčiny s VirtioFS, umožňuje to Sambě ukládat všechny potřebné informace o oprávněních Windows. Je důležité poznamenat, že tento přístup je přijatelný v situacích, kdy uživatelé komunikují se serverem výhradně přes SMB a nemají přímý přístup k souborovému systému hostitele nebo hostovaného VM.

Pro implementaci tohoto řešení je nutné do konfiguračního souboru Samby (smb.conf) přidat následující parametry:

[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

Zde jsou klíčové řádky:

  • acl_xattr:security_acl_name = user.NTACL: Nařizuje Sambě používat user.NTACL namísto security.NTACL pro ukládání bezpečnostních deskriptorů.
  • acl_xattr:ignore system acls = yes: Tento parametr instruuje Sambu, aby ignorovala systémové ACL a spoléhala se na vlastní mechanismy ukládání oprávnění.

Integrace ZFS snímků se Sambou

Pro zajištění funkčnosti stínových kopií (Shadow Copies) pro klienty Windows, což uživatelům umožňuje obnovovat předchozí verze souborů, se používá modul shadow_copy2. Ten se integruje s možnostmi ZFS pro vytváření snímků (snapshots). V uvedené konfiguraci:

  • vfs objects = acl_xattr shadow_copy2: Aktivuje modul shadow_copy2.
  • shadow:basedir = /fs: Určuje základní adresář pro stínové kopie.
  • shadow:snapdir = .zfs/snapshot: Definuje podadresář, kde ZFS ukládá své snímky. Pro správnou funkci je nezbytné, aby ZFS pool měl vlastnost listsnapshots=on (například zpool set listsnapshots=on pool_name), což umožňuje Sambě detekovat a zobrazovat dostupné snímky.
  • shadow:format, shadow:sort, shadow:localtime: Nastavují formát zobrazení snímků a jejich řazení.

Tímto způsobem tato konfigurace umožňuje vytvořit plně funkční souborový server Samba na ZFS přes VirtioFS, zajišťující správnou práci s Windows ACL a stínovými kopiemi, navzdory počátečním komplikacím s security.NTACL.

Co je důležité

  • VirtioFS a ACL/xattr: Pro plnohodnotnou práci Samby s Windows ACL přes VirtioFS musí být démon virtiofsd spuštěn s parametry --xattr a --posix-acl, což často vyžaduje použití skriptu obálky.
  • Konfigurace ZFS: ZFS datasety používané pro sdílenou složku Samby musí být nakonfigurovány s vlastnostmi acltype=posixacl, aclinherit=passthrough a aclmode=passthrough pro správné zpracování ACL.
  • Problém security.NTACL: Samba se standardně pokouší zapisovat bezpečnostní deskriptory Windows do security.NTACL, což vyžaduje oprávnění root a může být blokováno VirtioFS.
  • Řešení přes user.NTACL: Efektivním obejitím je přesměrování Samby na použití user.NTACL pro ukládání bezpečnostních atributů pomocí parametru acl_xattr:security_acl_name = user.NTACL.
  • ZFS snímky a Samba: Integrace ZFS snímků pro stínové kopie Windows se provádí pomocí modulu shadow_copy2 v Sambě, což vyžaduje odpovídající nastavení vlastností ZFS poolu.

— Editorial Team

Advertisement 728x90

Číst dál