5.3. Používání ACLs

V následující části si na příkladech ukážeme používání ACLs a jejich interakci s tradičním systémem přístupových práv. Popíšeme postup pro vytvoření vlastních ACLs a také syntaxi ACLs.

ACLs dělíme na dva základní typy.Minimální ACLs obsahují položku pro typ uživatele (owner), skupinu vlastníka (owner group) a ostatní (other) s konvenčními přístupovými bity pro soubory a adresáře. Rozšířené ACLs jde ještě dál. Musí obsahovat nastavení položky mask a musí obsahovat více položek pro typy named user a named group. V tabulce 5.1 – „Typy ACL položek“ najdete přehled různých typů možných ACLs položek.

Tabulka 5.1. Typy ACL položek

Typ

Zápis

owner

user::rwx

named user

user:name:rwx

owning group

group::rwx

named group

group:name:rwx

mask

mask::rwx

other

other::rwx

Práva definována v položce owner a other jsou vždy platná. S vy jímkou položky mask všechny ostatní položky (named user, owning group, a named group) mohou být neaktivní nebo maskované. Platné jsou v případě, že jsou součástí jak určité položky, tak masky. Pokud jsou pouze součástí masky, jsou neaktivní. Tento mechanizmus je demonstrován v tabulce 5.2 – „Maskování práv“.

Tabulka 5.2. Maskování práv

Typ položky

Zápis

Práva

named user

user:jane:r-x

r-x

mask

mask::rw-

rw-

effective permissions:

r--

5.3.1. ACL položky a přístupové bity

V systému s ACLs existují minimální a rozšířené ACLs, první jsou znázorněny na obrázku 5.1 – „Minimální ACL: ACL úpoložky porovnávány podle přístupového bitu“, druhé na 5.2 – „Rozšířené ACL: ACL položky porovnávané podle přístupového bitu“. V následujících příkladech si ukážeme dva případy minimálních a rozšířených ACLs.

V obou případech jsou práva třídy owner mapována na ACL položky owner. Stejně tak jsou na příslušnou položku mapována také práva třídu other. V obou případech je však jiné mapování na třídu group.

Obrázek 5.1. Minimální ACL: ACL úpoložky porovnávány podle přístupového bitu

Minimální ACL: ACL úpoložky porovnávány podle přístupového bitu
V případě minimálních ACLs bez masky

jsou práva třídy group mapována na ACLs položku owning group.

V případě rozšířených ACLs s maskou

jsou práva třídy group mapována na položku mask.

Obrázek 5.2. Rozšířené ACL: ACL položky porovnávané podle přístupového bitu

Rozšířené ACL: ACL položky porovnávané podle přístupového bitu

Mapování zajišťuje hladký chod aplikací s podporou ACLs spolu s aplikacemi bez této podpory. Práva zde nezmíněná buď nejsou nastavena pomocí ACLs nebo jsou neaktivní. Pokud dojde ke změně přístupových bitů, dojde ke změně ACLs a vice versa.

5.3.2. Adresář s ACL přístupem

