Access Control Lists (ACL) im Dateisystem

(2168 Worte insgesamt im Text)
(12651 mal aufgerufen)  Druckerfreundliche Ansicht [1]

Letzte Änderung: 11.10.2005

Inhalt


Was sind Access Control Lists?

In der Unixwelt versteht man unter Access Control Lists eine Erweiterung der "normalen" Zugriffssteuerung auf Ebene des Benutzer-Gruppe-Welt Modells. Bei Access Control Lists lassen sich Zugriffsrechte spezifisch für einzelne Benutzer zuteilen oder verbieten.

Was bedeudet das genau?

Fangen wir zunächst mit einem Beispiel an, welches den Sinn von ACLs verdeutlichen soll:

Im Schulnetz soll eine Übersicht bereitgestellt werden, welche Aufgaben zur Vorbereitung der Abiturfeier von wem erfüllt werden und wie der Stand der Realisierung ist. Der Schülersprecher soll die Übersicht bearbeiten können, die Schüler des Abiturjahrgangs diese Liste lesen, sonst keiner.

Dieser Fall kann mit den normalen Unix-Rechten einfach realisiert werden. Jedes Unix-System bietet für solche Fälle schon seit jeher die "klassischen" Zugriffsregeln für den Besitzer des Objekts (der Datei, dem Ordner, etc.), die Gruppe und Sonstige. Dabei gibt es für jedes Objekt noch Zugriffsrechte, die für den Eigentümer, die Gruppe und alle anderen Benutzer auf dem System separat gesetzt werden.
AbkürzungWertZugriffsart
rread (lesen, kopieren)Lesen oder Kopieren des Dateiinhalts
wwrite (schreiben, löschen)Schreiben oder ändern von Dateiinhalten. Das schließt auch das Löschen der kompletten Datei/ des Ordners mit ein.
xexecute (ausführen, hineinwechseln)Das Ausführen von Programmen (Linux kennt keine Endungen wie *.exe oder *.bat) oder das Wechseln in einen Ordner.

Arbeitet man mit einer Datei, prüft Linux jedesmal, wer z.B. auf ein gestartetes Programm oder eine Datei oder einen Ordner zugreifen darf. Wichtig ist dabei, dass die benötigten Zugriffsrechte vorhanden sind.

Zurück zu unserem Beispiel: auch der Schülersprecher muss sich auf die Prüfungen vorbereiten und ist deswegen nicht immer erreichbar und soll demzufolge von seinem Stellvertreter unterstützt werden.

Jetzt sieht es mit den Unix-Rechten schlecht aus: zwei Benutzer sollen schreiben dürfen, die Schüler des Abiturjahrgangs lesen und alle anderen dürfen nichts. Was nun?

Spielen wir die möglichen Lösungen durch:
Genau jetzt kommen die POSIX Access Control Lists (ACL) ins Spiel: Access Control Lists sind eine Erweiterung des traditionellen UNIX-Berechtigungsschemas. Es können damit zusätzlich zu den Berechtigungen für den Besitzer, die Besitzergruppe und für Andere Berechtigungen für weitere Benutzer und Gruppen angegeben werden. Ausserdem kann definiert werden, welche Berechtigungen neu erzeugte Dateien erhalten sollen.

Anwendung von ACLs

Grundvoraussetzungen

Um ACLs nutzen zu können, muss sowohl das Dateisystem als auch der Kernel ACLs unterstützen. Zusätzlich müssen die fileutils gepatcht und ACL-Tools installiert werden. All dies ist nicht gerade einfach zu bewerkstelligen und sollte den jeweiligen Distributoren vorbehalten bleiben, die dies i.A. aber in ihren derzeitigen Versionen schon gemacht haben.

Bei den unter Linux oft verwendeten Dateisystemen reiserfs, ext2 und ext3 müssen die ACLs als Option beim Mounten des Dateisystems mit angegeben werden. Dies kann dann z.B. in der Datei /etc/fstab so aussehen:

/dev/hda6 /home reiserfs acl,defaults 1 2

Wichtig: ist ein Dateisystem nicht mit eingeschalteten ACLs gemountet und kopieren Sie auf dieses Dateisystem Dateien von einem Dateisystem mit ACLs, dann werden die ACLs "gelöscht", d.h. auf dem Dateisystem ohne ACLs wird die "default-Mask" für die Gruppe gesetzt und zusätzliche ACLs entfallen!

