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.
Die Rechte unter unixartigen Systemen bestehen aus einem einfachen Modell. Ein Verzeichnis oder eine Datei haben einen Besitzer, sind einer Gruppe zugeordnet und besitzen zuletzt Zugriffsrechte für alle anderen Anwender.
Für Eigentümer, Gruppe und den Rest der Welt existieren jeweils nachstehende Zugriffsrechte:
R ead - Lesen
W rite - Schreiben (Anlegen, Modifizieren, Löschen)
e X ecute - Ausführen (Dateien) / Durchschreiten (Ordner)
Dateien und Verzeichnisse die neu angelegt werden erhalten als Zugehörigkeit den Anwender und seine Gruppe, sowie Rechte entsprechend den ACL-Einträgen des Vaterverzeichnises. Damit kann sichergestellt werden, dass eine Gruppe oder bestimmte Anwender auf die Dateien die gewünschten Rechte erhalten.
Die ACL wird von oben nach unten abgearbeitet und die erste zutreffende Regel gilt.
Vorbereitungen
Sofern die entsprechenden Pakete noch nicht installiert sind, sollte man dies nun nachholen mit z.B. apt install acl
. Unter Redhat/CentOS ist das Paket bereits installiert.
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.
/dev/sda5 /home ext4 defaults,nodev,acl 0 2
Woran erkennt man ob ACLs verwendet werden?
Eine normale Anzeige der Rechte von Dateien/Verzeichnissen sehen wir folgt aus:
[root@localhost tmp]# ll
insgesamt 8
-rw-------. 1 root root 1502 26. Mär 10:11 anaconda-ks.cfg
-rw-r--r--. 1 root root 6059 26. Mär 10:46 Lorem_ipsum.txt
Sofern die Rechte erweitert wurden, erkennt man dies an einem + hinter den Datei/Verzeichnisrechten:
[root@localhost tmp]# ll
insgesamt 8
-rw-------. 1 root root 1502 26. Mär 10:11 anaconda-ks.cfg
-rw-rw-r--+ 1 root root 6059 26. Mär 10:46 Lorem_ipsum.txt
Anzeigen und Setzen von ACLs
Anzeigen von Datei/Verzeichnisrechten
Zum Anzeigen von Datei/Verzeichnisrechten verwendet man getfacl
. Ein Beispiel:
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
group::r--
other::r--
Setzen von Datei/Verzeichnisrechten
Datei/Verzeichnisrechte lassen sich mit setfacl
festlegen.
Die Syntax sieht wie folgt aus:
grundsätzlich:
setfacl -m ACL Datei|Verzeichnis
das -m steht für Modifikation
setzen von Benutzerrechten
setfacl -m user:<Benutzer>:<Dateirechte> <Datei/Verzeichnis>
alternativ:
setfacl -m u:<Benutzer>:<Dateirechte> <Datei/Verzeichnis>
Bsp:
setfacl -m user:rasputin:rw- testfile1
alternativ:
setfacl -m u:rasputin:rw- testfile1
Vorher:
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost tmp]# setfacl -m user:rasputin:rw- testfile1
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
user:rasputin:rw-
group::r--
mask::rw-
other::r--
nun kann der Benutzer rasputin die Datei testfile1 sowohl lesen als auch beschreiben.
setzen von Gruppenrechten
setfacl -m group:rasputin:rw- testfile1
alternativ:
setfacl -m g:rasputin:rw- testfile1
Anmerkung: Natürlich können sowohl Benutzer als auch die Gruppenrechte in einem Befehl angegeben werden:
[root@localhost tmp]# setfacl -m u:rasputin:-,g:rasputin:rw
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
user:rasputin:---
group::r--
group:rasputin:rw-
mask::rw-
other::r--
setzen von Defaultrechten
Es lassen sich per setfacl -m d:rasputin:rw- test
auch default -Rechte setzen, dass geht allerdings nur bei Verzeichnissen.
[root@localhost tmp]# setfacl -m d:rasputin:rw- test
[root@localhost tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:rasputin:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
Entfernen einzelner Einträge in der ACL
setfacl -x u:BENUTZER|g:GRUPPE <Datei>
Bsp.:
Vorher:
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
user:rasputin:rw-
group::r--
mask::rw-
other::r--
[root@localhost tmp]# setfacl -x u:rasputin testfile1
[root@localhost tmp]# getfacl testfile1
# file: testfile1
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
Maske
Anmerkung: Der folgende Absatz stammt von wiki.ubuntuusers.de da ich das Rad nicht neu erfinden wollte.
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.
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.