Princip přístupu ACLs je znázorněn v následujícím příkladě:

  • Vytvoření objektu souborového systému (v našem případě adresáře)

  • Změna ACL

  • Maskování

  1. Před vytvořením adresáře použijte příkaz umask k nastavení výchozích práv:

    umask 027

    Příkaz umask 027 nastaví výchozí přístupová práva tak, že vlastníkovi dá všechna práva (0, skupině zakáže zápis 2 a ostatním nedá práva žádná 7). umask zároveň maskuje všechny přístupové bity a deaktivuje je. Více informací o tomto příkazu získáte z jeho manuálových stránek (man umask).

    Zdejte příkaz mkdir. Výsledkem je vytvoření adresáře mydir s přístupovými právy nastavenými prostřednictvím umask. Následujícím příkazem překontrolujete, zda jsou práva nastavena správně:

    ls -dl mydir

    
     drwxr-x- ... tux project3 ... mydir
    
  2. Zjistěte počáteční nastavení ACL a vložte nové hodnoty pro uživatele a skupiny.

    getfacl mydir

    
    user::rwx
    group::r-x
    other::---
    

    Výstup příkazu getfacl velmi jasně ukazuje nastavení bitů a ACL položek popsaných v části 5.3.1 – „ACL položky a přístupové bity“. První tři řádky zobrazují jméno adresáře, vlastníka a jeho skupinu. Následující tři řádky obsahují ACL položky owner, owning group a other. V tomto případě má adresář minimální ACL nastavení a pomocí příkazu getfacl jsme získali stejný výpis jako v případě použití prostého ls.

    V první změně ACL přidáme práva pro čtení, zápis a vykonání pro dalšího uživatele se jménem jane a další skupiny djungle.

    setfacl -m

    
    user:jane:rwx,group:djungle:rwx mydir
    

    Parametrem -m příkazu setfacl říkáme, že má změnit ACLs. Parametr je následován hodnotami (jednotlivé položky jsou odděleny dvojtečkami). Poslední částí příkazu je jméno adresáře, na který se mají změny aplikovat.

    Příkazem getfacl si můžete nechat vypsat výsledné nastavení ACLs.

    
    # file: mydir
    # owner: tux
    # group: project3
    user::rwx
    user:jane:rwx
    group::r-x
    group:djungle:rwx
    mask::rwx
    other::---
    

    Jako další nastavení pro uživatele jane a skupinu djungle byla vytvořena položka mask. Tato položka automaticky redukuje všechny položky v třídy group na společný základ.

    Maska definuje maximální efektivní přístupová práva pro všechny položky v třídě group. To obsahuje named user, named group a owning group. Přístupové bity třídy group lze zobrazit příkazem ls -dl mydir.

    ls -dl mydir

    
    drwxrwx- ... tux project3 ... mydir
    

    První sloupec mimo obvyklého výstupu obsahuje také +, který indikuje existenci rozšířených ACLs.

  3. Podle výstupu příkazu ls obsahuje položka mask práva k zápisu. V tradičním pojetí by to znamenalo, že má vlastnická skupina (zde project3) také práva zápisu do adresáře mydir. Přístupová práva vlastnické skupiny však souhlasí s nastavením v mask, které jsou v našem příkladě r-x (viz. tabulka 5.2 – „Maskování práv“). Dodatečné nastavení tak nebude mít na dosavadní nastavení žádný vliv.

    Editujte položku mask příkazem setfacl nebo chmod.

    chmod g-w mydir

    ls -dl mydir

    drwxr-x---+ ... tux project3 ... mydir
    

    getfacl mydir

    
    # file: mydir
    # owner: tux
    # group: project3
    user::rwx
    user:jane:rwx          # effective: r-x
    group::r-x
    group:djungle:rwx      # effective: r-x
    mask::r-x
    other::---
    

    Po vykonání příkazu chmod bude odstraněn bit pro zápis z třídy group a výstup příkazu ls ukazuje, že musí být změněn i bity masky. Práva zápisu jsou opět omezeny pouze na vlastníka adresáře mydir. Výstup příkazu getfacl tuto skutečnost potvrzuje. Výstup obsahuje komentář pro všechny položky, kde přístupové bity nesouhlasí s originálním nastavením, protože jsou filtrovány pomocí položky mask. Původní nastavení lze kdykoliv vrátit příkazem chmod:

    chmod g+w mydir

    ls -dl mydir

    
    drwxrwx---+ ... tux project3 ... mydir
    

    getfacl mydir

    
    # file: mydir
    # owner: tux
    # group: project3
    user::rwx
    user:jane:rwx
    group::r-x
    group:djungle:rwx
    mask::rwx
    other::---
    

5.3.3. Adresář s výchozími ACL

Adresáře mohou mít zvláštní typ ACL tzv. výchozí ACL. Výchozí ACL nastavuje přístupová práva ke všem podřízeným adresářům s nastavenými výchozími ACL. Výchozí ACL se nastavuje přístupové ACL jak u adresářů tak v nich obsažených souborech.

5.3.3.1. Vliv výchozích ACL

S výchozím ACL je pracováno různě podle toho, na jaký typ objektu je uplatňován:

  • ACL podadresáře se skládá z výchozího ACL, jeho vlastního výchozího ACL a přístupového ACL adresáře.

  • Přístupová práva souboru se skládají z jeho vlastních ACL a výchozího ACL.

Všechny objekty souborového systému používají při nastavení přístupových práv parametr mode, který definuje přístupová práva nově vytvářených objektů.

  • Pokud rodičovský adresář nemá nastavené výchozí ACL, nastaví se přístupové bity podle hodnoty parametru mode příkazu umask.

  • Pokud má rodičovský adresář nastavené výchozí ACL, nově vytvářený objekt převezme přístupová práva od parametru mode a z výchozího ACL. Umask je ignorován.

