====== Seznamy přístupových práv (ACL) ====== https://www.dokuwiki.org/acl [[:dokuwiki|DokuWiki]] - stejně jako většina wiki - je ve výchozím nastavení velmi otevřená. Každý může vytvářet, upravovat a mazat stránky. Někdy ale dává smysl omezit přístup k určitým stránkám nebo i všem. V takové chvíli přichází na řadu //Access Control List// (ACL). Tato stránka podává přehled, jak ACL v DokuWiki fungují a jak se konfigurují. ===== Konfigurace a nastavení ===== ACL lze zapnout v [[doku>installer|instalátoru]] a tam se také nastaví počáteční politika ACL. Pro ruční zapnutí ACL aktivujte volbu [[doku>config:useacl]] a vytvořte kopii ukázkových souborů ''conf/acl.auth.php.dist'' a ''conf/users.auth.php.dist''. Soubory poté přejmenujte na ''conf/acl.auth.php'' a ''conf/users.auth.php''. Příklad minimálního souboru ''conf/users.auth.php'' pro uživatele ''admin'' s heslem ''admin''. Pokud jej použijete, nezapomeňte následně heslo změnit. # login:passwordhash:Real Name:email:groups (comma[,] separated) admin:$2y$10$P5YH8uIM2uAE9snRq32yAuHMb4/XAzksFd5Cakqqtsw9BWeSsyLZq:admin:admin@admin.com:admin,user ==== Viz také ===== Existuje několik dalších konfiguračních voleb a funkcí souvisejících s autentizací, registrací uživatelů a nastavením ACL. Podrobnosti viz příslušné wiki stránky: * Konfigurační volba [[doku>config:useacl]] - zapnutí používání ACL * Konfigurační volba [[doku>config:superuser]] - nastavení superuživatelů s právy pro správu ACL * Konfigurační volba [[doku>config:defaultgroup]] - výchozí skupina, do které se přidávají noví uživatelé * [[doku>plugin:usermanager|Správce uživatelů]] - správa uživatelů * [[auth|Autentizační backendy]] - identifikace uživatelů z různých zdrojů dat * [[doku>faq:regdisable|FAQ: Jak zakázat otevřenou registraci uživatelů]] - nahrazuje $conf[openregister] :!: **VAROVÁNÍ:** Funkce ACL v DokuWiki je k dispozici již delší dobu a měla by být stabilní. Pokud však existují obavy z rizika neoprávněného přístupu k citlivým informacím ve wiki, neměla by být umístěna na počítači přístupném z internetu. ===== Omezení přístupu ===== Omezení přístupu lze vázat na [[pagename|stránky]] a [[namespaces|jmenné prostory]]. Existuje sedm oprávnění: //none//, //read//, //edit//, //create//, //upload//, //delete// a //admin//. Každá vyšší úroveň zahrnuje nižší; nejnižší je read a nejvyšší je delete. Všimněte si, že oprávnění create, upload a delete lze přiřadit pouze jmenným prostorům. Pravidla nastavená pro jmenné prostory platí jak pro mediální jmenné prostory, tak pro jmenné prostory stránek. Když DokuWiki vyhodnocuje, jaká práva má uživateli přidělit, bere v úvahu všechna pravidla, která odpovídají uživatelskému jménu nebo skupinám, jejichž je členem. Pravidlo, které určí výsledná oprávnění, se volí takto: * Pravidla, která odpovídají cíli přesněji (jsou „blíže“ namespace:page), mají přednost - říkáme tomu „specific matching“. * Pokud na stejné úrovni odpovídá více pravidel, přednost má to, které uděluje vyšší úroveň přístupu. \\ (To zároveň znamená, že na stejné úrovni nelze práva „zúžit“ protichůdným pravidlem. Pro dodatečné omezení práv viz také [[https://forum.dokuwiki.org/d/20318-reduce-privileges-by-group-in-acl/17|forum]].) Uživatelé jsou ve skupinách, které jim byly přiřazeny ve správci uživatelů (nebo v auth backendu). Existují však dvě poněkud speciální **skupiny**: * **@ALL** Každý, i nepřihlášení uživatelé, je členem skupiny ALL. Lze ji použít k nastavení výchozího omezení pro všechny a následnému „uvolnění“ práv pro vybrané uživatele. * **@user** Všichni samoregistrovaní uživatelé jsou ve výchozím nastavení členy skupiny 'user'. Použijte ji pro udělení práv „přihlášeným“ uživatelům. Název této skupiny se konfiguruje volbou [[doku>config:defaultgroup]]. Na rozdíl od „virtuální“ skupiny ALL je skupina „user“ skutečná skupina, do níž jsou (při použití plain backendu) uživatelé automaticky přidáváni. Při jiném backendu použijte skupiny, které poskytuje. Skupiny jsou interně i ve Správci ACL reprezentovány předponou ''@'' před názvem skupiny. ==== Úprava ACL ==== Pro snadné přidávání a změnu pravidel použijte [[doku>plugin:acl|Správce ACL]] dostupný z administrační nabídky. Podrobný popis rozhraní viz [[doku>plugin:acl|zde]]. Základní tři kroky pro přidání nového pravidla ACL: - v levém stromu vyberte jmenný prostor nebo stránku, kterou chcete omezit - určete, na koho se má pravidlo vztahovat * vyberte známou skupinu nebo uživatele z rozbalovací nabídky * nebo zvolte „User:“ či „Group:“ a zadejte jméno uživatele či skupiny do pole - nastavte odpovídající oprávnění Existující pravidla lze upravit nebo smazat v tabulce ve spodní části Správce ACL. conf/acl.auth.php.dist​conf/users.auth.php.dist​conf/acl.auth.php​conf/users.auth.php ==== ACL na příkladech ==== V této části vysvětlíme fungování pravidel přístupu na fiktivním příkladu tak, jak vypadá ve Správci ACL: {{:dokuwiki:aclexample.png}} Komentář k jednotlivým řádkům: - Nastaví oprávnění pro všechny v hlavním jmenném prostoru: každý může upravovat a vytvářet stránky. Upload povolen není. - Uživatel //bigboss// dostává plná práva. - Přístup do jmenného prostoru ''devel'' se omezuje. Nikdo tam nemůže nic. - No, ne tak docela - členům skupiny //devel// se zde udělují téměř plná práva. Mazání souborů povoleno není. - Uživatel //bigboss// má ale v ''devel'' plný přístup. Může i mazat nahrané soubory. - Skupina //marketing// může v ''devel'' vše číst, ale nesmí upravovat ani vytvářet stránky. - Tým devel nechce, aby šéf viděl stránku ''funstuff'' - pamatujte, že přesný shodný záznam pro stránku přebíjí oprávnění jmenného prostoru. - A nakonec má skupina //marketing// právo upravovat stránku ''devel:marketing''. (Tuto stránku ale nemohli vytvořit.) - Dále se nastaví práva pro jmenný prostor ''marketing'': všichni v //marketing// mohou nahrávat * ostatní se řídí řádkem #1, takže stále mohou vytvářet a upravovat. * Práva pro //bigboss// se dědí z řádku #2, takže může nahrávat i mazat. (Není divu, že každý chce být //bigboss//.) - Poslední řádek omezuje úvodní stránku na „pouze pro čtení“ pro všechny. I pro //bigboss//. Upravovat ji budou moci jen superuživatelé. Druhý příklad pro lepší pochopení **specific matching**: {{:dokuwiki:aclexample2.png}} Pravidla, která budou platit při přístupu na stránku ''private:bobspage'': - abby, běžný uživatel * odpovídají tři pravidla: #1, #2, #4 * nejblíže je #4 (úroveň jmenného prostoru) - má přednost * abby má oprávnění ''None'' - bob, běžný uživatel * odpovídají čtyři pravidla: #1, #2, #4, #6 * vítězí #6, protože jde o přesnou shodu * bob má oprávnění ''Delete'' - bob zapomene přihlášení a zkusí přístup * odpovídají #1 a #4 * bližší je #4 - vítězí * bez přihlášení má bob oprávnění ''None'' - charlie, zaměstnanec (staff) * odpovídá pět pravidel: #1–#5 * na úrovni jmenného prostoru odpovídají dvě; #5 dává vyšší práva, proto vítězí * charlie má oprávnění ''Delete'' Poznámka k pravidlu #5, které vypadá jako duplikát #3. Bez něj by se staff nedostal do privátního jmenného prostoru, protože by je pravidlo #4 nepustilo. ===== Zákulisní informace ===== Omezení přístupu se ukládají do souboru ''conf/acl.auth.php'', který musí být zapisovatelný webserverem, pokud chcete používat výše popsané webové rozhraní správy. Nedoporučuje se provádět ruční editace tohoto souboru - používejte raději administraci. Prázdné řádky a komentáře ve stylu shellu se ignorují. Každý řádek obsahuje tři pole oddělená bílými znaky: * Omezovaný prostředek: buď [[pagename|stránka]] nebo [[namespaces|jmenný prostor]]. Jmenný prostor je označen hvězdičkou navíc (viz příklady níže). * Název skupiny nebo uživatele. Názvy skupin mají předponu ''@''. * Úroveň oprávnění (viz níže). Existuje 7 úrovní oprávnění reprezentovaných celým číslem. Vyšší úroveň zahrnuje nižší. Pokud můžete upravovat, můžete i číst. Oprávnění //admin// s hodnotou //255// však nelze v souboru ''conf/acl.auth.php'' použít. Používá se interně při porovnání s volbou [[doku>config:superuser]]. ^ Název ^ Úroveň ^ platí pro ^ Oprávnění ^ Konstanty DokuWiki ^ | none | 0 | stránky, jmenné prostory | žádná práva - úplné zablokování | AUTH_NONE | | read | 1 | stránky, jmenné prostory | právo číst | AUTH_READ | | edit | 2 | stránky, jmenné prostory | lze upravovat existující stránky | AUTH_EDIT | | create | 4 | jmenné prostory | lze vytvářet nové stránky | AUTH_CREATE | | upload | 8 | jmenné prostory | lze nahrávat mediální soubory | AUTH_UPLOAD | | delete | 16 | jmenné prostory | lze přepisovat nebo mazat mediální soubory | AUTH_DELETE | | admin | 255 | admin pluginy | superuživatel((viz [[doku>config:superuser]])) může měnit admin nastavení | AUTH_ADMIN | Příklad nastavení odpovídající prvnímu uvedenému příkladu: * @ALL 4 * bigboss 16 devel:* @ALL 0 devel:* @devel 8 devel:* bigboss 16 devel:* @marketing 1 devel:funstuff bigboss 0 devel:marketing @marketing 2 marketing:* @marketing 8 start @ALL 1 Vezměte na vědomí, že **pořadí v souboru nehraje roli**. Soubor se nejprve celý načte, poté se hledá „perfektní shoda“ pro kombinaci aktuální stránky a uživatele. Jakmile se najde, další hledání se ukončí. Pokud se nenajde, zkoumají se skupinová práva pro aktuální stránku. Pokud se stále nic nenajde, pokračuje se v nejbližším vyšším jmenném prostoru. :!: **Poznámka:** Oprávnění „delete“ ovlivňuje pouze mediální soubory. Stránky mohou mazat (a obnovovat) všichni, kdo mají alespoň právo „edit“. Kdo má „upload“ bez „delete“, může přepsat existující mediální soubory jen tehdy, je-li zapnuta volba [[doku>config:mediarevisions|media revisions]]. ==== Kódování uživatelů/skupin ==== Protože konfigurace ACL používá některé speciální znaky (např. předponu ''@'', mezery apod.), je třeba názvy uživatelů a skupin při ruční editaci kódovat, pokud obsahují určité znaky, aby nedocházelo ke kolizím. Při použití Správce ACL to řešit nemusíte - provede to automaticky. Při ruční editaci je nutné názvy kódovat. Interně se používá metoda [[xref>auth_nameencode()]]. Kódování používá URL kódování pro všechny nealfanumerické ASCII znaky (speciální znaky v dolní 128b sadě). UTF‑8 vícebajtové znaky se nekódují. Příklad: ''Herbert.Müller'' se stane ''Herbert%2eMüller'' ==== Zástupné znaky pro uživatele ==== V ACL lze používat zástupné vzory pro uživatele a skupiny. To je užitečné na wiki s mnoha registrovanými uživateli, když chcete každému přidělit osobní jmenný prostor s výhradními právy zápisu, aniž byste museli ručně doplňovat pravidla. K tomu slouží **''%USER%''** (nahradí se aktuálním uživatelským jménem) a **''%GROUP%''** (nahradí se všemi skupinami daného uživatele). V následujícím příkladu má přihlášený uživatel plná práva (upload/delete) ve svém jmenném prostoru ''user::*'' a ostatním se přístup do jmenných prostorů pod ''user:*'' odebírá. V tomto nastavení má přihlášený uživatel přístup jen do svého vlastního jmenného prostoru a nemá přístup do uživatelských prostorů jiných (ani k zobrazení názvů prostorů). # Grant full access to logged in user's namespace user:%USER%:* %USER% 16 # Allow to browse own namespace via the index user: %USER% 1 # Allow read only access to start page located in "user" namespace user:start %USER% 1 # Disable all access to user's home namespaces not owned by logged in user # (include view namespaces via the index) user:* @user 0 # Allow members of 'group' to edit pages in the 'group' namespace. # BE CAREFUL, if you have a 'user' namespace, all members of the default group # will gain access to it since %GROUP% will be replaced literally %GROUP%:* %GROUP% 2 :!: **Poznámka:** Verze 2009-12-25c „Lemming“ má úskalí. Pokud přidáte, změníte nebo odstraníte položky ACL v administračním rozhraní, DokuWiki nahradí %USER% ve druhém poli záznamu řetězcem ''%25USER%25'' (viz [[https://bugs.dokuwiki.org/index.php?do=details&task_id=1955|bug FS#1955]]). Abyste tomu předešli, měňte oprávnění pouze ručně (editací ''conf/acl.auth.php'') nebo po každé operaci v administraci řetězec opravte, protože ''%25USER%25'' nefunguje - správné je pouze ''%USER%''. V novějších verzích je tato chyba opravena. :!: **Poznámka:** Zástupný znak se v prosinci 2008 změnil z @ na % - při upgradu ze starší verze tomu přizpůsobte nastavení ACL.