Přístupová práva v Unixu

Z Wikipedie, otevřené encyklopedie

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í), která 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 KiB) 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.

Pokyny[editovat | editovat zdroj]

Každý objekt v souborovém systému (soubor, adresář) má v i-uzlu (inode) uloženy následující informace:

Při práci s objekty vsouborové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, v některých případech i majitel (za speciálních podmínek)
  • skupinu může měnit root, v některých případech i majitel (za speciálních podmínek)

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 (inode) (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í).

Zápis oprávnění[editovat | editovat zdroj]

V unixových systémech se práva zapisují oktalově nebo pomocí symbolického zápisu (binární zápis se nepoužívá). Výsledná hodnota je součtem hodnot jednotlivých oprávnění v každé trojici. Změna oprávnění se provádí příkazem chmod.

Typ práva Symbolické vyjádření Oktalové vyjádření
Čtení r (Read) 4
Zápis w (Write) 2
Spuštění x (eXecute) 1

Příklady zápisu oprávnění[editovat | editovat zdroj]

700
Vlastník Skupina Ostatní
r w x – – – – – –
4 2 1 0 0 0 0 0 0
Pro čistě soukromé adresáře. Přístup čtení, zápis a otevření adresáře má pouze vlastník.
600
Vlastník Skupina Ostatní
r w – – – – – – –
4 2 0 0 0 0 0 0 0
Pro soukromé soubory (s daty). Vlastník do nich může zapisovat a číst je.
755
Vlastník Skupina Ostatní
r w x r – x r – x
4 2 1 4 0 1 4 0 1
Typický zápis práv pro veřejný adresář. Právo čtení a otevření adresáře mají všichni, měnit data může vlastník adresáře.
644
Vlastník Skupina Ostatní
r w – r – – r – –
4 2 0 4 0 0 4 0 0
Typický zápis přístupových práv pro veřejné soubory, právo čtení souboru mají všichni, měnit data může jen vlastník souboru.
775
Vlastník Skupina Ostatní
r w x r w x r – x
4 2 1 4 2 1 4 0 1
Skupinová práce. Práva číst, zapisovat a otevírat soubory má vlastník a skupina, které je vlastník souboru členem. Ostatní mají práva soubory číst a otevírat.
770
Vlastník Skupina Ostatní
r w x r w x – – –
4 2 1 4 2 1 0 0 0
Tajný projekt. Práva čtení, zápisu a otevírání souboru má vlastník souboru a skupina, které je vlastník souboru členem. Ostatní nemají žádná práva.

Poznámka: Pro vstup do adresáře musí mít uživatel i ve všech nadřazených adresářích právo x.

Význam oprávnění u souborů a adresářů[editovat | editovat zdroj]

Oprávnění pro soubory a adresáře se významově poněkud liší, jak zachycuje následující tabulka:

Soubor Adresář
Read čtení ze souboru čtení adresáře (výpis obsahu)
Write zápis do souboru (změna obsahu, délky) zápis do adresáře (vytváření, mazání a přejmenování souborů i podadresářů)
eXecute spuštění (program, skript) vstup do adresáře

Výpis oprávnění[editovat | editovat zdroj]

Pro výpis oprávnění můžeme v terminálu použít příkaz ls -l. Výstup je formátován, jak je níže:

celkem 12
lrwxrwxrwx 1 huzva project    9 kvě 28 15:42 jinynazev -> pokus.txt
-rw-rw-r-- 1 huzva project 1230 kvě 28 15:42 obrazek.gif
-rw-rw-r-- 1 huzva project 4000 kvě 28 15:41 pokus.txt

Význam jednotlivých sloupců:

  1. typ souboru – pomlčka označuje obyčejný soubor, ‚d‘ je adresář, ‚lsymbolický odkaz, ‚c‘ znakové zařízení, ‚b‘ blokové zařízení a ‚p‘ je pojmenovaná roura. Následují oprávnění pro vlastníka, skupinu a ostatní uživatel (vždy tři oprávnění). Pokud není některé oprávnění přiděleno, objeví se při výpisu pomlčka ().
  2. počet odkazů na i-uzel (inode)
  3. vlastník objektu
  4. skupina, které objekt patří
  5. velikost objektu
  6. datum a čas poslední změny objektu (zde 3 sloupce)
  7. název objektu

Speciální oprávnění[editovat | editovat zdroj]

Speciální oprávnění mění standardní chování systému, což je výhodné v některých speciálních případech.