5.3.3.2. Aplikace výchozích ACLs

Následující tři kroky ilustrují operace pro adresáře a výchozí ACLs:

  • vytvoření výchozího ACL pro aktuální existující adresář

  • Vytvoření podadresáře v adresáři s nastavených výchozím ACL

  • Vytvoření souboru v adresáři s výchozím ACL

  1. Vložení výchozí ACLs do existujícího adresáře mydir:

    setfacl -d -m group:djungle:r-x mydir

    Parametr -d příkazu setfacl zajistí změny (parametr -m) ve výchozím ACLs.

    Podívejme se blíže na výstup příkazu getfacl mydir:

    
    # file: mydir
    # owner: tux
    # group: project3
    user::rwx
    user:jane:rwx
    group::r-x
    group:djungle:rwx
    mask::rwx
    other::---
    default:user::rwx
    default:group::r-x
    default:group:djungle:r-x
    default:mask::r-x
    default:other::---
    

    getfacl vrátí jak přístupová ACL tak výchozí ACL. Výchozí ACL je tvořeno řádkami začínajícími na default. Po nastavení výchozího ACL příkazem setfacl pro skupinu djungle příkaz setfacl automaticky překopíruje všechny ostatní položky k nastavení platného výchozího ACL. Nastavení výchozího ACL nebude mít na existující objekty žádný okamžitý vliv. Ovlivňovat bude pouze nově vytvářené objekty po nastavení výchozího ACL. Tyto nové objekty budou mít přístupová práva skládající se pouze z výchozího ACL rodičovského adresáře.

  2. Nyní použijte příkaz mkdir k vytvoření podadresáře v adresáři mydir, který bude mít stejné ACLs.

    mkdir mydir/mysubdir

    getfacl mydir/mysubdir

    
    # file: mydir/mysubdir
    # owner: tux
    # group: project3
    user::rwx
    group::r-x
    group:djungle:r-x
    mask::r-x
    other::---
    default:user::rwx
    default:group::r-x
    default:group:djungle:r-x
    default:mask::r-x
    default:other::---
    

    Jak jsme očekávali, nově vytvořený podadresář mysubdir má přístupová práva rodičovského adresáře. Nastavení přístupových práv mysubdir je stejné jako mydir.

  3. Použití příkazu touch k vytvoření souboru v adresáři mydir:

    touch mydir/myfile

    ls -l mydir/myfile

    
    -rw-r-----+ ... tux project3 ... mydir/myfile
    

    getfacl mydir/myfile

    
    # file: mydir/myfile
    # owner: tux
    # group: project3
    user::rw-
    group::r-x          # effective:r--
    group:djungle:r-x   # effective:r--
    mask::r--
    other::---
    

    Důležitým je v tomto příkladě příkaz touch s režimem s hodnotou 0666, což znamená, že nově vytvářené soubory mají nastaveno právo pro čtení a zápis pro všechny třídy uživatelů a umask ani ACLs nenastavují žádná další omezení (viz. 5.3.3.1 – „Vliv výchozích ACL“).

    V důsledku to znamená, že všechna přístupová práva neobsažená v režimu hodnoty jsou odstraněny z ACLs položky. Přestože nebyla z ACLs třídy group odstraněna žádná práva, položka mask byla změněna k maskování jiným způsobem než s nastaveným režimem.

    Tato vlastnost zajišťuje bezchybnou funkci ACLs aplikací např. kompilátorů. Můžete tak vytvářet souboru s omezenými přístupovými právy a zároveň je označit jako vykonavatelné. Pomocí mask mechanizmu zajistí, že k nim budou mít práva pouze ti správní uživatelé a skupiny.

5.3.4. ACL kontrolní algoritmus

Všechny procesy a aplikace projdou před tím, než je jim povolen přístup k objektům chráněným ACLs kontrolním algoritmem. ACLs jsou testovány na následující sekvence: owner, named user, owning group nebo named group a other. Přístup je pak řízen s nejlepším výsledkem ve prospěch procesu. Sekvence nelze slučovat.

Tento algoritmus je samozřejmě mnohem komplikovanější, pokud objekt patří do více skupin s různými vlastnostmi. V takovém případě algoritmus náhodně vybere ze skupin, které mají požadované vlastnosti. Je jedno, jaká z položek bude vést k výsledku access granted. Pokud algoritmus nenajde žádnou vhodnou skupinu, výsledkem bude access denied.