Wenn Sie also Dateien von einer Partition mit ACLs auf eine andere kopieren oder verschieben möchten, dann sollte die andere Partition unbedingt auch mit ACL-Support gemountet sein!

Überprüfen können Sie dies (auch als normaler Nutzer) mit dem Befehl:
mount

Dies sollte eine Ausgabe wie diese hier ergeben:

lars@mypc:~> mount
/dev/hda6 on /home type reiserfs (rw,acl)
/dev/hdb1 on /backup type ext3 (rw,acl)

Tip: root kann ein schon eingehängtes Verzeichnis temporär schnell mit ACLs neu mounten, indem er den Befehl mount -o remount,acl /home eingibt.

Das ACLs vorhanden sind, können Sie mit dem Befehl:
ls -l
erkennen. Dieser sollte folgende Ausgabe zeigen, wenn zusätzlich zu den normalen Rechten auch ACLs bei einer Datei oder Verzeichnis vorhanden sind:
drw-rw----+ 8 lars users 4096 2005-07-19 14:57 test

Beachten Sie das "+" bei den normalen Dateirechten! Hier sind also noch weitere Rechte für die Datei test gesetzt, die der Befehl ls nicht anzeigt.

Die Befehle getfacl und setfacl

Um sich die erweiterten Rechte der Datei test anzeigen zu lassen, kommt ein spezieller Befehl zum Einsatz: getfacl.

Für das Setzen, Ändern und Löschen von ACLs kommt der Befehl setfacl zum Einsatz. Das waren dann auch schon alle Befehle auf der Kommandozeile.

getfacl

Wie wir in unserem Beispiel gesehen haben, sind für die Datei test ACLs gesetzt - darauf hat uns das "+" ja hingewiesen. Um diese ACLs nun anzuzeigen, verwenden wir den Befehl:
getfacl test

Das erzeugt hier folgende Ausgabe:

# file: test
# owner: lars
# group: users
user::rw-
user:vertretung:rw-
group::r--
mask::rw-
other::---

Es gibt also einen Benutzer "vertretung", der hier ebenso wie der Eigentümer "lars" Lese- und Schreibrechte besitzt. Zusätzlich hat die Gruppe "users" Leserechte an dieser Datei. Wenn wir uns an die Ausgangslage erinnern, sind hier also alle Anforderungen erfüllt.

Stellt sich die Frage, was das "mask:: rw-" zu bedeuten hat. Mit dieser Maske werden die Rechte für alle zusätzlich eingetragenen Nutzer global geregelt. Nehmen wir einmal an, dass ich temporär allen Nutzern die Lese- und Schreibrechte für die Datei entziehen möchte. Anstatt jetzt jedem Nutzer einzeln diese Rechte zu entziehen und später wieder bei jedem Einzelnen neu zu setzen, verändere ich einfach die "mask" und schon habe ich das was ich will!

Das Ergebnis sollte dann so aussehen:

# file: test
# owner: lars
# group: users
user::rw-
user:vertretung:rw- #effective:---
group::r-- #effective:---
mask::---
other::---

