DENY není vždy nejsilnější

Deny není žádný rváč, ani můj sparing partner v soutěži o hrdinu na benčpresu. Ale i tak se dnes zaměříme na rozbití jednoho mýtu, který prochází celou historií Windows. Jedná se o záležitost týkající se objektových oprávnění (permissions - což je něco jiného než uživatelská práva, rights). Allow ale hlavně Deny. Nejčastější použití je na NTFS. Prohlížíte si je obvykle přes záložku Security. Ale můžete to vidět i v registrech, na tiskárnách, v Active Directory LDAPu, a všude možně jinde.

Na typické zabezpečení třeba root disku se můžete podívat na následujícím obrázku. Upozorňuji, že se nebudeme vůbec dívat na tu základní tabulku Security, ale pokud tomu chcete přijít na kloub, musíte se dívat pomocí tlačítka Advanced právě na tabulku Advanced Security Settings:

  

Permissions (oprávnění) umožňují zadat Allow (povolit), nebo Deny (odepřít) položky do seznamu nazvaného access control list (ACL). To co vidíte na obrázku je potom šest položek nazvaných access control entry (ACE). V obrázku je každá Allow, takže někomu něco povoluje. Z obou obrázků by mělo být také patrné, proč je první souhrnná záložka úplně na nic. Viz. položky pro skupinu Users.

Souhrnost znamená, že nevidíte skutečnost, kterou dostanete pouze na tabulce Advanced Security Settings. Ve skutečnosti tam je pro skupinu Userspoměrně složité zabezpečení. Podívejme se na něj, ať si to trošku připomeneme.

Podstatný je sloupeček Applies to. Users tam mají read & execute pro tuto složku i pro všechny podsložky a podsoubory. Ale všimněte si, že mají také create folders. Mohou tedy v kořenu disku vytvářet složky. V kořenu disku ale nemohou do žádných souborů ani zapisovat, ani žádný soubor vytvořit. Vytvářet soubory mohou díky create files až v podsložkách. Ani jedna z těchto tří ACE položek nedovoluje skupině Userszapisovat do žádných souborů. Mohou si vytvořit služku a v ní prázdné soubory.

To by samozřejmě nemělo moc smysl, proto je tam další ACE pro skupinu (přesněji řečeno SID) CREATOR OWNER. Díky ní mají vlastníci (autoři) jednotlivých souborů nebo složek na ně full control. Proto soubory, které skupina Usersvytvoří, mohou potom jejich autoři i zapisovat.

Dědičnost

V našem předchozím případě se jednalo o explicitní ACEpoložky. Nebyly zděděné z žádného nadřazeného objektu. Podívejme se na hlubší strukturu složek. V mém případě to vypadá tak, jak je na obrázku. Celou cestu vidíte nahoře v adresním řádku:

Díváte se na vlastnosti složky Zaplaceno, která je uvnitř Faktury, která je uvnitř Dokumenty. V seznamu zabezpečení přibylo několik dalších položek. Sloupeček Inherited from zobrazuje odkud se to zdědilo. Případně, že se položka pro skupinu Klientske oddeleninezdědila a je tu explicitně nastavená až na této hlubší úrovni.

Náš článek je o Deny oprávnění (vlastně tedy odepření :-)), takže je tam i položka, která zakazuje Jitce něco special. Ono special je ve skutečnosti delete. Takže Jitka má Deny delete. Schválně chcete Jitce zabránit, aby tam cokoliv smazala, protože ona je třeba trdlo a občas někde na něco klikne :-)

Obecně se už roky tvrdí, že Denyje vždycky silnější. Z toho by plynulo, že máme jistotu, že Jitka nic nesmaže za žádných okolností. Ale ono to ve skutečnosti nikdy nebyla pravda.

Poznámka: Ignorujte fakt, že Jitka může být vlastník souboru a mohla by si tedy nejprve změnit jeho oprávnění a potom ho dostranit. Řekněme, že přistupje přes síť, takže jí nemusíme dávat full control na sdílení (share) a tak jí tahle cesta nepůjde. Ale to ona ani nepotřebuje.

Pořadí položek a jejich vyhodnocování

Podívejte se znovu na obrázek. Položky nejsou setříděné podle abecedy. Možná to vypadá jen chaoticky. Ale ono to je ve skutečnost setříděné. Klidně si klikněte na záhlaví sloupečku Principal. Dokonce se vám objeví varování, že to pořadí má opravdu smysl:

Proč? To je totiž pořadí vyhodnocování. Pořadí je primárně podle úrovně dědičnosti. Nejvyšší úroveň složek je nejvíce dole. Explicitní oprávnění jsou úplně nahoře. V každé úrovni jsou Denypoložky vždy na začátku ve svém bloku.

Ve skutečnosti se neprochází všechny položky. Požadavek na přístup propadává jednotlivými ACE položkami z hora dolů. Jako na firewallu. Jakmile ten požadavek na přístup splní nějakou položku, ať už Allow, nebo Deny, je vyřízen odpovídajícím způsobem. A to je ten kámen úrazu.

Podívejte se znovu na obrázek, kde má Jitka přiděleno Deny. Je to pouze zděděná položka. Jenže daná složka má ještě i svoji vlastní explicitní ACE položku. Ta je povolující, tedy Allow pro skupinu Klientske oddeleni.

Z toho plyne, jestliže je Jitka členem skupiny Klientske oddeleni, může si dělat co chce. Může klidně něco smazat. Její požadavky jsou totiž povoleny hned prvním ACE pravidlem a dále se už nevyhodnocují.

- Ondřej Ševeček, MVP