Právě jsem narazil na něco neočekávaného (pro mě) ohledně oprávnění k souborům v Linuxu (Arch Linux). V zásadě mám:
userX
vgroupX
fileX userX:groupX ---rwx----
Co mě mate:Nemohu provést žádnou akci (rwx
) na fileX
. Je to správně? Může prosím někdo potvrdit, že jde skutečně o očekávané chování?
Jediné akce, které mohu provést, jsou mv
a rm
protože mám oprávnění k zápisu do nadřazeného adresáře.
Věc se má tak, že jsem si vždy myslel, že se tato oprávnění vzájemně zhroutí, počínaje tím nejobecnějším (ostatní -> skupina -> uživatel). Jinými slovy, pokud o=rwx
koho zajímá, jaká jsou oprávnění pro skupinu a uživatele?
Zřejmě to tak není, ale nedává mi to moc smysl; zdá se to kontraintuitivní. Jediná věc, v níž se tento přístup zdá být užitečný, je snadné vyloučení velmi specifické osoby / skupiny, což se nezdá jako chytrý způsob, jak na to jít (imho). Kromě toho by vlastník (a skupina?) měl mít možnost chmod
stejně jo? Nějaké myšlenky na tuto záležitost?
Přijatá odpověď:
Věc se má tak, že jsem si vždy myslel, že se tato oprávnění navzájem hroutí, počínaje tím nejobecnějším (ostatní -> skupina -> uživatel).
Pokud by tomu tak bylo, pak by „jiná“ oprávnění platila pro všechny.
Jinými slovy, pokud o=rwx, koho zajímá, jaká jsou oprávnění pro skupinu a uživatele?
To se liší od vaší předchozí věty. Zde naznačujete, že oprávnění jsou spojena společně, např. že uživatel X má oprávnění ke čtení, pokud uživatel X vlastní soubor a soubor je čitelný pro uživatele, nebo pokud skupina, do které uživatel X patří, vlastní soubor a soubor je čitelný pro skupiny, nebo pokud je soubor čitelný pro jiné uživatele. Ale takhle to nefunguje. Ve skutečnosti o=rwx
znamená, že rwx
oprávnění se vztahují na ostatní, ale neříká nic o entitách, které nejsou jiné.
Za prvé, nezáleží přímo na tom, do kterých skupin uživatel patří. Jádro nemá představu o uživatelích patřících do skupin. To, co jádro udržuje, je pro každý proces uživatelské ID (efektivní UID) a seznam skupinových ID (efektivní GID a doplňkové GID). Skupiny jsou určeny v době přihlášení, procesem přihlášení – je to proces přihlášení, který čte databázi skupin (např. /etc/group
). ID uživatelů a skupin dědí podřízené procesy¹.
Když se proces pokusí otevřít soubor s tradičními unixovými oprávněními:
- Pokud je uživatel vlastnící soubor efektivním UID procesu, použijí se bity uživatelských oprávnění.
- Jinak, pokud je skupina vlastnící soubor efektivním GID procesu nebo jedním z doplňkových skupinových ID procesu, použijí se bity skupinových oprávnění.
- V opačném případě se použijí ostatní bity oprávnění.
Vždy se používá pouze jedna sada bitů rwx. Uživatel má přednost před skupinou, která má přednost před ostatními. Pokud existují seznamy řízení přístupu, je výše popsaný algoritmus zobecněný:
- Pokud soubor obsahuje ACL pro efektivní UID procesu, použije se k určení, zda je přístup udělen.
- Jinak, pokud je v souboru ACL pro efektivní GID procesu nebo jedno z doplňkových skupinových ID procesu, použijí se bity skupinových oprávnění.
- V opačném případě se použijí ostatní bity oprávnění.
Tedy -rw----r-- alice interns
označuje soubor, který může číst a zapisovat Alice a který mohou číst všichni ostatní uživatelé kromě stážistů. Soubor s oprávněními a vlastnictvím ----rwx--- alice interns
je přístupná pouze stážistům kromě Alice (ať už je stážistkou nebo ne). Protože Alice může volat chmod
pro změnu oprávnění to neposkytuje žádné zabezpečení; je to okrajový případ. Na systémech s ACL umožňuje zobecněný mechanismus odebrat oprávnění konkrétním uživatelům nebo konkrétním skupinám, což je někdy užitečné.
Použití jedné sady bitů, místo toho, aby byly všechny bity pro každou akci (čtení, zápis, provádění) zahrnuty, má několik výhod:
- Má užitečný účinek v tom, že umožňuje odebrání oprávnění množině uživatelů nebo skupin na systémech s ACL. Na systémech bez ACL lze oprávnění odebrat jedné skupině.
- Je to jednodušší na implementaci:zkontrolujte jednu sadu bitů namísto kombinování několika sad bitů dohromady.
- Je jednodušší analyzovat oprávnění souboru, protože je potřeba méně operací.
¹ Mohou se změnit, když je spuštěn proces setuid nebo setgid. To nesouvisí s aktuálním problémem.