ubuntuusers.de

ubuntuusers.deWikiACL

ACL

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

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.

Installation

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

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install acl 

sudo aptitude install acl 

Benutzung

Aktivieren im Dateisystem

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.

Hinweis:

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)
...

Bearbeiten von ACLs

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.

ACLs für Dateien und Verzeichnisse

Hier wird beschrieben, wie ACLs für einzelne Dateien und Verzeichnisse gesetzt werden.

Motivation

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.

Aufbau einer ACL

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 und Löschen von ACLs

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 ... 

Achtung!

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 ... 

Hinweis:

  • 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.

Beispiel

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.

Prioritäten

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.

Achtung!

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.

Maske

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.

Shellbefehle

Einige Shellbefehle ändern bei Anwesenheit von ACLs ihr Verhalten geringfügig. Sie können aber trotzdem unverändert weiter benutzt werden.

bash

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

ls -l zeigt mit dem "+" nach den Unixrechten an, dass die Datei ACLs hat.

Achtung!

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

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.

Hinweis:

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, chgrp

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.

mv, cp

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.

umask, touch, mkdir, mknod, mkfifo

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.

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.

Motivation

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.

Aufbau einer Default-ACL

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

Setzen und Löschen von Default-ACLs

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.

Hinweis:

  • 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 ... 

Dateien und Verzeichnisse neu anlegen

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.

Beispiel

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 

Hinweis:

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.

Achtung!

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.

Dateien ins Zielverzeichnis verschieben und kopieren

Es gibt 4 Möglichkeiten, Dateien in einem Verzeichnis mit Default-ACL anzulegen:

  1. Komplett neu anlegen:

    touch VERZEICZHNIS/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.

  2. 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.

  3. 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.

  4. 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.

Hinweis:

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.

Verzeichnisbäume

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.

Problem

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.

Setzen von ACLs in Verzeichnisbäumen

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 Scheiber 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

Hinweis:

* 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.

Hinweis:

  • 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.

Nachträgliches Übertragen der ACL auf Unterordner

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.

Zusammenfassung

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 

Sichern und Wiederherstellen von ACLs

Man kann ACLs ganzer Verzeichnisbäume in eine Textdatei sichern und später wiederherstellen.

getfacl -R 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.

Weiteres zu ACLs

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

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 19. Oktober 2014 12:12 von Max-Ulrich Farber erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Sicherheit, Server, System, Shell