Přístupová práva v Unixu umožňují ve víceuživatelském systému definovat přístup k adresářům a souborům na základě uživatelských účtů nebo skupin uživatelů. Kontrola přístupu umožňuje na systémové úrovni zabránit uživatelům, aby záměrně nebo omylem cizí data poškodili nebo zneužili.
Základní oprávnění (označována také jako tradiční unixová oprávnění) v unixových systémech pocházejí z přelomu 60. a 70. let minulého století, kdy počítače měly velmi málo paměti (řádově desítky kB) a pomalé procesory. Oprávnění byla proto vytvořena co nejjednodušeji, aby se minimalizovala režie operačního systému při jejich interpretaci.
(Pro pokročilejší a jemnější práci s přístupovými právy slouží tzv.
Access control list, který ale musí mít podporu na konkrétním
souborovém systému. Pro manipulaci s přístupovými právy se potom používají programy
getfacl a setfacl z balíčku acl.)
Pravidla¶
Každý objekt v souborovém systému (soubor, adresář) má v i-uzlu (inode) uloženy následující informace:
- typ souboru (obyčejný soubor, adresář, symbolický odkaz, soubor zařízení, pojmenovaná roura, socket)
- vlastníka a skupinu, kterým soubor patří
- trojice oprávnění pro vlastníka, skupinu a ostatní uživatele
r(čtení),w(zápis) ax(spouštění)
Každý soubor patří právě jednomu vlastníkovi a jedné skupině. Uživatel ale může
být členem více skupin — oprávnění skupiny se uplatní, pokud je uživatel členem
skupiny přiřazené danému souboru. Příkaz groups vypíše všechny skupiny, kterých
je uživatel členem. Členství ve skupinách nastavuje administrátor (root).
Při práci s objekty v souborovém systému platí tato pravidla:
- nově vytvořený objekt patří uživateli, který ho vytvořil, a primární skupině tohoto uživatele
- nově vytvořený objekt má implicitně oprávnění určená příkazem
umask - oprávnění může měnit vlastník objektu nebo správce systému (root)
- vlastníka může měnit pouze
root - skupinu může měnit vlastník (pokud je členem cílové skupiny) nebo
root
Operační systém nezasahuje do zapsaných údajů, pokud nemusí. Proto při přejmenování nedojde k ovlivnění oprávnění ani vlastníka či skupiny. Naopak při kopírování patří kopie tomu, kdo si ji vytvořil. Při přesunu záleží na tom, jestli je potřeba vytvořit nový i-uzel (při přesunu mezi různými souborovými systémy jde vlastně o kopírování s následným smazáním originálu) nebo nikoliv (jde vlastně o variantu přejmenování).
Výpis přístupových práv¶
Přístupová práva lze zjistit příkazem ls -l:
1 2 3 | |
- Výstup příkazu
ls -l /tmp drwxr-x--x 2 pepa doma 4096 říj 7 18:54 adresar
Ve výpisu první znak udává druh souboru
| Znak | Popis |
|---|---|
d |
adresář |
- |
běžný soubor |
l |
symbolický odkaz |
p |
pojmenovaná roura |
c |
znakové zařízení |
b |
blokové zařízení |
s |
socket |
Dále je 9 znaků zobrazujících
přístupová práva.
Číslo udává počet jmen souboru.
Dále jméno vlastníka pepa a
skupiny vlastníků doma. Dále velikost souboru, datum poslední změny a nakonec
jméno souboru.
Přístupová práva se zobrazují ve třech trojicích: vlastník, skupina, ostatní.
| Právo | Popis |
|---|---|
r |
právo pro čtení (read) |
w |
právo pro zápis (write) |
x |
právo pro spouštění (execute) |
s |
SUID bit nebo SGID bit, soubor se bude spouštět s právy vlastníka nebo skupiny |
t |
Sticky bit |
rwxr-x--xrwx– vlastník (pepa) může číst, psát a spouštětr-x– skupina vlastníků (doma) může číst a spouštět--x– ostatní uživatelé mohou spouštět
Změna přístupových práv¶
Změna přístupových práv se provádí příkazem chmod (change mod) podle
následujícího schématu:
| příkaz | komu? | akce | typ oprávnění | soubor(y) |
|---|---|---|---|---|
s |
||||
u |
+ |
r |
||
chmod |
g |
- |
w |
soubor |
o |
= |
x |
||
a |
X |
|||
t |
u— user (vlastník)g— group (skupina)o— others (ostatní)a— all (všichni)
Akce:
+— přidá oprávnění-— odebere oprávnění=— nastaví oprávnění (ostatní nenastavená oprávnění odebere)
Typy oprávnění:
r— čtení (read)w— zápis (write)x— spouštění (execute)X— spouštění, ale jen pro adresáře (nebo soubory, které už majíxnastaveno)s— SUID/SGID bitt— sticky bit
Potom to může vypadat například takto:
| Příkaz | popis |
|---|---|
chmod go-rw soubor |
odebere skupině a ostatním právo pro čtení a zápis |
chmod g=r soubor |
nastaví skupině právo pouze pro čtení |
chmod -R u+w adresar |
přidá vlastníkovi právo pro zápis. -R provede na všech souborech v adresáři a v podadresářích |
chmod a-w soubor |
všem (all) uživatelům se odebere právo pro zápis |
chmod a+X * |
přidá všem právo pro spouštění, ale jen adresářům nebo tam, kde už je nastaveno. |
Číselný zápis přístupových práv¶
Práva rwxr-x--x bychom mohli zapsat jako 111 101 001. Každou trojici
binárních znaků můžeme interpretovat jako osmičkovou číslici — tedy 751. Příkaz chmod potom může vypadat takto:
1 | |
Speciální bity (SUID, SGID, sticky bit) se zapisují jako první číslice
čtyřmístného čísla: 4 — SUID, 2 — SGID, 1 — sticky bit. Například
chmod 4755 soubor nastaví SUID bit a práva rwxr-xr-x.
Změna vlastníka a skupiny¶
Vlastníka a skupinu souboru mění příkaz chown (change owner).
Skupinu lze změnit i příkazem chgrp (change group).
Měnit vlastníka může pouze root, skupinu může měnit vlastník souboru (pokud je členem cílové skupiny) nebo root.
| Příkaz | popis |
|---|---|
chown pepa soubor |
změní vlastníka souboru na pepa |
chown pepa:studenti soubor |
změní vlastníka na pepa a skupinu na studenti |
chown -R pepa:studenti adresar |
změní vlastníka a skupinu rekurzivně |
chgrp studenti soubor |
změní skupinu souboru na studenti |
Příkaz groups vypíše skupiny, kterých je uživatel členem:
1 2 | |
Ještě o fous víc se dá zjistit pomocí příkazu id. Příkaz newgrp spustí nový shell
s jinou primární skupinou uživatele. Nově vytvořené soubory pak budou patřit této skupině.
1 2 3 4 5 | |
nebo možná čitelnějsí příklad:
1 2 3 4 5 6 7 | |
Interpretace přístupových práv¶
Přístupová práva se rozdílně interpretují pro soubory a pro adresáře.
Interpretace pro soubory¶
Právo r umožňuje uživateli číst obsah souboru a právo w měnit jeho obsah.
Ale právo w u souboru není rozhodující při jeho mazání nebo přepsání. Jde spíše
o “příznak ochrany proti zápisu”.
Právo x umožňuje uživateli soubor spustit. Spustitelný soubor může být buď
binární nebo může
jít o skript. O možnosti jeho spuštění nerozhoduje přípona,
ale právě jeho přístupová práva.
Speciální přístupová práva¶
Právo s pro uživatele nebo skupinu je označované jako tzv. SUID a SGID. Pokud
je nastaveno, je program spuštěn tak, jako by ho spustil jeho vlastník nebo
skupina vlastníků.
Příkladem použití může být například změna hesla: Hesla uživatelů bývala uložena v souboru /etc/passwd, dnes jsou uložena v /etc/shadow, do kterých běžný uživatel nemůže zapisovat (soubor shadow nemůže dokonce ani číst). Při změně hesla je ale potřeba změněné heslo do těchto souborů zapsat. Proto má program /usr/bin/passwd nastaven SUID bit a patří uživateli root. Po spuštění běží program passwd s právy roota a heslo může být do příslušného souboru zapsáno.
Nebo: Některé hry zapisují dosažené skóre do souboru, aby mohli hráči své výkony porovnat. Takový soubor by musel mít právo zápisu pro všechny uživatele v systému. Hráči by pak snadno mohli tento soubor měnit a své dosažené skóre neférově zvyšovat. Proto je program s hrou svěřen speciální skupině (např. games) a je mu nastaven SGID bit. Soubor se skóre pak bude mít právo zápisu přidělené jen skupině games. Do souboru se skóre tak spuštěná hra může zapisovat, kdežto uživatelé nemohou soubor měnit.
Pokud je nastaven Sticky bit t, ponechává se jeho obsah ve
vyrovnávací paměti, což urychlí jeho další spuštění. V současné době se příliš nepoužívá.
Interpretace pro adresáře¶
U adresářů právo w znamená možnost v adresáři vytvářet nebo mazat soubory.
Nerozhoduje tedy právo zápisu pro soubor, ale pro adresář, ve kterém je umístěn.
Právo r říká, že uživatel může vypsat jména souborů v adresáři a právo x
říká, že do adresáře může vstoupit nebo jím “proplout” k podadresáři. Pro
“normální” přístup k adresáři je zapotřebí právo r i x.
Chceme-li například sdílet adresář s ostatními uživateli, provedeme následující:
1 2 3 4 5 6 7 8 | |
Tím je domovský adresář nastaven tak, že v něm nelze nic číst, ale zároveň jím lze “proplout” do adresáře public, kde je čtení již povoleno.
Speciální přístupová práva¶
Je-li nastaveno právo s pro skupinu (SGID), budou nově vytvořené soubory v
adresáři náležet skupině, které náleží adresář.
Pokud je nastaven sticky bit t, může uživatel v adresáři mazat jen
své vlastní soubory. Jinak by mohl (pokud by měl v adresáři právo zápisu) smazat
i soubory vlastněné jiným uživatelem.
Výchozí přístupová práva¶
O přístupových právech nově vytvořených souborů rozhoduje uživatelská maska
(user mask). Tu lze zobrazit a nastavit příkazem umask.
1 2 | |
Pokud je vytvářen nový adresář, jsou jeho přístupová práva dána odečtením bitů masky od čísla 777 a uživatelské masky. Nově vytvořený adresář tedy bude mít práva
rwxr-x--x
1 2 3 4 | |
Pokud je vytvářen nový soubor, jsou jeho přístupová práva dána odečtením bitů masky od čísla 666 a uživatelské masky. Nově vytvořený soubor tedy bude mít práva
rw-r-----.
1 2 3 4 | |
Nastavení uživatelské masky na hodnotu 022 provedeme příkazem
1 | |
Příkaz umask nastavuje masku pouze pro aktuální shell. Pro trvalé nastavení
je potřeba příkaz umístit do konfiguračního souboru shellu (např. ~/.bashrc
nebo ~/.zshrc).