[[Vorlage(getestet, general)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Rechte: Dateirechte unter Unix/Linux] }}} [[Inhaltsverzeichnis(2)]] 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 [:Rechte: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 [:Shell/Befehlsübersicht:Shellbefehle], die ACL ignorieren und [#probleme Probleme] verursachen können. = Installation = Das benötigte Paket für die Nutzung von Access Control List, '''libacl1''', ist bereits in der Standardinstallation enthalten. Die Programme '''setfacl''' und '''getfacl''' für die Bearbeitung von ACLs müssen dagegen nachinstalliert werden [1]: {{{#!vorlage Paketinstallation acl }}} = Benutzung = == Aktivieren im Dateisystem == Bei den [:Dateisystem: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 [:mount:Einbinden] der Partition oder direkt in [:fstab:/etc/fstab]. {{{#!vorlage 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 die 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: {{{#!vorlage Befehl 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 ([#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: {{{#!vorlage Befehl setfacl -x u:BENUTZER,g:GRUPPE,... DATEI ... }}} {{{#!vorlage Warnung Beim Löschen einzelner Einträge einer ACL wird die [#maske 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: {{{#!vorlage Befehl setfacl -b DATEI ... }}} {{{#!vorlage 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 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. [[Anker(prio)]] = 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. {{{#!vorlage Warnung 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. }}} [[Anker(maske)]] = 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: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl [ -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. {{{#!vorlage Warnung 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 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 Maske]. {{{#!vorlage Befehl # 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. {{{#!vorlage 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 [#prio 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 Vererbung von ACLs und Default-ACLs]. [[Anker(vererbung)]] = 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, in dem 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. {{{#!vorlage Befehl #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. {{{#!vorlage 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 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl setfacl -d -m u:anton:rwx common setfacl -d -m g:schreiber:rwx common }}} {{{#!vorlage 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. }}} {{{#!vorlage Warnung 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: {{{#!vorlage Befehl 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. 1. Verschieben und Verlinken existierender Dateien: {{{#!vorlage Befehl 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. 1. Kopieren: {{{#!vorlage Befehl cp Datei VERZEICHNIS }}} oder durch Drag&Drop z.B. in Nautilus mit [[Vorlage(Tasten, 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. 1. Kopieren mit Beibehalten der Rechte: {{{#!vorlage Befehl 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. {{{#!vorlage 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. }}} [[Anker(baeume)]] = 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 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. {{{#!vorlage Befehl 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 {{{#!vorlage 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: {{{#!vorlage Befehl 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. {{{#!vorlage 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: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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 [:man:Manpages] zu setfacl und getfacl und über ACLs im Allgemeinen in der Manpage zu ACLs: {{{#!vorlage Befehl man setfacl man getfacl man acl }}} [[Anker(probleme)]] = 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: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 [:PCManFM:], können ACLs nicht korrekt anzeigen. Die [:KDE:]-Dateimanager [:Konqueror:] und der neuere [:Dolphin:] zeigen ACLs jedoch korrekt an. [:Nautilus:] kann mit der [https://www.linux-community.de/blog/acls-unter-ubuntu-mit-nautilus/ eiciel-Erweiterung] {de} ACLs korrekt anzeigen. Auch [:Thunar:] kann mit dem Paket [packages:eiciel:] ACLs anzeigen. Dies erfordert jedoch eine [ubuntu_doc:community/ThunarCustomActions#Edit_Filesystem_Metadata:Bentzerdefinierte Aktion] {en}. * 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. = Links = * [https://www.mathematik.hu-berlin.de/~ccafm/lehre_BZQ_Numerik/allg/rechte.shtml Zugriffsrechte von Dateien] {de} * [https://www.mathematik.hu-berlin.de/~ccafm/lehre_BZQ_Numerik/allg/fs_acl-de.pdf Einführung in Access Control Lists unter Linux] {de} - Einführung von Andreas Grünbacher (PDF) # tag: Server, Shell, Sicherheit, System