Hlavní navigace

ACL: rozšířená nastavení práv v Linuxu

11. 3. 2013
Doba čtení: 8 minut

Sdílet

Pokud sdílíte svůj systém s dalšími lidmi, můžete občas narazit na problém, jak nastavit práva, abychom se k datům dostali oba. Po přečtení toho článku se už na podobné věci ptát nebudete. Linux umí pracovat s uživateli, skupinami a jejich právy už od svých začátků a ACL tato práva efektivně doplňuje.

Operační systémy s linuxovým jádrem umožňují pracovat více uživatelům najednou. Toho lze využívat mnoha způsoby, které mají jedno společné – data. Kromě jiného je úkolem administrátora zajistit, aby jeden uživatel nemohl zasahovat do dat jiných uživatelů a nebo aby tito uživatelé mohli pracovat nad jednou skupinou dat. Na to máme v Linuxu několik základních nástrojů.

Linuxová práva

Pokud používáte Linux již nějakou dobu, na nastavení práv už jste pravděpodobně narazili, ale pro úplnost je shrnu. Linuxové souborové systémy přistupují ke všemu jako k souboru, takže i adresář je interně považován za soubor. Každý soubor má svého vlastníka a skupinu, které patří. Základní nastavení práv pak spočívá v rozdělení práv ke čtení, zápisu a spuštění pro vlastníka, skupinu a všechny ostatní.

Právo pro čtení se označuje číslem 4 nebo písmenem r a umožňuje čtení obsahu souboru nebo adresáře. Právo pro zápis má číslo 2 nebo písmeno w a umožňuje zápis do souboru či adresáře. Posledním právem je právo pro spuštění, které má 1 nebo x a určuje, zda je možné spustit daný soubor nebo vstoupit do daného adresáře.

Práva již existujících souborů nalezneme například v detailním výpisu nějakého souboru.

$ ls -l test
-rw-rw-r-- 1 cx cx 0 bře  7 18:47 test 

Práva jsou vypsána písmeny. První tři písmena jsou práva vlastníka, druhá skupiny a třetí jsou práva všech ostatních. V tomto případě může být soubor čten či zapisován vlastníkem či skupinou, ale všemi ostatními může být pouze čten. Vlastník i skupina jsou uvedeny ve čtvrtém a pátém sloupci výpisu. Číselně bychom tato práva mohli zapsat jako 664. Toto označení je tedy součtem číselných hodnot daných práv (4, 2, 1).

Adresář je přece jen něco jiného než soubor a tam kde je čtení, zápis a spouštění jasné u souboru, nemusí být úplně jasné u adresářů. Pokud má tedy adresář právo pro čtení, tedy r či 4 chcete-li, může z něj být čten seznam souborů, tedy to, co obsahuje. Toto právo je poněkud zbytečné, pokud se do adresáře nedá vstoupit, což zajišťuje právo pro spuštění (x nebo 1). Právo pro zápis umožňuje modifikovat obsah adresáře, resp. mazat či vytvářet soubory v něm, bez ohledu na to, jaké mají tyto soubory vlastníky či práva. Zkusme jednoduchý test:

$ mkdir adresar
$ cd adresar/
$ touch soubor
$ sudo chown root:root soubor
$ ls -l
celkem 0
-rw-rw-r-- 1 root root 0 bře  7 19:05 soubor
$ rm soubor
rm: smazat proti zápisu chráněný běžný prázdný soubor „soubor“? y
$ ls -l
celkem 0 

Vytvořili jsme tedy adresář, v něm soubor, jako vlastníka souboru jsme pomocí chown nastavili uživatele root, stejně tak skupinu a zkusili soubor smazat. To se podařilo, protože vytvořený adresář patřil uživateli, který prováděl mazání. Tomuto chování se dá zabránit tzv. sticky bitem. Ten zabrání, aby uživatel mohl mazat soubory jiných uživatelů. Pokud ho chceme použít, je třeba, aby adresář se sticky bitem patřil rootu nebo jinému systémovému účtu, za kterým se neschovává živý člověk, jenž by mohl data uvnitř adresáře smazat. Tomu práva pro mazání, resp. změnu, zůstávají.

