Tam, kde tradiční práva v Linuxu přestávají stačit, je možno použít práva rozšířená (ACL – access control list). Obzvláště v systému s mnoha uživateli a různými rolemi se rozšířeným právům zpravidla nevyhneme.
Klasická práva
V klasických právech má soubor či adresář tyto skupiny oprávnění:
- vlastník (uživatel)
- skupina (skupina uživatelů)
- ostatní
Každá tato skupina může mít nastavenu kombinaci těchto práv pro
- čtení
- zápis
- spuštění (u adresáře přístup)
Dále může mít objekt přiřazeny speciální bity: setuid, setgid, sticky.
Příklad klasických práv: Vlastník je uživatel ondra
, který má práva pro čtení i zápis, dále soubor mohou číst členové skupiny uzivatele
. Ostatní nemají k obsahu souboru přístup.
[tomas@centos]$ ls -l soubor -rw-r----- 1 ondra uzivatele 0 Nov 19 16:08 soubor
Nastavení těchto práv je v klasickém systému dosaženo příkazy chmod
(změna práv) a chown
(změna vlastníka, změnu může provést pouze root):
[root@centos]# chown ondra:uzivatele soubor [root@centos]# chmod 640 soubor
Na jednoduché přiřazení práv se klasická práva výborně hodí, avšak selhávají i ve velmi jednoduchých případech, např: určit dva uživatele s právem pro zápis a čtení, dalšími vyjmenovanými uživateli s právem pouze pro čtení a ostatní bez přístupu. Tuto situaci řeší ACL velmi jednoduše.
Podpora ACL systémy souborů
Všechny hlavní systémy souborů v Linuxu (ext3, XFS, JFS, ReiserFS) ACL zvládají. U souborového systému ext3 je potřeba nastavit parametry mountu, což lze provést buď v /etc/fstab
, nebo utilitkou tune2fs
.
[root@centos]# tune2fs -o acl /dev/sdxy
A remountovat (znovu připojit) oddíl: mount / -o remount
.
Pro správu rozšířených práv jsou určeny příkazy setfacl
a getfacl
z balíku acl
.
Rozšířená práva
Přidávají ke klasickým právům vlastníka a skupiny zejména práva dalších uživatelů, skupin a také výchozí práva (pro adresáře). Dále je možné nastavit masku práv.
ACL záznamy se přidávají příkazem setfacl
s parametrem -m
. Záznamy mají tvar user:"jmeno uzivatele":"prava"
. Je možné použít i zkrácený tvar, místo user lze použít u, místo group stačí g atd. Záznamy bez uživatele nebo skupiny se zadávají ve tvaru mask:"práva".
Práva se zadávají ve tvaru rwx
(jakákoliv libovolná kombinace práv pro čtení, zápis a spouštění). „Prázdná“ práva se zadávají ve tvaru ---
.
Příkaz getfacl
na soubor použitý v předchozím příkladu vypíše:
[root@centos]# getfacl soubor # file: soubor # owner: ondra # group: uzivatele user::rw- group::r-- other::---
Zatím nic nového. Soubor vlastní uživatel ondra
s právy rw
, skupina uzivatele
s právem jen pro čtení (r
) a ostatní bez práv. Tedy přesně tak, jak bylo nastaveno pomocí klasických práv.
Práva uživatele
Nyní budeme požadovat, aby měl do daného souboru přístup pro zápis též uživatel milos
:
[root@centos]# setfacl -m user:milos:rw soubor [root@centos]# getfacl soubor # file: soubor # owner: ondra # group: uzivatele user::rw- user:milos:rw- group::r-- mask::rw- other::---
Ve výpisu přibyl jednak přidaný záznam pro uživatele milos a také maska. Výpis přes ls -l soubor
v tuto chvíli zobrazuje nepřesné informace o právech a znakem ‚+‘ informuje o použití rozšířených práv:
[root@centos]# ls -l -rw-rw----+ 1 ondra uzivatele 0 Nov 19 16:08 soubor
Maska
Maska je filtr práv, princip je jasný z příkladu:
Uživatelská práva | user:simona:r-x |
r-x |
Maska | mask::rw- |
rw- |
Skutečná práva Simony | r-- |
Uživatel simona nemůže soubor spouštět i přes to, že má přiřazeno právo ke spouštění. Nastavená maska práv jí to ruší.
O omezení práv (resp. o efektivních – skutečných – právech) z důvodu masky informuje i výpis getfacl
, např:
user::r-x #effective:r--
Maska se v praxi příliš nepoužívá. Obvykle se tedy nastavuje na rwx
.
Práva skupiny
Podobně jako právo pro uživatele můžeme přidat práva pro skupinu. Chceme, aby do souboru mohli zapisovat též uživatelé ve skupině kamaradi
:
[root@centos]# setfacl -m group:kamaradi:rw soubor getfacl soubor # file: soubor # owner: ondra # group: uzivatele user::rw- user:milos:rw- group::r-- group:kamaradi:rw mask::rw other::---
Výchozí práva
Jsou přiřazena k adresáři a sama o sobě neřídí přístup. Jejich smysl je v přiřazení práv k souborům a dalším podadresářům.
S výchozími právy je systémem zacházeno dvojím způsobem:
- Podadresář zdědí výchozí práva z rodičovského adresáře a též je použije jako svá přístupová práva.
- Soubor vytvořený v adresáři s výchozími právy je pouze zdědí jako svá přístupová práva.
Výchozí ACL záznamy se přidávají příkazem setfacl
s parametry -d -m
, za nimiž následuje již známý zápis práv.
Příklad: máme adresář, do kterého chceme udělit přístup uživatelům ve skupině kamaradi
, kteří tam budou vytvářet soubory tak, aby je ostatní uživatelé v této skupině mohli měnit. Dále požadujeme, aby další uživatelé ve skupině uzivatele
měli možnost tyto soubory číst. Ostatní nebudou mít přístup.
Vytvoření adresáře, přiřazení práv pro skupinu kamaradi
a přidání výchozích práv téže skupině.
[root@centos]# mkdir Spolecny [root@centos]# setfacl -m group:kamaradi:rwx Spolecny [root@centos]# setfacl -d -m group:kamaradi:rwx Spolecny
Dále přidáme práva pro čtení a odpovídající výchozí záznam pro skupinu uzivatele
:
[root@centos]# setfacl -m group:uzivatele:rx Spolecny [root@centos]# setfacl -d -m group:uzivatele:rx Spolecny
A nakonec je třeba upravit práva pro ostatní.
[root@centos]# setfacl -m other:--- Spolecny [root@centos]# setfacl -d -m other:--- Spolecny
Práva adresáře po těchto úpravách vypadají takto:
[root@centos]# getfacl Spolecny/ # file: Spolecny # owner: root # group: root user::rwx group::r-x group:kamaradi:rwx group:uzivatele:r-x mask::rwx other::--- default:user::rwx default:group::r-x default:group:kamaradi:rwx default:group:uzivatele:r-x default:mask::rwx default:other::---
Soubor vytvořený v adresáři Spolecny uživatelem milos
, který je ve skupině kamaradi
, bude pak mít práva:
[root@centos]# su milos [milos@centos]$ touch milosuv_soubor [milos@centos]$ getfacl milosuv_soubor # file: milosuv_soubor # owner: milos # group: milos user::rw- group::r-x #effective:r-- group:kamaradi:rwx #effective:rw- group:uzivatele:r-x #effective:r-- mask::rw- other::---
K tomuto souboru jsou nastavena práva tak, jak bylo v zadání s tím, že došlo k omezení práv na rw
místo očekávaného rwx
. Toto je způsobeno nastavením umask
v systému (více viz man umask
). Soubory se standardně vytvářejí jako nespustitelné. Pro nastavení práv spouštění lze použít třeba chmod u+x,g+x milosuv_soubor
. Nebo opět pomocí setfacl
.
Nově vytvořený podadresář pak má práva:
[milos@centos]$ mkdir Milosuv_Adresar [milos@centos]$ getfacl Milosuv_Adresar/ # file: Milosuv_Adresar # owner: milos # group: milos user::rwx group::r-x group:kamaradi:rwx group:uzivatele:r-x mask::rwx other::--- default:user::rwx default:group::r-x default:group:kamaradi:rwx default:group:uzivatele:r-x default:mask::rwx default:other::---
Nově vytvořený adresář zdědil jak přístupová práva, tak i výchozí záznamy.
Vyšlo též na abclinuxu.cz.