Schaltet man Access Control Lists (kurz ACLs, auf deutsch:Zugriffs-Kontroll-Listen) ein, kann man kontrollieren, wer was mit einer Wiki-Seite tun kann.
Inhalt
<<TableOfContents: execution failed [list index out of range] (see also the log)>>
Grundlagen
ACLs können in moin einfach durch Hinzufügen einer Steueranweisung am Anfang einer Seite realisiert werden:
#acl IrgendeinUser:read,write All:read
Sie benötigen admin-Rechte, um eine solche ACL-Zeile hinzufügen oder ändern zu können.
Das erlaubt IrgendeinUser, die Seite zu lesen und zu bearbeiten, während alle anderen Nutzer lediglich Lese-Rechte in der Seite haben (ausser man hat einige Spezial-Konfigurationen in der Konfiguration gemacht).
Syntax
Die Syntax jeder Zeile ist:
#acl [+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default]
Hier bedeutet:
User ist ein Benutzername und erteilt die zugehörige Berechtigung nur dann, wenn der Nutzername übereinstimmt.
SomeGroup ist ein Seitenname, der auf page_group_regex passt, mit Zeilen der Form " * Member" (siehe #Gruppen).
Trusted ist eine spezielle Gruppe, die alle authentifizierten Nutzer enthält (die einen Password-Login nutzen).
Known ist eine spezielle Gruppe, die alle gültigen Nutzer enthält (die einen Cookie nutzen).
All ist eine allgemeine Gruppe, die alle Nutzer enthält, sowohl bekannte als auch anonyme.
Default ist ein Eintrag, der in allen ACLs die Einträge von acl_rights_default ersetzt. (Siehe #Default).
right ist eine "Berechtigung" der Art read, write, delete, revert, admin. Nur Wörter in acl_rights_valid werden akzeptiert, alle anderen werden ignoriert. Es ist durchaus zulässig, keine Rechte zu spezifizieren, was soviel bedeutet, dass keine Rechte gewährt werden.
Mögliche Berechtigungen
Dies sind die verfügbaren Rechte, die in einer ACL benutzt werden können. DeletePage und RenamePage sind nicht erlaubt, wenn der Benutzer nicht Known ist, selbst wenn ein delete-Recht gewährt wurde.
- read
- Den angegebenen Benutzern wird Leserecht für diese Seite erteilt.
- write
- Den angegebenen Benutzern wird Schreibrecht (und damit das Editieren) der Seite erlaubt.
- delete
- Die angegebenen Benutzer dürfen die Seite und ihre Anhänge löschen.
- revert
- Die angegebenen Benutzer dürfen eine ältere Version der Seite restaurieren.
- admin
- Die angegebenen Benutzer haben Adminrechte auf dieser Seite. Das bedeutet, dass sie selbst ACL-Einstellungen ändern dürfen - inklusive dem Recht, andere zu "Admins" zu machen oder ihnen das "Admin"-Recht zu entziehen.
Verarbeitungslogik
Wenn ein Benutzer versucht, eine ACL-geschütze Seite abzurufen, werden die ACLs der Reihenfolge nach abgearbeitet. Die erste "passende" ACL sagt aus, was der Leser mit der Seite tun (oder nicht tun) darf.
Aufgrund dieses first match-Algorithmus sollte man die ACLs sortieren: Zu Beginn einzelne Usernamen, dann spezielle Gruppen, anschließend algemeinere Gruppen und zum Schluss Known und All.
Beispielsweise sagt die folgende ACL aus, dass IrgendeinUser lesend und schreibend auf die ACL-geschützte Seite zugreifen darf, dass alle Mitglieder der Gruppe IrgendeineGruppe (ausser IrgendeinUser, falls er Mitglied der Gruppe ist) zusätzlich auch Admin-Rechte haben, während alle anderen User lediglich lesen dürfen.
#acl IrgendeinUser:read,write IrgendeineGruppe:read,write,admin All:read
To make the system more flexible, there are also two modifiers: the prefixes '+' and '-'. When they are used, processing will only stop when requested right for some specific user matches the user and right(s) in the given ACL entry, but will continue if you are looking for another right (or another user). In case of '+' the right will be given, in case of '-' the right will be denied (for the stopping case).
Um das ACL-System flexibler zu gestalten, gibt es zwei Präfixe '+' und '-'. Wenn sie benutzt werden, hält die Verarbeitung nur dann an, wenn das angeforderte Recht für einen bestimmten Benutzer mit dem Benutzer und Recht in dem gegebenen ACL-Eintrag übereinstimmt, läuft aber weiter, wenn nach einem anderen Recht (oder anderen Benutzer) gesucht wird. Im Fall von '+' wird das Recht gewährt, im Fall von '-' wird das Recht verweigert.
Zum Beispiel kann die o.g. ACL auch folgendermaßen geschrieben werden:
#acl -EinUser:admin EineGruppe:read,write,admin All:read
Dieses Beispiel ist nur für EinUser besonders, denn wenn admin-Rechte für EinUser abgefragt werden, wird es verweigert werden und die Verarbeitung hält an. In allen anderen Fällen, geht die Verarbeitung weiter.
Oder auch:
#acl +All:read -EinUser:admin EineGruppe:read,write,admin
+All:read bedeutet, dass wenn irgendein Benutzer das read-Recht anfordert, es gewährt werden wird und die Verarbeitung anhält. In jedem anderen Fall, wird die Verarbeitung weiterlaufen. Wenn das admin-Recht für Benutzer EinUser abgefragt wird, wird es verweigert werden und die Verarbeitung hält an. In jedem anderen Fall, geht die Verarbeitung weiter. Letztendlich wird, wenn ein Mitglied der Gruppe EineGruppe ein Recht verlangt, es dann gewährt, wenn es hier angegeben ist und verweigert, wenn nicht. Alle anderen Benutzer haben keine Rechte, es sei denn, sie werden durch die Konfiguration gewährt.
Bitte beachten Sie, dass Sie das 2. und 3. Beispiel wohl kaum auf einer Wikiseite verwenden wollen. Derartige ACLs sind aber in den Konfigurationseinträgen des Wikis sinnvoll.
Erben von Default-Einstellungen
Manchmal ist es nützlich, jemandem Rechte zu vergeben, ohne die Default-Berechtigungen zu beeinflussen. Nehmen wir als Beispiel an, Sie hätten folgende Einträge in ihrer Konfiguration:
acl_rights_default = "TrustedGroup:read,write,delete,revert All:read" acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin"
Sie möchten einige Seiten zum Schreiben für EinUser freigeben, aber gleichzeitig das Default-Verhalten bezüglich All und der TrustedGroup beibehalten. Sie können einfach den Default-Eintrag nutzen:
#acl EinUser:read,write Default
Das fügt die Einträge von acl_rights_default exakt an der Stelle ein, wo der "Default"-Ausdruck steht. Sie haben also das gleiche geschrieben wie:
#acl EinUser:read,write TrustedGroup:read,write,delete,revert All:read
Lets look at the first example in this section: acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin"
ACLs werden in der Reihenfolge "before", dann "Seiten-ACLs/default" und dann "after" verarbeitet, von "links nach rechts".
Es fängt also links in "before" an mit AdminGroup:... - dies trifft zu, wenn der Benutzer ein Mitglied der AdminGroup ist. Wenn es zutrifft, erhält der Benutzer diese Rechte (arwdr) und die ACL-Verarbeitung hält an.
Wenn es nicht zutrifft, geht die ACL-Verarbeitung weiter mit +TrustedGroup:admin - dies trifft zu, wenn der Benutzer Mitglied der TrustedGroup ist.
Wenn es zutrifft, bekommt der Benutzer die Rechte (a) und - jetzt kommt der Unterschied wegen dem Präfix - - die ACL-Verarbeitung geht weiter! Wenn es also weitere zutreffende Einträge gibt für diesen Benutzer oder seine Gruppe oder Known: oder All:, wird der Benutzer auch diese Rechte erhalten.
Wenn es nicht zutrifft, geht die ACL-Verarbeitung weiter - mit den Seiten-ACLs (wenn es ACLs auf der Seite gibt) oder mit den default-ACLs (wenn es keine ACLs auf der Seite gibt) und zuletzt dann mit den "after"-ACLs.
Weil dies genau das gleiche ausdrückt, hat das Erben von Default-Einstellungen den Vorteil, dass alle Änderungen an Default-Einstellungen automatisch in alle ACLs übernommen werden, die mit der Default-Einstellung arbeiten.
Konfiguration
Im Folgenden die Konfigurations-Möglichkeiten, um einer Moin-Site ACLs hinzuzufügen:
Eintrag |
Default |
Beschreibung |
acl_enabled |
0 |
Ermöglicht als TRUE-Wert die Benutzung von ACLs. |
acl_rights_before |
"" |
angewendet vor (before) Seiten- oder Default-ACLs |
acl_rights_after |
"" |
angewendet nach (after) Seiten- oder Default-ACLs |
acl_rights_default |
"Trusted:read,write,delete,revert Known:read,write,delete,revert All:read,write" |
nur benutzt, wenn keine anderen ACLs für die angefragte Seite zutreffen |
acl_rights_valid |
["read", "write", "delete", "revert", "admin"] |
Dies sind die akzeptierbaren (bekannten) Berechtigungen (und dies ist der Platz, sie zu erweitern, falls nötig). |
Nun wissen Sie zwar, was es tut. Aber: was bedeutet es wirklich?
"before" bedeutet Rechte erzwingen (wegen des "first match"-Algorithmus)
"after" bedeutet Rechte nicht zu vergessen als "Notnagel" (um beispielsweise Leserecht für alle zu vergeben)
"default" bedeutet was wird gemacht, wenn für eine Seite keine ACL verwendet wird?. Es ist gleichbedeutend damit, exakt diese ACL für in jede Seite zu schreiben.
Gruppen
Benutzergruppen erleichtern es, Rechte für Gruppen von Personen zu spezifizieren.
Nur die Freunde von EinUser dürfen diese Seite lesen und editieren:
#acl EinUser:read,write EinUser/FreundesGruppe:read,write
EinUser/FreundesGruppe ist eine Seite, auf der jeder Listen-Eintrag einem Wiki-Usernamen entspricht, der zu genau dieser Gruppe gehören soll:
#acl EinUser:read,write,admin,delete,revert * JoeSmith * JoeDoe * JoeMiller
Eine Seite AdminGroup könnte eine gleichnamige Gruppe definieren und ebenfalls durch ACLs geschützt werden:
#acl AdminGroup:admin,read,write All:read * EinUser * EinWeitererUser * Dies wird momentan ignoriert. Auch jeder weitere Text, der nicht in der Liste der ersten Ebene steht, wird ignoriert.
Eine Liste der ersten Ebene ist eine mit nur einem Leerzeichen vor dem Stern (und es muss auch ein Leerzeichen hinter dem Stern sein). Folgendes wird nicht funktionieren:
* some user -- two spaces so doesn't work
Man kann konfigurieren, welche Seitennamen als Gruppenseiten betrachtet werden (z.B. für nicht-englische Wikis):
page_group_regex = '[a-z]Group$' # this is the default
Nutzungs-Beispiele
1. Eine öffentliche Community im Internet
ENGLISCH
The most important point here is to use ACLs only in cases where really needed. Wikis depend on openness of information and free editing. They use soft security to clean up bad stuff. So there is no general need for ACLs. If you use them too much, you might destroy the way wiki works.
This is why either ACLs should not be used at all (default) or, if used, the wikiconfig.py should look similar to that:
acl_rights_before = 'WikiEditorName:read,write,admin,delete,revert +AdminGroup:admin BadGuy:'
The default acl_rights_default option should be ok for you:
acl_rights_default = 'Known:read,write,delete,revert All:read,write'
A good advice is to have only a few and very trusted admins in AdminGroup (they should be very aware of how a wiki works or they would maybe accidently destroy the way the wiki works: by its openness, not by being closed and locked!).
If using AdminGroup, you should make a page called AdminGroup and use it to define some people who get admin rights.
Specifing BadGuy like shown above basically locks him out - he can't read or edit anything with that account. That makes only sense if done temporarily, otherwise you also could just delete that account. Of course, this BadGuy can also work anonymously, so this is no real protection (this is where soft security will apply).
2. Wiki as a simple CMS
If you want to use a wiki to easily create web content, but if you don't want edits by the public (but only by some webmasters), you maybe want to use that in your wikiconfig.py:
acl_rights_default = 'All:read' acl_rights_before = 'WebMaster,OtherWebMaster:read,write,admin,delete,revert'
So everyone can read, but only the Webmasters can do anything else. As long as they still work on a new page, they can put
#acl All:
on it, so nobody else will be able to see the unready page. When being finished with it, don't forget to remove that line again, so that acl_rights_default will be used.
Some page(s) could also allow public comments (like one being called PublicComments), so you give more rights on that page:
#acl All:read,write
3. Wiki on Intranet
If you want to use a wiki on your intranet and you trust your users (not doing hostile stuff like locking others out or hijacking pages) to use the admin functionality in a senseful way, you maybe want to use that:
acl_rights_default = 'Known:admin,read,write,delete,revert All:read,write' acl_rights_before = 'WikiAdmin,BigBoss:read,write,admin,delete,revert'
So everyone can read, write and change ACL rights, WikiAdmin and BigBoss are enforced to be able to do anything, known users get admin rights by acl_rights_default (so they get it as long as no other ACL is in force for a page).
Consequences:
- on a new page, the page creator can put any ACLs he wants
- on existing pages, not having ACLs yet, any known user can set up any ACLs he wants
all people (except WikiAdmin and BigBoss) can be locked out by anybody ("known") else on pages without ACLs
4. Wiki as a public company page
If you want to use a wiki as the company page, and don't want every user being able to change the company page content, you may want to use something like this:
acl_rights_default = "TrustedGroup:admin,read,write,delete,revert All:read" acl_rights_before = "AdminGroup:admin,read,write,delete,revert +TrustedGroup:admin"
This means that:
- by default known and anonymous users are only allowed to read pages
on a new page, users in TrustedGroup can put any ACLs they want
on existing pages, not having ACLs yet, any user in TrustedGroup user can set up any ACLs he wants
all people, except people in AdminGroup, can be locked out by other admins or trusted users
people in TrustedGroup get to use their admins rights on any page they're able to write, even if there are specific ACLs
5. Comments on read-only page
You can easily add a comments section to a read-only page by using a writable subpage, and allowing users to write on it. For example, you can define SomePage like this:
#acl SomeUser:read,write All:read '''Some read-only content''' ... ''' User comments ''' <<Include(SomePage/Comments)>>
And SomePage/Comments like this:
#acl All:read,write Add your comments about SomePage here.