$ mkdir adresar
$ sudo chown root:root adresar
$ sudo chmod 1777 adresar
$ cd adresar
$ sudo touch soubor
$ ls -l
celkem 0
-rw-r--r-- 1 root root 0 bře  7 19:15 soubor
$ rm soubor
rm: smazat proti zápisu chráněný běžný prázdný soubor „soubor“? y
rm: nelze odstranit „soubor“: Operace není povolena 

Sticky bit nastavený pomocí chmod nezabrání vlastníkovi adresáře, aby uvnitř adresáře něco mazal, ale hodí se, když má do něj přístup pro zápis skupina či všichni. Toho využívá například adresář /tmp, kam mohou zapisovat všichni, ale jen vlastníci daných souborů je mohou mazat.

Kromě sticky bitu existuje ještě tzv. setuid/setgid bit. Oba bity určují, s jakými právy se má soubor spouštět. Toho využívá například sudo:

$ ls -l /usr/bin/sudo
-rwsr-xr-x 2 root root 112888 úno 27 21:49 /usr/bin/sudo 

Když spustíte sudo, tak bez ohledu na to, s jakým uživatelem jste tento nástroj spustili, poběží pod rootem, protože má nastavený setuid bit. Ten systému říká, že se má program spouštět vždy s právy vlastníka souboru. Setgid funguje stejně, ale se skupinou. U adresářů je chování trochu odlišné. Pokud má adresář nastavený setgid, budou mít všechny soubory v něm nastavenou shodnou skupinu, bez ohledu na skupinu uživatele, kterým jsou vytvořeny. Setuid bit je v Linuxu u adresářů ignorován, ale třeba FreeBSD se chová podobně jako setgid bit.

$ sudo mkdir adresar
$ sudo chmod 777 adresar
$ sudo chmod g+s adresar
$ touch adresar/soubor
$ ls -l adresar/
celkem 0
-rw-rw-r-- 1 cx root 0 bře  7 19:26 soubor 

Na tomto příkladu si můžete všimnout ještě odlišeného zápisu práv v programu chmod za použití znakové reprezentace rwx. Z následujících příkladů by mělo být jasné, jak na to:

$ chmod u=rwx,g=rwx,o=rw soubor
$ chmod u=r,g=r,o=r soubor
$ chmod ug=r soubor
$ chmod ug=rw soubor
$ chmod o+rw soubor
$ chmod o-w soubor 

Pro adresáře se hodí i rekurzivní nastavování práv:

$ sudo chmod -R 644 adresar 

Tímto jsme nastavili všem souborům a adresářům v adresáři „adresar“, včetně jeho samotného, práva rw-r–r–. Občas ale potřebujeme, aby všechny adresáře měly právo pro spuštění, aby se do nich dalo vstoupit. K tomu použijeme +X, které ovlivňuje pouze adresáře a použijeme parametr -R, který změnu provede rekurzivně.

$ sudo chmod -R +X adresar 

A to můžeme kombinovat ještě s konkrétní oblastí působení:

$ sudo chmod ug+X adresar 

Pro úplnost ještě uvedu tento zápis:

$ chmod 0644 soubor # bez speciálních módů
$ chmod 1644 soubor # sticky bit
$ chmod 2644 soubor # setgid bit
$ chmod 4644 soubor # setuid bit
$ chmod 6644 soubor # setuid a setgid bit
$ chmod 7644 soubor # setuid, setgid a sticky bit 

ACL – rozšířená práva

Vše, co je výše popsané, už jste pravděpodobně znali a nebo jste si jen doplnili nějaké mezery. Někdy je ale třeba nastavit práva poněkud jemněji, nejlépe pro konkrétní uživatele. Nejčastěji se do takové situace dostanete, když nemůžete nějakého uživatele přidat do skupiny, která by to umožňovala, protože by v této skupině dostal práva i tam, kam nepotřebuje. Pro řešení takových situací slouží v Linuxu tzv. ACL. To umí stávající práva rozšířit, což znamená, že ta standardní linuxová nepřestanou fungovat, ale můžete k nim přidat další, mnohem jemnější, práva.

ACL není standardně povoleno, protože jde o kontrolu navíc, která bude mít mírný vliv na výkon souborového systému. Ani nástroje pro práci s ACL nemusí být součástí vašeho systému. Pokud tedy během pokusů zjistíte, že vám nástroje setfacl nebo getfacl chybí, porozhlédněte se ve své distribuci po balíčku acl. Dále je třeba souborovému systému říct, že má na ACL brát ohled, a to mu řekneme při připojování v souboru fstab:

UUID=e3858cec-9d12-42c4-8e49-be4d3fba0f33 /home    ext4    defaults,noatime,discard,acl   0   2 

V případě, že nemůžete restartovat systém, aby se změna projevila, použijte mount s parametrem remount:

$ sudo mount -o remount,defaults,noatime,discard,acl /home 

A nyní už můžete používat ACL dle libosti. Začneme tedy jednoduchým příkladem:

$ sudo mkdir adresar
$ getfacl adresar/
# file: adresar/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x 

Dostali jsme výpis současného stavu oprávnění adresáře „adresar“, které kopíruje přesně to, co by vypsalo ls -l. Pokud nyní zkusí nějaký běžný uživatel v tomto adresáři něco provést, skončí na Operace zamítnuta. Přidáme tedy práva rwx třeba pro uživatele cx:

$ sudo setfacl -m user:cx:rwx adresar 

K nastavení ACL se používá nástroj setfacl a jedním z jeho parametrů je -m, kterým říkáme, že chceme práva nějakým způsobem změnit. Poté následuje řetězec ve formátu „typ:jmeno:práva“, kde typ označuje, o jaký typ záznamu jde. Může to být uživatel (user), skupina (group) či všichni ostatní (others) nebo třeba maska (mask). Práva se pak nastavují za poslední dvojtečkou, v tomto případě jde o práva pro všechno.

$ getfacl adresar
# file: adresar
# owner: root
# group: root
user::rwx
user:cx:rwx
group::r-x
mask::rwx
other::r-x 

Všimněte si, že byl přidán uživatel cx a objevila se také maska, která říká, jaká jsou maximální přidělená práva k uživatelům či skupinám. Pokud masku nastavíte pomocí „m:rx“, tak bez ohledu na práva, která jste uživateli „cx“ nastavili, bude mít tento pouze přístup ke čtení obsahu a spouštění. Po změnách v předchozím příkladu nyní najdete ve výpisu programu ls -l znak +.

drwxrwxr-x+ 3 root root      4096 bře  7 20:01 adresar 

V případě, že chcete takto nastavená práva smazat, použijte parametr -x:

sudo setfacl -x user:cx adresar 

Pokud chcete odstranit všechna rozšířená práva, použijte -b:

sudo setfacl -b adresar 

Někdy je třeba, aby měly soubory a adresáře nějaká výchozí práva, bez ohledu na to, kdo je vytvořit. U standardních práv k tomu slouží setgid bit a ACL nabízí tzv. výchozí práva. Ta se nastavují s pomocí default:

$ sudo setfacl -m  default:user:cx:rwx adresar
$ getfacl adresar
# file: adresar
# owner: root
# group: root
user::rwx
user:cx:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:cx:rwx
default:group::r-x
default:mask::rwx
default:other::r-x 

S prvním zavoláním se kromě požadovaného výchozího oprávnění nastavily i všechny ostatní. Nyní, když v adresáři „adresar“ vytvoříte soubor nebo podadresář, bude mít vždy nastaveno oprávnění „user:cx:rw“.

$ touch adresar/test
$ getfacl adresar/test
# file: adresar/test
# owner: cx
# group: cx
user::rw-
user:cx:rwx                     #effective:rw-
group::r-x                      #effective:r--
mask::rw-
other::r-- 

Všimněte si, že i když byla práva pro uživatele „cx“ nastavena automaticky pro soubor „test“, tak jejich hodnota byla kvůli masce oproštěna o právo spuštění. Jaká práva bude používat systém, se ve výpisu nachází za #effective.

Pokud se vám „default“ práva přestanou líbit, můžete je vymazat pomocí parametru -k. Nezapomeňte ovšem, že vše, co bylo díky tomu nastaveno v podadresářích, nastaveno zůstane, dokud to explicitně neodstraníte.

CS24_early

Shrnutí

ACL je efektivní nástroj, který pomůže zajistit, aby se konkrétní uživatelé, či skupiny, dostali na místa, kam mají a nedostali se tam, kam nemají. Jeho používání je snadné a po pár pokusech ho dostanete do ruky podobně jako standardní linuxové řešení oprávnění.

ACL nemusejí podporovat všechny souborové systémy. Mezi těmi, co ACL podporují, jsou třeba Ext4, Btrfs, XFS nebo JFS. U posledních dvou není třeba používat přepínač acl při připojování.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.