Es ist daher üblich, die Rechte auch als Zahlenwert anzugeben, so bedeutet der Trippel 761, dass der Owner alle Rechte hat (Lesen, Schreiben, Ausführen = 4+2+1), die Gruppe nur Schreiben und Lesen darf (4+2) und der Rest darf die Datei immerhin ausführen (1)
(Sonderfälle wie Groupid (s) und Sticky bit (t) lassen wir mal außen vor und betrachten diese nicht weiter.)
Dies Rechte konnte man mit chmod für eine Datei oder ein Verzeichnis bearbeiten und chmod versteht dabei sowohl die oktale Schreibweise, als auch die explizite Schreibweise mit den Buchstabenkürzeln (ugo = User/Group/Other, rwx = Read/Write/eXecute).
chrisbra t41:/floppy % ls -ld daten drwxr-x--x 2 chrisbra users 1024 Apr 30 13:10 daten
Hier existiert das Verzeichnis daten, das dem User chrisbra und der Gruppe users gehört. Der User chrisbra hat dabei die Rechte Lesen, Schreiben und Ausführen in diesem Verzeichnis (Ausführen bedeutet bei Verzeichnissen im Übrigen Betreten, während Lesen bei Verzeichnissen bedeutet, dass man sich den Inhalt des Verzeichnisses anzeigen lassen kann), alle Benutzer, die der Gruppe Users angehören dürfen immerhin den Inhalt lesen und das Verzeichnis betreten (aber z.B. keine Dateien in diesem Verzeichnis anlegen) und alle User, die weder der Eigentümer noch der Gruppe users angehören, dürfen immerhin noch das Verzeichnis betreten.
Bildlich gesprochen sieht das so aus:
+----------------------------------+ | TYP | Name | Recht | +----------------------------------+ |Besitzer | (u)ser | rwx | |Besitzer-Gruppe | (g)roup | r-x | |Rest | (o)ther | --x | +----------------------------------+
Access Controll Lists (ACL) erweitern dieses Konzept grundlegend und wurden durch die POSIX spezifiziert (wenn auch nur per Draft in IEEE POSIX 1003.1e draft 17) und erlauben eine flexiblere und fein granularere Steuerung. ACLs müssen vom Dateisystem unterstützt werden (aber jedes halbwegs moderne Dateisystem sollte eine Unterstüzung dafür eingebaut haben) und das Dateisystem muß dann mit der Option acl eingehänt werden. Bei ACLs sprechen wir im Falle der oben erwähnten Standard-Rechte von minimalen ACLs, denn das sind die ACL-Einträge, die immer vorhanden sind. Zusätzlich gibt es aber die Möglichkeit, noch extra Einträge anzugeben. Dafür gibt es die Befehle setfacl (zum Manipulieren der Rechte) und getfacl (zum Auslesen der Rechte).
Dabei besteht die Möglichkeit sowohl zusätzliche User Rechte zu vergeben als auch zusätzliche Gruppen Rechte. Man spricht dabei von benannten Usern bzw. Gruppen während die traditionellen Typen User, Group, Other auch als Basis User, Basis Group und Basis Other bezeichnet werden.
Der User cb soll jetzt noch die Rechte Lesen, Schreiben und Ausführen erhalten:
chrisbra t41:/floppy % setfacl -m user:cb:rwx daten chrisbra t41:/floppy % ls -l drwxrwx--x+ 2 chrisbra users 1024 Apr 30 13:10 daten
Man erkennt an dem + dass dieses Verzeichnis zusätzliche ACLs enthält und die können jetzt mit getfacl angesehen werden:
chrisbra t41:/floppy % getfacl daten # file: daten # owner: chrisbra # group: users user::rwx user:cb:rwx group::r-x mask::rwx other::--x
Es existieren jetzt neben den oben erwähnten minimalen Einträgen User, Group und Other noch 2 zusätzliche Einträge: Ein Eintrag für den neuen User cb und ein Eintrag der Mask genannt wird. Vereinfacht gesprochen gibt die Mask an, welche Rechte maximal gelten dürfen und sie beeinflußt außer dem Basis User und Basis Other alle anderen vergebenen ACLs. Die Rechte des jeweiligen Users und der Mask werden dabei Und-Verknüpft und man erhält die effektiven Rechte.
+-------------------------------------------------------+ | TYP | Name | Recht | Maske | eff. Recht | +-------------------------------------------------------+ |Besitzer | (u)ser | rwx | Nein | rwx | |Besitzer-Gruppe | (g)roup | r-x | Ja | r-x | |Rest | (o)ther | --x | Nein | --x | |Benutzer cb | user:cb | rwx | Ja | rwx | |Maske | mask | rwx | ---- | --- | +-------------------------------------------------------+
Die 4. Spalte gibt hier an, welche ACLs die Maske beeinflußt und die 5. Spalte zeigt die effektiv gültigen Rechte an, die sich aus der Verknüpfung von Maske und einzelner ACL ergeben. Zurück zur Ausgabe des ls -l Befehls von oben. Wir wissen nun, dass das + anzeigt, das diese Datei bzw. dieses Verzeichnis zusätzliche ACLs enthält. Es gibt jedoch eine weitere Besonderheit. Das zweite Trippel gibt nicht mehr die Rechte der Basis Gruppe an, sondern ist die Angabe der Mask. Dies ermöglicht sozusagen eine etwas optimistische Sicht auf die maximal möglichen Rechte, die außerhalb des Besitzers und der restlichen Benutzer möglich sind und wird aus Kompatibilitätsgründen für alte Programme - die keine ACLs kennen -gemacht. Das bedeutet auch, dass chmod g=rx jetzt explizit die Maske modifiziert und nicht mehr die Rechte der Default Gruppe!
Besitzer
|
| Maske
| |
| | Rest
| | |
drwxrwx--x+ 2 chrisbra users 1024 Apr 30 13:10 daten
|
ACL vorhanden
Welchen Einfluß hat nun die Mask? Oben hat ja bereits der Benutzer cb zusätzliche Rechte auf das Verzeichnis erhalten. Setzen wir nun kurz die Maske auf einen anderen Wert. Der Einfachheit halber nehmen wir gleich chmod:
chrisbra t41:/floppy % chmod g=rx daten chrisbra t41:/floppy % ls -l drwxr-x--x+ 2 chrisbra users 1024 Apr 30 13:10 daten chrisbra t41:/floppy % getfacl daten # file: daten # owner: chrisbra # group: users user::rwx user:cb:rwx #effective:r-x group::r-x mask::r-x other::--x chrisbra t41:/floppy % su cb -c 'touch daten/foobar' Password: touch: cannot touch `daten/foobar': Permission denied zsh: exit 1 su cb -c 'touch daten/foobar'
Wie man sieht, haben sich die Rechte jetzt etwas verändert. Obwohl der Benutzer cb noch die expliziten Rechte Lesen, Schreiben und Ausführen (rwx) hat, schlägt hier die Mask zu und verringert die Rechte auf effektiv nur Lesen und Ausführen/Betreten. Und wie man sieht, darf der Benutzer auch tatsächlich keine Dateien anlegen.
Die Maske wird normalerweise bei jedem Eintrag angepasst bzw neu berechnet. Mit einem entsprechenden Schalter kann man das aber auch verhindern. Setzt man die Maske neu, reduziert sie auch wieder alle Rechte für die sie gilt.
+-------------------------------------------------------+ | TYP | Name | Recht | Maske | eff. Recht | +-------------------------------------------------------+ |Besitzer | (u)ser | rwx | Nein | rwx | |Besitzer-Gruppe | (g)roup | r-x | Ja | r-x | |Rest | (o)ther | --x | Nein | --x | |Benutzer cb | user:cb | rwx | Ja | r-x | |Maske | mask | r-x | ---- | --- | +-------------------------------------------------------+
Um das Ganze weiter zu verkomplizieren gibt es noch einen weiteren ACL Typ, nämlich die Default ACL während wir bisher nur Access ACLs betrachtet haben. Diese default ACL gilt nur für Verzeichnisse und man definiert damit, welche Rechte neu angelegte Dateien/Verzeichnisse innerhalb dieses Verzeichnisses Daten erben. Dies bedeutet auch, dass die umask keine Rolle spielt, wenn eine Default ACL existiert. Default ACLs haben keinerlei Einfluß darauf, wer auf eine Objekt zugreifen kann. Das definiert sich allein durch die Access ACLs. Ein Beispiel:
chrisbra t41:/floppy % setfacl -m d:u:cb:r daten chrisbra t41:/floppy % ls -l total 14 drwxr-x--x+ 2 chrisbra users 1024 Apr 30 13:10 daten chrisbra t41:/floppy % getfacl daten # file: daten # owner: chrisbra # group: users user::rwx user:cb:rwx #effective:r-x group::r-x mask::r-x other::--x default:user::rwx default:user:cb:r-- default:group::r-x default:mask::r-x default:other::--x
Wie man sieht, wurden zusätzlich zu dem spezifizierten expliziten Default ACL-Eintrag auch die Einträge für den Basis User, die Basis Group und die Mask aus der Access ACL in die neue Default ACL eingetragen.
chrisbra t41:/floppy % touch daten/wichtig chrisbra t41:/floppy [1525]% getfacl daten/wichtig # file: daten/wichtig # owner: chrisbra # group: chrisbra user::rw- user:cb:r-- group::r-x #effective:r-- mask::r-- other::---
Wichtig, wenn die Default ACLs geändert werden, wirken sie sich nur auf neu angelegte Dateien und Verzeichnisse aus!
Ich bin jetzt mit Absicht nicht auf die Syntax der Befehle getfacl und setfacl eingegangen, sondern wollte nur das Prinzip verdeutlichen. Ich verweise dazu mal auf die die Manpages und den Linkdump, denn dort werden auch die Parameter und die Syntax ausführlich erklärt.
Linkdump:
http://www.suse.de/~agruen/acl/linux-acls/online/
http://www.vanemery.com/Linux/ACL/linux-acl.html
http://www.ostc.de/howtos/unix-acl-HOWTO.pdf
Update, 01.05.2010: Artikel leicht überarbeitet.