SUID (setuid)[editovat | editovat zdroj]

Za standardních okolností dědí potomek (nový proces) oprávnění svého rodiče. Někdy je však nutné, aby měl spuštěný program jiná (vyšší) oprávnění. Pokud je na souboru s programem nastaven SUID bit, neběží spuštěný program s právy rodiče, ale s právy vlastníka tohoto souboru. Používá se v případech, kdy chceme uživateli umožnit provedení akce, na které by potřeboval jiná nebo vyšší oprávnění:

Změna hesla
Hesla uživatelů jsou uložena v souboru /etc/passwd nebo /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.
Změna uživatele
Program běžného uživatele nemůže změnit svoje oprávnění. Může to však udělat program běžící s právy roota. Proto má program su nastavený SUID bit a patří uživateli root'. Po zadání správného hesla je spuštěn nový shell, který je nastaven na nová oprávnění.

Poznámka: SUID bit neznamená, že program poběží s právy uživatele root. Patří-li program jinému uživateli, bude po spuštění běžet s právy tohoto uživatele. Nejběžnější je však tento způsob při poskytování administrátorských oprávnění. Proto musí být každý program se SUID bitem naprogramován s maximální obezřetností, aby neumožnil provést nějakou neoprávněnou činnost.

SGID (setgid)[editovat | editovat zdroj]

Program s nastaveným SGID bitem se chová po spuštění podobně, jako u SUID bitu. Nepřebírá ale oprávnění majitele souboru, nýbrž oprávnění skupiny, které daný soubor s programem na disku patří. Při aplikaci SGID bitu na adresář patří všechny nově vytvořené soubory a adresáře do skupiny, která je shodná s nadřízeným adresářem (který má nastaven zmíněný SGID bit). Bez nastaveného SGID bitu patří nově vytvořené adresáře a soubory primární skupině uživatele (viz výše).

Skóre ve hře
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ápisy 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.
Skupinový projekt
Uživatelé, kteří pracují na společném projektu, patří do společné skupiny project a obvykle nemají tuto skupinu nastavenou jako primární (nebo si ji zapomenou před každou prací na projektu pomocí příkazu newgrp změnit). Vytvoří-li ve společném adresáři, kam mají na základě členství ve skupině project přístup, nový soubor nebo adresář, bude patřit jiné skupině. Ani při nastavení umask na hodnotu zajišťující skupině zápis tak nebudou kolegové moci soubory upravovat nebo soubory v nových adresářích mazat a přejmenovávat. Přidělit oprávnění všem není nikdy vhodné. Proto je na kořenový adresář projektu, který patří skupině project nastaven SGID bit. Nové soubory a adresáře tak automaticky patří skupině project a nové podadresáře mají nastaven SGID bit.

Sticky bit[editovat | editovat zdroj]

Pokud má uživatel do adresáře právo zápisu, může v tomto adresáři i mazat. Nastavíme-li v adresáři sticky bit, bude uživatel smět smazat jen své vlastní soubory nebo adresáře. Ve starších verzích unixových systémů tento příznak na souborech sloužil k tomu, aby kód ukončeného programu zůstal ve swapu. Tímto způsobem bylo dosaženo rychlejšího startu často používaných programů. V dnešních systémech není sticky bit na souborech již delší dobu podporován, protože vlivem používání virtuální paměti a stránkování ztratil pro soubory význam.

Adresář /tmp
Do adresáře /tmp mají všichni uživatelé v systému právo zápisu a odkládají si tam dočasné soubory (zejména to dělají různé programy). Pokud mají právo zápisu, mohou v adresáři i přejmenovávat a mazat soubory i adresáře, což by vedlo k tomu, že by si uživatelé mohli navzájem škodit. Nastavíme-li na tento adresář sticky bit a uživatelé budou vytvářet své soubory a adresáře s adekvátními oprávněními, bude problém vyřešen.

Typy souborů[editovat | editovat zdroj]

Před znaky přístupových práv je vidět pomlčka, popřípadě další písmeno, které znamená typ daného souboru, jak je zobrazeno v následující tabulce.

Typ souboru Přiřazený znak Význam (anglicky)
Běžný soubor
Adresář d directory
Odkaz l link
Pojmenovaná roura p pipe
Socket s socket
Soubor blokového zařízení b block file
Soubor znakového zařízení c character file

Související články[editovat | editovat zdroj]