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 |
|
named user |
|
owning group |
|
named group |
|
mask |
|
other |
|
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 |
|
|
mask |
|
|
effective permissions: |
|
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.
jsou práva třídy group mapována na ACLs položku owning group.
jsou práva třídy group mapována na položku mask.
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.
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í
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
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.
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::---
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.
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.
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
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.
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.
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.
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.