Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Mit Hilfe von Access Control Lists (kurz ACL) ist es möglich, einzelnen Nutzern (oder auch Gruppen) gezielt Rechte an einzelnen Dateien zu geben oder zu entziehen. ACLs ergänzen damit die normale Rechteverwaltung von Linux. Außerdem kann man mit ACLs die einheitliche Vergabe von Rechten für neu angelegte Dateien innerhalb eines Verzeichnisbaumes erzwingen.
Dies kann insbesondere auf größeren Mehrbenutzersystemen nützlich sein. Auf "normalen" Desktop-Systemen mit einem oder zwei Nutzern ist der Einsatz von ACLs üblicherweise nicht sinnvoll. Zudem gibt es viele Shellbefehle, die ACL ignorieren und Probleme verursachen können.
Das benötigte Paket für die Nutzung von Access Control List, libacl1, ist ab Ubuntu 9.04 bereits in der Standardinstallation enthalten. Die Programme setfacl und getfacl für die Bearbeitung von ACLs müssen dagegen nachinstalliert werden [1]:
acl
mit apturl
Paketliste zum Kopieren:
sudo apt-get install acl
sudo aptitude install acl
Bei den Dateisystemen JFS und XFS können ACLs standardmäßig gesetzt werden. Bei den unter Linux üblichen Dateisystemen ext3, ext4 und Reiserfs müssen ACLs erst explizit aktiviert werden. Dies geschieht durch die Option -o acl
beim Einbinden der Partition oder direkt in /etc/fstab.
Seit Ubuntu 12.04 gehört acl
bei den Dateisystemen ext3 und ext4 zu den Default-Optionen und braucht deshalb auch bei diesen nicht mehr explizit aktiviert zu werden.
/dev/sda5 /home ext3 defaults,nodev,acl 0 2
Mit noacl
statt acl
kann man die Nutzung von ACLs explizit verbieten.
Bei ext2 und ext3 kann man auch im Dateisystem selbst eintragen, dass es mit ACL-Unterstützung gemountet werden soll:
tune2fs -o acl /dev/sda5 tune2fs -l /dev/sda5
... Default mount options: acl ...
Wenn in der /etc/fstab unter dem betreffenden Dateisystem die Optionen acl
oder noacl
stehen, so haben diese Vorrang über den Eintrag im Dateisystem selbst.
Der Eintrag im Dateisystem kann mit folgendem Befehl entfernt werden:
tune2fs -o acl /dev/sda5 tune2fs -l /dev/sda5
... Default mount options: (none) ...
Die ACL-Verwaltung läuft über zwei Programme:
setfacl dient zum Setzen und Löschen von ACLs
getfacl dient zum Auslesen von ACLs
Wie bei den klassischen Unixrechten, können auch ACLs für eine Datei nur vom Besitzer der jeweiligen Datei gesetzt werden, nicht von anderen Nutzern. Darüber hinaus funktionieren die Befehle ls und chmod weiterhin, wenn auch leicht verändert. Die Struktur von ACLs sowie ihre Anwendungsweise wird im Folgenden erklärt.
Hier wird beschrieben, wie ACLs für einzelne Dateien und Verzeichnisse gesetzt werden.
Die klassischen Unixrechte [3] erlauben nur Unterscheidung der Zugriffsrechte für den Besitzer, die besitzende Gruppe und Anderen ("other"). Will man genau einer weiteren Person Rechte auf eine Datei erteilen, muss man eine Gruppe anlegen, in der genau die Benutzer enthalten sind, die die Rechte bekommen sollen. Für jede gewünschte Kombination von Benutzern benötigt man also eine eigene Gruppe, was unpraktikabel ist.
ACLs lösen das Problem, indem man beliebigen weiteren Personen und Gruppen die Zugriffsrechte (lesen, schreiben, ausführen bzw. rwx
) erteilen kann. ACLs erlauben die Rechtevergabe an folgende Parteien:
genau ein Besitzer
benannte Benutzer
genau eine besitzende Gruppe
benannte Gruppe
Andere
Der Besitzer, die besitzende Gruppe und Andere sind die gleichen wie bei den klassischen Unixrechten. Neu sind keine, eine oder mehrere benannte Benutzer und benannte Gruppen.
Setzen von Rechten für Benutzer und Gruppen:
setfacl -m u:BENUTZER:-,g:GRUPPE:RECHTE,... DATEI ...
Man beachte, dass mehrere Rechtevergaben durch Kommas getrennt aufgelistet werden können. Folgende Regeln gelten:
Das u
steht für einen User. Ist BENUTZER = "", dann werden die Rechte für den Dateibesitzer gesetzt.
Das g
steht für eine Gruppe. Ist GRUPPE = "", dann werden die Rechte für die besitzende Gruppe gesetzt.
Das o
steht für Andere ("other").
Das m
steht für die Maske (Erklärung weiter unten).
Die Rechte sind wie bei chmod: r
, w
oder x
, oder -
für keine Rechte. Mit dem großen X
wie bei chmod kann man x-Rechte setzen, falls es ein Verzeichnis ist oder für jemanden schon ein x-Bit gesetzt ist.
Entfernen einzelner Einträge in der ACL:
setfacl -x u:BENUTZER,g:GRUPPE,... DATEI ...
Beim Löschen einzelner Einträge einer ACL wird die Maske (s. unten) neu berechnet. Dabei können unbeabsichtigt benannte Benutzer und Gruppen Rechte zugeteilt bekommen. Das Neuberechnen der Maske kann man mit Option -n
verhindern.
Entfernen der gesamten ACL, so dass nur die klassischen Unixrechte zurückbleiben:
setfacl -b DATEI ...
u:
kann weggelassen werden. Der darauf folgende String wird dann automatisch als benannter Benutzer interpretiert.
Beim Bearbeiten einzelner gleichartiger Dateien oder gleichartiger Verzeichnisse muss man die Maske nicht beachten. Sie wird dann automatisch richtig gesetzt.
Der Nutzer anton
erstellt Dateien und lässt seine Kollegen in der Gruppe schreiber
lesen. Als Beispiel sei folgende Datei gegeben.
ls -l roman.txt
-rw-r--r-- 1 anton schreiber 825 2010-01-01 00:00 roman.txt
Sie hat keine ACL, aber man kann die Zugriffsrechte in ACL-Form abrufen.
getfacl roman.txt
# file: roman.txt # owner: anton # group: schreiber user::rw- group::r-- other::r--
Da (noch) keine ACLs gesetzt sind, entspricht die Ausgabe im Prinzip der oben gezeigten von ls -l
, lediglich mit einer anderen Darstellung.
Anton möchte verhindern, dass sein Chef, der ebenfalls in der Gruppe schreiber
ist, die Datei lesen kann. Gleichzeitig möchte er den Lektoren die Möglichkeit geben, seine Datei zu korrigieren.
Jetzt werden dem Nutzer chef
alle Rechte genommen und der Gruppe lektoren
die Schreib- und Leserechte eingeräumt.
setfacl -m u:chef:-,g:lektoren:rw roman.txt
Die Ausgabe von getfacl sieht jetzt so aus:
# file: roman.txt # owner: anton # group: schreiber user::rw- user:chef:--- group::r-- group:lektoren:rw mask::rw- other::r--
Wie man sieht, werden die ACLs für den Chef und die Lektoren jetzt angezeigt.
Die Ausgabe von ls -l
sieht jetzt so aus:
-rw-rw-r--+ 1 anton schreiber 825 2010-01-01 00:00 roman.txt
Das "+" zeigt an, dass ACLs vorhanden sind. Welche dies sind, sieht man aber über ls
nicht.
Welcher Eintrag für die Zugriffsrechte entscheidend ist, bestimmen folgende Regeln:
Die ACL wird von oben nach unten abgearbeitet.
Die erste zutreffende Regel gilt.
Beispiel:
# file: roman.txt # owner: anton # group: schreiber user::rw- user:chef:--- user:anton:r-- group::r-- group:lektoren:rw mask::rw- other::r--
Anton ist der Besitzer der Datei. Für ihn gelten die Rechte des Besitzers user::rw-
. Der Eintrag user:anton:r--
folgt später und wird daher ignoriert.
Der Chef sei in der besitzenden Gruppe schreiber
, welche lesen darf (group::r--
). Trotzdem hat der Chef überhaupt keinen Zugriff, weil er weiter oben als benannter Benutzer ohne Rechte (user:chef:---
) eingetragen ist.
Beim teilweisen oder vollständigen Entfernen von ACLs können unbeabsichtigt Rechte (wieder)erteilt werden, wenn ACLs zum Entziehen von Rechten gebraucht wurden. Wenn z.B. ein Eintrag für einen benannten Benutzer ohne Zugriffsrechte mit entfernt wird, dann kann der betreffende Benutzer u.U. über seine Mitgliedschaft in der besitzenden Gruppe wieder Zugriffsrechte bekommen. Der Eintrag für die besitzende Gruppe wird dabei nämlich nicht entfernt, weil er ja zu den Standard-Unixrechten gehört.
Die Maske legt die maximalen Rechte fest, die ein anderer Benutzer als der Besitzer oder eine Gruppe haben kann. Das heißt, wenn ein Eintrag eine Gruppe die Lese- und Schreibrechte einräumt, die Maske aber nur Leserechte vorsieht, dann hat diese Gruppe auch nur Leserechte. Ein (für die Praxis sinnloses) Beispiel:
# file: roman.txt # owner: anton # group: schreiber user::rw- user:chef:rw- #effective:r-- group::rwx #effective:r-x group:lektoren:-wx #effective:--x mask::r-x other::---
Der Befehl getfacl gibt die effektiven Rechte aus, wenn die Rechte durch die Maske eingeschränkt wurden. Die Maske kann auf 4 verschiedene Weisen berechnet bzw. gesetzt werden:
setfacl -m RECHTELISTE ... # automatisch berechnen setfacl -n -m RECHTELISTE ... # nicht verändern setfacl -m m::MASKE,RECHTELISTE ... # manuell setzen chmod g=MASKE # manuell setzen
Wenn nicht anders angegeben, wird die ACL beim Modifizieren der ACL automatisch so angepasst, dass sie die Rechte der neuen Einträge nicht einschränkt. Anders ausgedrückt: Die Maske ist die Vereinigungsmenge der Rechte der Gruppen und der benannten Benutzer.
Mit der Option -n
wird die Maske nicht verändert. Wenn die Datei noch keine ACL hat, wird die Maske gleich der Gruppenrechte gesetzt.
Die Maske kann durch m::MASKE
explizit gesetzt werden.
Die Maske wird auch mit chmod gesetzt (wenn hiermit Rechte für die Unix-Gruppe eingetragen werden, wirkt die Änderung bei Dateien mit ACL statt dessen auf die Maske), was aufgrund der Fähigkeiten von chmod sehr praktisch ist.
Ändern von Rechten für die Unix-Gruppe ist bei Dateien mit ACL nicht mit chmod möglich, sondern nur mit setfacl.
Das Programm getfacl zeigt sowohl die Rechte der Unix-Gruppe, als auch die Maske, und die effektiven Rechte durch Anwendung der Maske.
Wie man mit den Masken umgeht, ist in diesem Artikel in den jeweiligen Kapiteln beschrieben.
Wenn die ACL ganz entfernt wird, dann werden die Gruppenrechte gleich den effektiven Rechte der besitzenden Gruppe gesetzt, also der Maske geschnitten mit den Rechten der besitzenden Gruppe.
Zum Verständnis: Der Grund für diese Konstuktion ist Kompatibilität von alten Programmen. Manche Programme müssen kurz alle fremden Zugriffe auf einzelne Dateien verhindern, und benutzen dafür chmod. Diese erzielen automatisch auch bei zusätzlichen ACL-Rechten die beabsichtigte Wirkung, indem das vermeintliche Aussperren der Gruppe in Wahrheit die Maske setzt, und darüber effektiv sowohl die Gruppe, als auch auch alle mit ACL freigegebenen anderen Nutzer und Gruppen aussperrt. Die Programme erhalten auch von ls die erwartete Rückmeldung, dass die Änderung durchgeführt wurde.
Einige Shellbefehle ändern bei Anwesenheit von ACLs ihr Verhalten geringfügig. Sie können aber trotzdem unverändert weiter benutzt werden.
Der Befehl test bzw. [
kann prüfen, ob eine Datei für den aktuellen Prozess lesbar, schreibbar oder ausführbar ist.
[ -r DATEI ] [ -w DATEI ] [ -x DATEI ]
Diese Befehle funktionieren auch mit ACLs richtig, weil sie die effektiven Rechte prüfen.
ls -l
zeigt mit dem "+" nach den Unixrechten an, dass die Datei ACLs hat.
Das Anzeigen der Anwesenheit von ACLs durch ein "+" ist nicht auf allen unixähnlichen Plattformen implementiert. Es kann daher passieren, dass ACLs dort übersehen werden.
Außerdem zeigt ls
statt der Gruppenberechtigung die Maske an. Das kann irreführend sein. Ein extremes Beispiel:
-rw-rwx---+ 1 anton schreiber 825 2010-01-01 00:00 roman.txt ^^^ ^ # file: roman.txt # owner: anton # group: schreiber user::rw- user:chef:--- # keine Rechte! group::--- # keine Rechte! group:lektoren:--- # keine Rechte! mask::rwx other::---
Die Maske ist rwx
. Trotzdem hat in diesem Beispiel niemand aus den Gruppen und den benannten Benutzern irgendwelche Rechte.
Umgekehrt bedeutet eine Maske ---
, dass niemand aus den Gruppen und den benannten Benutzern effektiv irgendwelche Rechte hat, obwohl Einträge vorhanden sein können.
chmod bearbeitet bei Dateien mit ACLs nicht die Gruppenrechte, sondern die Maske.
# Bei Dateien ohne ACL: chmod g=RECHTE # setzt die Rechte der besitzenden Gruppe # Bei Dateien mit ACL: chmod g=RECHTE # setzt die Maske setfacl -m m::RECHTE # ebenso setfacl -m g::RECHTE # setzt die Rechte der besitzenden Gruppe
Ansonsten steht die gesamte Syntax von chmod unverändert zur Verfügung. Insbesondere das große "X" zum Setzen des x-Bits (nur bei Verzeichnissen oder wenn andere x-Bits gesetzt sind) ist sehr nützlich.
Wenn man irgendwo in einem Verzeichnisbaum ACLs benutzt, weiß man nicht, ob chmod die Gruppenrechte oder falls vorhanden die Maske ändert. In diesem Fall kann es sinnvoll sein, die Rechte immer mit setfacl statt chmod zu setzen.
chown und chgrp funktionieren unverändert. Die Besitzer und besitzenden Gruppen werden korrekt in der Ausgabe von getfacl hinter #
angegeben und beim Dateizugriff mit der richtigen Priorität berücksichtigt.
Die Befehle cp mit der Option -p
und mv setzen ACLs der Zieldatei richtig. Wenn das nicht geht, weil z.B. das Zieldateisystem keine ACLs unterstützt, wird eine Warnung ausgegeben.
Beim Anlegen von Dateien (und Verzeichnissen und Fifos und Gerätedateien) wird umask
ignoriert und durch eine etwaige Default-ACL in einem Verzeichnis ersetzt. Näheres s. Vererbung von ACLs und Default-ACLs.
Hier wird beschrieben, wie die ACL und Default-ACL für ein Verzeichnis gesetzt wird, das von mehreren Benutzern gemeinsam genutzt werden soll.
Angenommen man benötigt ein Verzeichnis, indem mehrere Benutzer Dateien anlegen und wechselseitig bearbeiten. Der Einfachheit halber legen wir dazu eine Gruppe an, in der alle berechtigten Benutzer Mitglied sind.
Die Berechtigungen neuer Dateien hängt von dem erstellenden Prozess ab (Benutzer, Gruppe, umask). Damit auch die Kollegen die Dateien schreiben können, muss jeder Benutzer:
neu angelegte Dateien mit chgrp der gemeinsamen Gruppe zuweisen (außer die Gruppe des schreibenden Prozesses ist schon die gemeinsame Gruppe).
mit chmod der Gruppe die Lese- und Schreibberechtigung erteilen (außer seine umask ist schon richtig gesetzt).
Die Benutzer müssen den Vorgang manuell durchführen und werden ihn oft vergessen. Dann müssen die anderen Benutzer dem Verursacher oder dem Administrator hinterher laufen, damit dieser die Rechte geraderückt.
Durch Setzten des sgid-Bits des Arbeitsverzeichnisses bewirkt man, dass automatisch neue Dateien und Unterverzeichnisse die Gruppe des Verzeichnisses annehmen und Unterverzeichnisse das sgid-Bit gesetzt bekommen. Die Überprüfung und Korrektur der Berechtigungen muss allerdings noch manuell erfolgen. Diesen Missstand kann man mit Default-ACLs teilweise beheben.
Default-ACLs sind Vorlagen für ACLs neu angelegter Dateien und Unterverzeichnisse. Nur Verzeichnisse können eine Default-ACL enthalten. So bewirkt man, dass die Berechtigungen für neu angelegte Dateien und Unterverzeichnisse nicht vom erstellenden Prozess abhängen, sondern eine Eigenschaft des Verzeichnisses sind. Default-ACLs sehen aus wie ACLs, nur enthalten sie zusätzlich ein d:
am Anfang.
Eine Default-ACL enthält immer:
Rechte für den Besitzer
Rechte für die besitzende Gruppe
Rechte für Andere
Daneben kann sie enthalten:
Rechte für ein oder mehrere benannte Benutzer
Rechte für ein oder mehrere benannte Gruppen
Vorgabe für die Maske
Das Setzen und Löschen der Default-ACLs geschieht wie bei den ACLs mit setfacl. Dabei setzt man entweder die Option -d
oder man fügt vor die einzelnen Rechte ein d:
ein.
#Beide Befehle modifizieren die Default ACL für einen Benutzer und eine Gruppe setfacl -dm u:BENUTZERNAME:RECHTE,g:GRUPPE:RECHTE VERZEICHNIS ... setfacl -m d:u:BENUTZERNAME:RECHTE,d:g:GRUPPE:RECHTE VERZEICHNIS ...
Lässt man die Pflichteinträge in der Default-ACL für Besitzer, besitzende Gruppe und Andere weg, dann werden sie gleich den entsprechenden Einträgen in der ACL gesetzt.
Sowohl in der ACL eines Verzeichnisses als auch in der Default-ACL sollen alle Parteien mit r-Recht auch das x-Recht haben. Dann bekommen das Verzeichnis und neue Unterverzeichnisse und Dateien automatisch übliche und sinnvolle Rechte zugeordnet.
Beim Bearbeiten einzelner gleichartiger Verzeichnisse muss man die Maske weder in der ACL noch in der Default-ACL beachten. Sie wird dann automatisch richtig gesetzt.
Die Verwendung des sgid-Bits zum Vererben der Gruppenzugehörigkeit kann weiterhin verwendet werden.
Entfernen einzelner Einträge in der Default-ACL. Ggf. muss auch hier die Option -n
benutzt werden, um die Neuberechnung der Maske zu unterbinden.
setfacl -x -d u:BENUTZER,g:GRUPPE,... DATEI ... setfacl -x d:u:BENUTZER,d:g:GRUPPE,... DATEI ...
Mit dem folgenden Befehl wird die Default-ACL entfernt.
setfacl -k DATEI ...
Neu angelegte Unterverzeichnisse bekommen als ACL die Default-ACL des Oberverzeichnisses zugeordnet. Zusätzlich erben sie die Default-ACL als eigene Default-ACL.
Neu angelegte Dateien bekommen als ACL die Default-ACL des Oberverzeichnisses zugeordnet, wobei das x-Bit gesondert bearbeitet wird. Legt man ohne ACLs Dateien an, so haben sie das x-Bit nicht gesetzt, obwohl die umask dies eigentlich vorsieht. Sonst wäre die neue Datei ungewollt ausführbar. Mit ACLs wird ebenso dafür gesorgt, dass neue Dateien nicht ausführbar sind, indem das x-Bit vom Besitzer, der Maske und Anderen gelöscht wird. Die Maske wirkt wie gesagt auf benannte Benutzer und alle Gruppen, so dass deren Einträge unverändert bleiben können.
Bei Bedarf kann man natürlich mit chmod oder setfacl die Datei ausführbar machen.
Der Benutzer Anton richtet ein Arbeitsverzeichnis ein und will dort mit der Gruppe der Lektoren Dateien bearbeiten. Die Default-ACL legt fest, welche Dateien und Unterverzeichnisse zugeordnet bekommen. Die Maske wird hier neu berechnet.
mkdir common setfacl -m g:lektoren:rwx,o::rx common setfacl -d -m g:lektoren:rwx,o::rx common getfacl common
# file: common # owner: anton # group: schreiber user::rwx group::r-x group:lektoren:rwx mask::rwx other::r-x default:user::rwx # aus ACL übernommen default:group::r-x # aus ACL übernommen default:group:lektoren:rwx default:mask::rwx # berechnet aus Rechten der Gruppe der Lektoren und besitzende Gruppe default:other::r-x
Unterverzeichnisse bekommen die gleiche ACL und Default-ACL wie die Default-ACL des Oberverzeichnisses.
mkdir common/subdir getfacl common/subdir/
# file: common/subdir/ # owner: anton # group: schreiber user::rwx group::r-x group:lektoren:rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:lektoren:rwx default:mask::rwx default:other::r-x
Bei neu angelegten Dateien wird das x-Bit gelöscht.
touch common/roman.txt getfacl common/roman.txt
# file: common/roman.txt # owner: anton # group: schreiber user::rw- # Hier wurde das x-Bit automatisch entfernt. group::r-x #effective:r-- group:lektoren:rwx #effective:rw- mask::rw- # Hier wurde das x-Bit automatisch entfernt. other::r-- # Hier wurde das x-Bit automatisch entfernt.
Im obigen Beispiel sieht man, wie der Besitzer des Arbeitsverzeichnis, einer anderen Gruppe Schreibzugriff auf seine neu angelegten Dateien gewährt hat.
Angenommen Lothar aus der Gruppe lektoren
hätte eine Datei angelegt. Der Benutzer Anton hätte keinen Zugriff darauf, außer Lesezugriff als "other". Die Berechtigung der neuen Datei kann er nicht ändern, weil er nicht der Benutzer ist. Um sicherzustellen, dass er von Anfang an Lese- und Schreibzugriff auf neue Dateien der Lektoren hat, hätte er in die Default-ACL zusätzlich sich selbst oder seine Gruppe eintragen müssen.
setfacl -d -m u:anton:rwx common setfacl -d -m g:schreiber:rwx common
Wenn der Besitzer eines Arbeitsverzeichnisses Dateien bearbeiten können will, die andere angelegt haben, dann muss er sich selbst als benannter Benutzer oder benannte Gruppe in die Default-ACL mit den gewünschten Rechten eintragen.
Default-ACLs verhindern, dass Anwender neue Dateien versehentlich mit den falschen Rechten anlegen. Sie können aber nicht verhindern, dass Anwender absichtlich die Rechte auf neuen Dateien ändern und Unsinn machen.
Es gibt 4 Möglichkeiten, Dateien in einem Verzeichnis mit Default-ACL anzulegen:
Komplett neu anlegen:
touch VERZEICHNIS/Datei
oder durch Abspeichern aus einer Anwendung ins entsprechende Verzeichnis mit einem noch nicht existierenden Dateinamen. Wie oben beschrieben, werden die ACLs dabei komplett durch Default-ACL bestimmt.
Verschieben und Verlinken existierender Dateien:
mv Datei VERZEICHNIS ln Datei VERZEICHNIS
oder durch Drag&Drop in einem Dateimanager in der grafischen Benutzeroberfläche. Die Datei behält die ursprüngliche Rechte / ACL bei, vorausgesetzt die Aktion findet im gleichen Dateisystem statt. In beiden Fällen wird die existierende Datei mit ihren Rechten nur im Zielverzeichnis verlinkt.
Kopieren:
cp Datei VERZEICHNIS
oder durch Drag&Drop z.B. in Nautilus mit Strg -Taste gedrückt. Die ACL wird durch die Default-ACL bestimmt, da die Zieldatei neu angelegt wird. Ausnahme: Die Maske der Zieldatei entspricht dem Gruppenrecht bzw. Maske der Quelldatei.
Kopieren mit Beibehalten der Rechte:
cp -p Datei VERZEICHNIS
Die Zieldatei hat exakt die gleichen Rechte/ACL wie die Quelldatei.
Wenn das Zielverzeichnis ein gemeinsames Arbeitsverzeichnis sein soll, in dem mehrere Benutzer auf die Dateien von anderen Benutzern Zugriff haben sollen, dann wird es trotz Verwendung von ACLs wahrscheinlich zu Problemen kommen: Benutzer werden neue Dateien in ihrem Homeverzeichnis editieren und dann ins gemeinsame Arbeitsverzeichnis verschieben.
Die Benutzer müssen angewiesen werden, entweder Dateien im Arbeitsverzeichnis neu anzulegen oder ihre Dateien ins Arbeitsverzeichnis zu kopieren und nicht zu verschieben. Außerdem könnte man ggf. die umask der Benutzer so setzen, dass ihre neuen Dateien automatisch für die Gruppe lesbar oder schreibbar sind (vorletzte Stelle 0 oder 2, aber nicht 7). Dann wäre sichergestellt, dass beim Kopieren ins Zielverzeichnis die Maske der Zieldatei automatisch richtig gesetzt wird.
Man kann ACLs nicht nur für einzelne Dateien und Verzeichnisse setzen. Man kann ACLs auch gleichzeitig für Dateien und Verzeichnisse und (rekursiv mit dem Parameter -R
) für komplette Verzeichnisbäume einschließlich bereits bestehender Dateien setzen. So kann man ausgewählten Benutzern Zugriff auf bestehende Verzeichnisbäume ermöglichen und durcheinander geratene Rechte aufräumen. Wenn Benutzer neue Unterverzeichnisse und Dateien mit vorgeschriebenen Zugriffsrechten anlegen können sollen, kann man allen Verzeichnissen auch eine Default-ACL geben.
Hier wird beschrieben, wie man mit setfacl am Beispiel eines bestehenden Verzeichnisbaumes effektiv ACLs und Default-ACLs gleichzeitig für Verzeichnisse und Dateien setzt.
Um mit setfacl gleichzeitig in Verzeichnissen und Dateien mit wenig Aufwand im Sinne des Erfinders ACLs zu setzen, bedarf es einer Erklärung, die leider nicht in den Manpages oder anderer Doku zu finden ist.
Normalerweise möchte man Unterverzeichnissen sowohl r- als auch x-Rechte zuordnen und Dateien nur r-Rechte. (Ausnahme: ausführbare Dateien, die auch nachher ausführbar sein sollen) Man möchte aber nicht mit find ... -exec setfacl ...
separate Aufrufe für Verzeichnisse und für normale Dateien machen, sondern nur einen.
Die nächste Frage ist, wie setzt man die Maske? Wenn man die Maske automatisch berechnen lässt, wird sie auch bei normalen Dateien das x-Bit enthalten und alle benannten Benutzer und Gruppen können die Datei ausführen, was ja nicht erwünscht ist. Die Maske vorgeben geht auch nicht, weil normale Dateien und Verzeichnisse unterschiedliche Masken haben müssen und man dann zwei Aufrufe machen müsste.
Wenn man Vererbung von ACLs nutzen möchte, muss man Default-ACLs anlegen. Anders als in der ACL, kann man bedenkenlos die Maske automatisch setzen, denn sie gilt ja nur für Verzeichnisse und kann eh nicht mit chmod gesetzt werden.
Diese Rahmenbedingungen führen dazu, dass Benutzer sich unnötigerweise Skripte zum Setzen der ACLs zusammenstückeln basteln oder irrtümlich erteilte x-Rechte mühsam wieder wegnehmen müssen.
Im folgenden Beispiel soll ähnlich wie unter Vererbung von ACLs und Default-ACLs beschrieben folgende Rechteverteilung hergestellt werden:
Die bestehenden Besitztümer und Rechte sind durcheinander geraten und sollen korrigiert werden.
Der Autor Anton aus der Gruppe der Schreiber will der Gruppe von Lektoren Lese- und Schreibrechte erteilen.
Der Chef soll einen Zugriff bekommen.
Anton und seine Kollegen aus der Gruppe der Schreiber sollen neue Dateien der Lektoren lesen können.
Die Standard-Unixberechtigungen sollen vereinheitlicht werden.
1. Vorbereitung: Wechsel des Besitzes
Wenn ein Verzeichnisbaum von mehreren Benutzern bearbeitet worden ist, gehören die Dateien möglicherweise verschiedenen Nutzern. Dann muss man als Root die Dateien einem einzelnen Besitzer zuordnen, der dann die ACLs setzen kann. Ggf. müssen alte ACLs entfernt werden.
sudo chown -R USER:GRUPPE /home/USER/VERZEICHNIS setfacl -R -b /home/USER/VERZEICHNIS
Wenn die bestehenden Besitzverhältnisse jedoch beibehalten werden sollen, dann müssen die Aufrufe von setfacl durch die verschiedenen Benutzer (umständlich) oder am besten gleich als root erfolgen.
2. Schritt: Setzen der ACLs
Zuerst setzt man mit der Option -R
die ACL rekursiv für den Verzeichnisbaum. In der ACL setzt man - jeweils wenn nötig - die Rechte für:
Besitzer
benannte User,
die besitzende Gruppe,
benannte Gruppen und
Andere
* In der ACL sollen alle Gruppen und benannten Benutzer mit r-Recht auch das x-Recht auf Verzeichnisse und ausführbare Dateien haben. Das erreicht man mit einem großen X
in setfacl. Dabei wird x-Recht gesetzt, wenn es ein Verzeichnis ist oder bereits jemand anders auf diese Datei das x-Recht hat.
Der fertige Befehl mit allen Arten von ACL-Einträgen sieht z.B. so aus:
setfacl -R -m u::rwX,u:chef:-,g::rX,g:schreiber:rX,g:lektoren:rwX,o::rX VERZEICHNIS
Man lässt hier die Maske automatisch berechnen. Sie wird dann richtig gesetzt sein.
3. Schritt: Setzen der Default-ACLs
Nur wenn Vererbung von ACLs auf neue Verzeichnisse und Dateien gewünscht wird, benötigt man Default-ACLs. Dann benötigt man einen zweiten Aufruf, weil - anders als bei ACLs - die Maske in den Default-ACLs automatisch berechnet werden soll.
In der Default-ACL setzt man - jeweils wenn nötig - die Rechte für:
den Besitzer
benannte User,
die besitzende Gruppe,
benannte Gruppen und
Andere.
Die Einträge für den Besitzer, die besitzende Gruppe und Andere können weggelassen werden, wenn sie gleich den eben gesetzten ACL-Einträgen sein sollen.
In der Default-ACL sollen alle Gruppen und Benutzer mit r-Recht auch das x-Recht haben. Neue Dateien werden trotzdem keine unerwünschten x-Rechte bekommen.
Statt einem kleinen x
kann man auch ein großes X
nehmen. Daher kann man die Rechte aus der eben gesetzten ACL in die Befehlszeile hineinkopieren.
Der fertige Befehl mit allen Arten von Default-ACL-Einträgen sieht z.B. so aus:
setfacl -R -d -m u::rwx,u:chef:-,g::rx,g:schreiber:rx,g:lektoren:rwx,o::rx VERZEICHNIS
Man lässt hier die Maske automatisch berechnen. Sie wird dann richtig gesetzt sein.
Zur besseren Übersicht sind hier die ACL- und Default-ACL-Einträge aus den beiden Kommandozeilen untereinander aufgelistet:
u::rwx u:chef:- g::rx g:schreiber:rx g:lektoren:rwx o::rx d:u::rwx d:u:chef:- d:g::rx d:g:schreiber:rx d:g:lektoren:rwx d:o::rx
Mit diesem Vorgehen (und nur so) kann man auf einfache Weise fast immer die Rechte wie benötigt setzen.
In wenigen Ausnahmefällen muss man manuell mit setfacl Masken und ACLs in ausgewählten Dateien setzen oder eine Nutzung von Default-ACLs funktioniert nicht wie gewünscht:
Falls einige der Gruppen oder benannten Mitglieder x-Rechte auf Dateien oder Verzeichnisse benötigen und andere nicht.
Falls man Verzeichnisse mit exotischen Rechten wie r--
oder --x
haben möchte.
Falls Dateien und Verzeichnisse unterschiedliche Rechte haben sollen.
Um die Berechtigungen eines Ordners auf bereits bestehende Unterordner zu übertragen kann folgender Befehl verwendet werden.
getfacl VERZEICHNIS | setfacl -R -M- VERZEICHNIS
Hier werden erst die Berechtigungen des Verzeichnis ausgelesen und gleich wieder als rekursive (-R
) Berechtigungen gesetzt.
Das obige Beispiel mit allen möglichen Aktionen sieht zusammengefasst so aus:
sudo chown -R USER:GRUPPE /home/USER/VERZEICHNIS setfacl -R -b /home/USER/VERZEICHNIS setfacl -R -m u::rwX,u:chef:-,g::rX,g:schreiber:rX,g:lektoren:rwX,o::rX VERZEICHNIS setfacl -R -d -m u::rwx,u:chef:-,g::rx,g:schreiber:rx,g:lektoren:rwx,o::rx VERZEICHNIS
Angenommen sei der Fall, Dateibesitzer, Gruppenzugehörigkeiten und Standard-Unixberechtigungen sind schon richtig und es soll nur eine benannte Gruppe mit Lese- und Schreibrechtenrechten hinzugefügt werden. Außerdem wollen der Besitzer und seine Kollegen, die Schreiber, selbst neue Dateien der fremden Gruppe lesen können.
setfacl -R -m g:schreiber:rx,g:lektoren:rwx VERZEICHNIS setfacl -R -d -m g:schreiber:rx,g:lektoren:rwx VERZEICHNIS
Zum Abschluss noch ein ganz einfaches Beispiel, wo nur einer benannten Gruppe Leserechte erteilt werden soll.
setfacl -R -m g:lektoren:rx VERZEICHNIS setfacl -R -d -m g:lektoren:rx VERZEICHNIS
Man kann ACLs ganzer Verzeichnisbäume in eine Textdatei sichern und später wiederherstellen.
getfacl -R -n VERZEICHNIS > acl.txt
Neben den ACLs werden hinter Kommentarzeichen #
auch Dateiname, Besitzer und besitzende Gruppe sowie suid-, sgid- und sticky-Bits ausgegeben. Die ACLs einschließlich dieser Zusatzinformationen können mit dem folgenden Befehl wieder gesetzt werden. setfacl übernimmt dabei die gleichen Funktionen wie chown, chgrp und chmod. Voraussetzung ist natürlich, dass man der Besitzer der Dateien oder Root ist.
setfacl --restore=acl.txt
Diese Funktionalität ist ganz praktisch, wenn man Dateien auf andere Dateisysteme oder in Archivdateien speichern will, die keine ACLs erlauben.
Die beiden Befehle setfacl und getfacl können noch mehr:
Symlinks verfolgen oder nicht.
Zum Kopieren von ACLs die Ausgabe von getfacl nach setfacl eingeben.
Dateien ohne ACLs ignorieren.
Weitere Informationen findet man in der Manpages zu setfacl und getfacl und über ACLs im Allgemeinen in der Manpage zu ACLs:
man setfacl man getfacl man acl
Probleme mit ACLs an sich gibt es eigentlich nicht. ACLs und deren Zusammenspiel mit den klassischen Unixrechten sind konservativ implementiert worden, d.h. mit minimalen Einschränkungen auf Funktionalität und Sicherheit.
Vielmehr ist das Problem, dass Shellbefehle und Anwenderprogramme nicht mit ihnen umgehen können.
find ... -ls
druckt anders als ls -l
keine Hinweise auf die Existenz von ACLs aus.
Archivierungsprogramme wie tar speichern keine ACLs in ihren Archiven ab. Man kann das Problem umgehen, indem man mit getfacl -R
die ACLs in eine Datei speichert und diese ebenso archiviert. Bei Bedarf kann man mit setfacl --restore=FILE
die Rechte wiederherstellen.
Anwenderprogramme: Öffnet man eine mit einer ACL versehene Datei mit einem Editor und speichert diese unter anderem Namen wieder ab, so ist die ACL ebenfalls weg. Dies kann ggf. verhindert werden, indem man im übergeordneten Verzeichnis eine Default-ACL setzt.
Viele Dateimanager, darunter Nautilus, Thunar und PCManFM, können ACLs nicht korrekt anzeigen. Die KDE-Dateimanager Konqueror und der neuere Dolphin zeigen ACLs jedoch korrekt an.
Programme zur Überprüfung der Dateirechte und der Sicherheit des Betriebssystems prüfen u.U. nicht die ACLs. Es wäre daher möglich, unerkannt mit ACLs das System zu kompromittieren, ohne dass es jemandem auffällt.
Diese Revision wurde am 24. September 2016 01:24 von march erstellt.