Diese Ausgabe von getfacl test weißt mich also darauf hin, dass hier aufgrund der "default-mask" alle anderen Benutzer und Gruppen zur Zeit keinen Zugriff haben (#effective: ---) - obwohl Sie von den eigentlichen ACLs her Lese- (group::r--) bzw. sogar Schreibrecht (user:vertretung:rw-) hätten!

Wenn ich die "mask" auf "r--" setze, bekämen also alle ACL-Nutzer Lesezugriff auf die Datei - auch wenn der Nutzer vertretung eigentlich zusätzliche Schreibrechte hätte. Die Ausgabe des Befehls ls -l sähe in diesem Fall übrigens wie folgt aus:

drw-r-----+ 8 lars users 4096 2005-07-19 14:57 test

Also nochmal: ist bei der Ausgabe von ls -l ein "+" bei einer Datei oder einem Verzeichnis zu sehen, dann stellt das zweite Rechte-Trippel (hier: r--) die "default-mask" dar. Um mehr �ber diese Zus�tzlichen Rechte zu erfahren muss man den Befehl getfacl nutzen.

setfacl

Für das Setzen, Löschen und Ändern von ACLs wird der Befehl setfacl genutzt. Wenn man ACLs setzen oder Ändern will, muss setfacl mit dem Parameter -m aufgerufen werden (-m steht hier für "modify").

ACL setzen oder Ändern

Nach dem -m muss man setfacl noch sagen, für wen eine ACL gesetzt oder geändert werden soll:

Setzt man die ACL für einen Benutzer oder eine Gruppe, dann muss man - durch ":" getrennt - noch den Namen des Benutzers oder der Gruppe angeben.

Wieder durch ":" getrennt werden anschließend die Rechte aufgelistet. Hier verwendet man die geläufigen Kürzel rwx- für Lesen ("r"), Schreiben ("w"), Ausführen ("x") oder Nicht ("-").

Was fehlt noch? Richtig: die Datei oder das Verzeichnis, für die diese ACLs gesetzt werden.

Ein kompletter Befehl zum Hinzufügen des Benutzers vertretung mit Lese- und Schreibrechten an der Datei test lautet also:
setfacl -m -u:vertretung:rw- test

Das kann man sogar lesen: "Setze ACL:" (setfacl) "modifiziere" (-m) "für Benutzer:" (u:) "vertretung" (vertretung) "auf" (:) "Lesen und Schreiben" (rw-) "Datei test" (test).

Um die "default-mask" zu ändern, sieht der Befehl wie folgt aus:
setfacl -m m::--- test

Zu beachten: wenn man also Standardwerte setzen will, dann läßt man den Bereich zwischen den "::" leer. So kann man wie hier gezeigt die "default-mask" oder die Rechte für "Andere" ändern, ohne gleich deren Namen zwischen die "::" schreiben zu müssen. Genauso klappt das auch, wenn man:
setfacl -m u::--- test

setzt. Hier wird der Eigentümer der Datei genommen - bei setfacl -m g::--- test wäre es die Hauptgruppe.

ACL löschen

Um einen zusätzlichen Nutzer oder eine Gruppe wieder aus diesen ACL-Einträgen zu löschen, verwendet man die Option -x. Wenn wir also den Nutzer vertretung die ACL entziehen möchten, lautet der Befehl:
setfacl -x u:vertretung test

Da wir die ACL ja löschen wollen, brauchen wir hier keine dedizierten Angaben zu den Rechten machen. Die spezielle ACL für den Nutzer vertretung wird einfach gelöscht.

ACLs auf neue Dateien und Verzeichnisse vererben

Bis jetzt wurden nur Dateien (und Verzeichnisse) bearbeitet, die sich schon im Verzeichnis befanden. Für alle neuen Dateien gilt diese Rechtevergabe nicht.

Aus diesem Grund gibt es "Default-Rechte". Damit kann man Rechte definieren, die eine Datei, welche erst noch angelegt wird, erhalten soll.

Wieder kommt das Kommando setfacl zum Einsatz. Da die "Default-Rechte" erst ab einem bestimmten exsitierenden Verzeichnis gelten, muss dieses Ur-Verzeichnis modifiziert werden. Also ist die Option -m auf ein Verzeichnis anzuwenden.

Um setfacl mitzuteilen, dass jetzt ein "Default-Recht" gesetzt wird, kommt die Option d zum Einsatz. Um also dem Nutzer vertretung immer auch Schreibrechte auf neue Dateien und Unterverzeichnisse im Verzeichnis /home/lars/admin zu geben, wendet man folgenden Befehl an:
setfacl -m d:u:vertretung:rw- /home/lars/admin

Soll eine zusätzliche Gruppe per default z.B. Leserechte bekommen, dann sähe der entsprechende Befehl so aus:
setfacl -m d:g:abi03:r-- /home/lars/admin

Mehrere ACLs auf einmal setzen

Wenn man z.B. mehreren Benutzern oder Gruppen zusätzlich ACLs geben, wäre es ziemlich mühsam, wenn man für jeden einzelnen Nutzer oder Gruppe den Befehl setfacl aufrufen müßte. Hier kann man einfach durch Komma getrennt die ACLs für die Benutzer bzw. Gruppen angeben. Ein Beispiel:
setfacl -m d:u:vertretung:rw-, d:g:abi03:r-- /home/lars/admin

Damit fassen wir die letzten beiden Beispiele zusammen.

Backup und Restore von ACLs

Wer auf Nummer sicher gehen möchte und/ oder einmal gesetzte ACLs (über deren Bedeutung man sich stundenlang den Kopf zerbrochen hat) auch auf anderen Rechner oder in anderen Verzeichnissen anwenden möchte, der wird sich über die schon "eingebauten" Tools freuen.

Nehmen wir einmal an, Sie möchten ein Backup sämtlicher ACLs im Homeverzeichnis durchführen (evtl. weil Sie die Partition aus einem bestimmten Grund kurzfristig ohne ACL-Support mounten möchten). Dann können Sie mit diesem Einzeiler sämtliche gesetzten ACLs unterhalb von /home sichern:

getfacl -R /home > /root/backup_home_ACLs.txt

In der Datei /root/backup_home_ACLs.txt finden Sie anschließend für jede Datei und jedes Verzeichnis die gesetzten ACLs.

Wollen Sie zu einem späteren Zeitpunkt die ACLs wieder herstellen, geben Sie einfach:

setfacl --restore=/root/backup_home_ACLs.txt

Damit werden die ACLs wieder hergestellt.

Wenn Sie einmal komplizierte ACLs für eine Datei oder ein Verzeichnis gesetzt haben, sichern Sie diese mit dem Befehl:

getfacl dateiname > acl_vorlage.txt

Wenn Sie genau diese ACLs später auch für eine andere Datei oder ein Verzeichnis anwenden wollen, nutzen Sie einfach die erzeugte Vorlagendatei:

echo acl_vorlage.txt | setfacl --set-file=- neuedatei

Damit werden der neuedatei die ACLs zugewiesen, die in der Datei acl_vorlage.txt gespeichert sind. Mit dem Parameter --set-file=- erwartet setfacl die ACL-Eintrage von der Standardeingabe - und genau dorthin "pipen" wir mit echo die Ausgabe der Datei acl_vorlage.txt.

ACLs unter Windows nutzen

Dank Samba [11] kann man auch unter Windows ACLs setzen. Bedingung ist hier nur ein entpsrechender Patch für den Samba-Server, der aber inzwischen in allen Schulservern vorhanden sein sollte.

Dabei gibt es für Samba keine neuen ACLs, sondern Samba setzt nur die ACLs des Dateisystems auf Windows-Ebene um und umgekehrt. Ein Nutzer, der also unter Linux ACLs für eine Datei oder ein Verzeichnis gesetzt hat, der "sieht" diese ACLs auch unter Windows in den erweiterten Eigenschaften und kann Sie dort wiederum bearbeiten.

Für den Benutzer sind die ACLs also völlig transparent - egal, ob er unter Windows oder Linux arbeitet. Da das neue Mac OS X ebenfalls über Samba auf den Server zugreift, können damit natürlich auch ACLs gesetzt und gelesen werden.

In eigener Sache

Zu diesem Artikel inspirierten mich verschieden Artikel zu diesem Thema im Web: Vielen Dank and die anderen Autoren!



  

[ zurück zu Linux allgemein [16] | Index [17] ]

Kommentare

Einen Kommentar hinzufügen


Links
  [1] http://www.linux-schulserver.de/index.php?name=Sections&req=viewarticle&artid=38&allpages=1&theme=Printer
  [2] http://www.linux-schulserver.de/Sections-article38-p2.phtml
  [3] http://www.linux-schulserver.de/Sections-article38-p2.phtml
  [4] http://www.linux-schulserver.de/Sections-article38-p3.phtml
  [5] http://www.linux-schulserver.de/Sections-article38-p3.phtml
  [6] http://www.linux-schulserver.de/Sections-article38-p4.phtml
  [7] http://www.linux-schulserver.de/Sections-article38-p4.phtml#getfacl
  [8] http://www.linux-schulserver.de/Sections-article38-p4.phtml#setfacl
  [9] http://www.linux-schulserver.de/Sections-article38-p4.phtml#backup
  [10] http://www.linux-schulserver.de/Sections-article38-p5.phtml
  [11] http://www.samba.org/
  [12] http://arktur.schul-netz.de/wiki/index.php/Administratorhandbuch:ACL
  [13] http://www.linux-user.de/ausgabe/2003/12/066-acl/
  [14] http://www.kfa-juelich.de/zam/docs/tki/tki_html/t0314/t0314.html
  [15] http://www.pl-forum.de/t_system/print/ext2_acl.html
  [16] http://www.linux-schulserver.de/index.php?name=Sections&req=listarticles&secid=5
  [17] http://www.linux-schulserver.de/index.php?name=Sections