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:
Read | Lesen |
Write | Schreiben (Anlegen, Modifizieren, Löschen) |
eXecute | Ausführen (Dateien) Durchschreiten (Ordner) |
Im Dateimanager sollte dies auch für den unbedarften Anwender nicht schwierig sein. Die Zugriffsrechte allerding auf einen Teilbaum zu setzen, stellt sich mit den vorhandenen Mitteln der graphischen Oberfläche als schwierig heraus. Mit den althergebrachten Kommandos ist es jedoch kein Problem.
$ chmod 664 datei $ chmod u=rw,g=rw,o=r datei $ ls -l datei -rw-rw-r-- 1 anton anton 0 1. Mär 11:24 datei $ $ chmod o-r datei $ ls -l datei -rw-rw---- 1 anton anton 0 1. Mär 11:24 datei $ chmod o+r datei $ ls -l datei -rw-rw-r-- 1 anton anton 0 1. Mär 11:24 datei
Um gesamte Teilbäume mit neuen Zugriffsrechten zu versehen kann wie folgt verfahren werden:
$ chmod -R 664 ordner $ $ chmod 775 `find ordner -type d -print` $ chmod u+rw,g+rw,o=r `find ordner -type f -print`
Dieses Modell ist schon gut brauchbar, erfüllt aber nicht immer die Anforderungen einer Arbeitsgruppe.
Der Eigentümer einer Datei ist der Anwender, der diese Datei angelegt hat. Die Gruppenzugehörigkeit wird der aktuellen Gruppe des Anwenders zugeordnet.
Unter Linux wird sehr oft parallel zur ID des Anwenders eine anwenderspezifische Gruppe angelegt und als Hauptgruppenzugehörigkeit des Anwenders verwendet.
Dies bedeutet dass in der Regel Objekte die von einem Anwender angelegt werden, von anderen Anwendern nicht bearbeitet werden können.
$ ls -l -rw-rw-r-- anton anton 1234 1. April 11:01 datei drwxrwxr-x anton anton 4096 1. April 11:02 ordner $
$ chown anton datei $ chgrp gruppe datei $ chown anton:gruppe datei $ chown -R anton:gruppe ordner $ chgrp -R gruppe ordner
Manchmal ist es notwendig sehr gezielt Rechte zu vergeben. Meistens kann dies über die Zuordnung einer Gruppenzugehörigkeit gelöst werden. Dies ist aber keine optimale Verfahrensweise und stellt sich als kompliziert dar.
Unter SYSV Unix Systemen und auch unter Linux werden Eigentümer und momentane Gruppe in neu angelegte Objekte vererbt, bei BSD Systemen wird dagegen die Gruppenzugehörigkeit vom Vaterverzeichnis abgeleitet.
Die Zugriffsrechte werden entsprechend der umask Einstellung gesetzt. Umask User file-creation mask oder Anwender Dateierzeugungsmaske legt fest welche Rechte beim Anlegen einer Datei nicht vergeben werden (Angabe der Rechte als Oktalzahl) bzw. welche Rechte vergeben werden (Symbolische Angabe der Rechte).
$ umask 0002 $ $ umask -S u=rwx,g=rwx,o=rx $
$ umask u=rwx,g=rx,o= $ umask 0027 $ mkdir ordner;touch datei $ ls -ld ordner datei -rw-r----- 1 anton anton 0 15. Mär 08:48 datei drwxr-x--- 2 anton anton 4096 15. Mär 08:48 ordner $
Neben den üblichen Rechten (r w x) existiert für User und Gruppen
noch ein besonderes Recht, das Sticky Bit.
Das entsprechende Bit für other, den Rest der Welt, ist das
Text Bit.
Wenn es für den Eigentümer oder die Gruppe vorhanden ist, bewirkt das SxID Bit, dass die Datei mit der Kennung des Eigentümers, respektive der Gruppe ausgeführt wird. Dies wirkt sich nur auf Programme aus. Skripte sind hiervon nicht berührt, da ein Interpreter die Skripte ausführt.
Die Gruppe des Ordners wird an neuen Objekte vererbt (BSD Model).
Wenn das Bit gesetzt ist, wird durch das Betriebsystem die Datei im Speicher gehalten, so dass spätere Zugriffe schneller durchgefürt werden. Dies hat heute keine praktische Bedeutung mehr.
Verzeichnisse wie z.B. /tmp sind mit rwxrwxrwx versehen. Daher könnten alle
Anwender Dateien löschen, egal ob Sie Besitzer sind oder nicht.
Mit dem Text Bit wird verhindert dass fremde Dateien gelöscht werden
können.
$ chmod u+s datei $ ls -l datei -rwsr-x-r-x 1 anton anton 0 1. Mär 11:24 datei $ chmod 1777 ordner $ chmod a=rwx,o+t ordner $ ls -ld ordner drwxrwxrwt anton anton 4096 1. Mär 10:04 ordner
Wenn das Ausführungsrecht (x) nicht gesetzt ist, wir der entsprechende Buchstabe groß geschrieben
$ chmod u+s datei $ ls -l datei -rwSr---r-- 1 anton anton 0 1. Mär 11:24 datei $ chmod 1776 ordner $ ls -ld ordner drwxrwxrwT anton anton 4096 1. Mär 10:04 ordner
Unter Linux werden Gruppen sehr oft zur Steuerung der Zugriffsrechte auf Dienste verwendet.
$ id uid=500(anton) gid=500(anton) Gruppen=14(uucp),501(vboxusers) $ $ ls -l /dev/ttyS0 crw-rw---- 1 root uucp 4, 64 2. Mär 06:59 ttyS0 $
Anwender die Mitglied der Gruppe uucp sind dürfen auf das Gerät /dev/ttyS0 (serielle Schnittstelle) zurückgreifen.
Durch Eintragung einer Gruppenmitgliedschaft kann damit der Zugriff auf Resourcen gesteuert werden.
Angenommen, dass 3 Anwender an einem Dokumentationsprojekt teilnehmen, dass nur Mitglieder dieser Gruppe auf Zugriff auf die Dateien haben sollen, wäre eine Gruppe doku anzulegen und die Anwender Anton, Berta und Chris als Mitglieder der Gruppe doku zu deklarieren (konfigurieren). Leuten die nicht Mitglieder der Gruppe sind, darf kein Einblick gewährt werden.
Auf dem Verzeichnis .../doku sehen dann Besitztum und Rechte wie folgt aus
$ ls -ld doku drwxrwx--- 1 anton doku 4096 11. November 2008 doku $
Störend ist natürlich, dass Chris eigentlich nur Leserechte haben sollte, da er nur die Dokumentation kontrollieren und nicht ändern darf. Dies geht mit dem standard Rechtemodell von Unix Systemen nicht.
Über ACL kann die Rechtvergabe sehr fein gesteuert werden. Die Access Control Liste ermöglicht es zusätzliche Einträge vorzunehmen und einem Verzeichnis oder einer Datei verschiedene Eigentümer oder Gruppenzugehörigkeiten zuzuordnen.
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.
Eine wichtige Vorraussetzung ist, dass ACL für die eingebundenen Dateisysteme eingeschaltet ist. Gegebenfalls ist in der Datei /etc/fstab die Option acl einzutragen.
Eigentümer | Mitgliedschaft |
---|---|
Vater | Vater Eltern Familie Erwachsene Kinder Gast |
Mutter | Mutter Eltern Familie Kinder Erwachsene |
Sohn | Sohn Familie Kinder |
Tochter | Tochter Familie Kinder |
Kindermädchen | Kindermädchen Kinder Erwachsene |
Gast | Gast |
Ordner | Besitztum | Rechte |
---|---|---|
Vater | Vater : Vater | rwxrwx--- |
Mutter | Mutter : Mutter | rwxrwx--- |
Sohn | Sohn : Sohn | rwxrwx--- |
Tochter | Tochter : Tochter | rwxrwx--- |
Kindermädchen | Kindermädchen : Kindermädchen | rwxrwx--- |
Gast | Gast | rwxrwx--- |
Familienfoto | Vater : Familie | rwxrwxr-x |
Gruselfilme | Vater : Erwachsene | rwxrwx--- |
Finanzen | Vater : Eltern | rwxrwx--- |
Kochrezepte | Mutter : Familie | rwxr-x--- |
Zeichentrickfilme | Kindermädchen : Kinder | rwxr-x--- |
Beim SysV Modell, ist z.B. störend, dass neu angelegte Dateien im Ordner Familienfoto mit einer unpassenden Gruppe erzeugt werden, z.B, Mutter:Mutter.
Beim BSD Modell gehört die Datei zwar Mutter aber die Gruppe ist, wie es in diesem Fall angebracht ist, Familie.
Das BSD Modell kann aber nicht als Non Plus Ultra genommen werden, im Verzeichnis /tmp wäre das nicht optimal.
Mit ACL können die Probleme gelöst werden. Es ist sogar möglich Rechte für Anwender oder Gruppen zurückzunehmen; siehe Kochrezepte und Anwender Tochter.
Unter Linux sind, wie unter einem ordentlichen System, Kommandos vorhanden, dies es erlauben unter einem Terminal die ACL zu setzen oder zu lesen: setfacl und getfacl.
Ein graphisches Frontend eiciel ist ebenfalls vorhanden, muss aber gezielt installiert werden.
Einige wenige Kommandos haben, bei vorhandensein von ACL, eine geringfügige Abweichung vom Standardverhalten:
• ls -l zeigt nach den standard Rechten ein + welches zeigt, dass ACL vorhanden sind.
• mv übernimmt standardmässig die ACL
• cp kopiert die ACL wenn die Option -p (preserve) angegeben wurde
$ ls -l -rw-rw-r--+ anton anton 1234 1. April 11:01 datei -rwxrwxr-x+ anton anton 1234 1. April 11:02 ordner $ getfacl * # file: datei # owner: anton # group: anton user::rw- user:anton:rwx #effective:rw- user:berta:rwx #effective:rw- group::rwx #effective:rw- mask::rw- other::--- # file: ordner # owner: anton # group: anton user::rwx user:anton:rwx user:berta:rwx group::rwx group:anton:rwx mask::rwx other::--- default:user::rwx default:user:anton:rwx default:user:berta:rwx default:group::rwx default:mask::rwx default:other::--- $ $ getfacl -t datei USER anton rw- user anton rwX user berta rwX GROUP anton rwX mask rw- other --- $
Auf unser Beispiel die Dokumentations-Gruppe angewandt, sollte das Hauptverzeichnis doku mit folgenden ACL-Einträgen versehen sein:
$ ls -ld doku drwxrwx---+ 1 anton anton 4096 11. November 2008 doku $ $ getfacl doku # file: doku # owner: anton # group: anton user::rwx user::berta:rwx user::chris:r-x group::rwx mask::rwx other::--- default:user::rwx default:user:anton:rwx default:user:berta:rwx default:user:chris:r-x $
Eine spezielle Gruppenzugehörigkeit ist mit ACL nicht mehr notwendig, kann aber benutzt werden.
$ ls -ld doku drwxrwx---+ 1 anton anton 4096 11. November 2008 doku $ $ getfacl doku # file: doku # owner: anton # group: anton user::rwx user::berta:rwx group::r-x mask::rwx other::--- default:user::rwx default:user:anton:rwx default:user:berta:rwx default:group:doku:r-x $
Eine Steuerung über die Gruppenzugehörigkeit ist auch denkbar
$ ls -ld doku drwxrwx---+ 1 anton anton 4096 11. November 2008 doku $ $ getfacl doku # file: doku # owner: anton # group: anton user::rwx group::r-x mask::rwx other::--- default:user::rwx default:group:redakteur:rwx default:group:doku:r-x $
Die Angehörigen der Gruppe redakteur sind keine Angehöhrigen der Gruppe doku. Redakteur ist eine Gruppe die zum Teil Redundant zur doku Gruppe ist aber mehr Rechte besitzt.
Eiciel kann die Rechte nicht rekursiv setzen (eiciel 0.9.5). Deshalb ist es notwendig die Kommando-Tools zu bemühen.
Das oberste Verzeichnis ist mit den default ACL-Rechten zu versehen. Zusätzlich sind auch Eigentümer, Gruppe usw. entsprechend default auf das Hauptverzeichnis zu setzen.
Nachdem das Hauptverzeichnis mit den gewünschten ACL-Einträgen versehen wurde, können die Rechte rekursiv gesetzt werden:
$ getfacl <dir> | setfacl -R -M- <dir>
$ setfacl -R -b <dir>
entfernt rekursiv (-R Option) alle ACL für den angegebenen Baum. Diese Operation kann natürlich auch auf einzelne Dateien angewandt werden, die Option -R ist dann natürlich nicht anzugeben.
d Defaults kann nur auf Verzeichnisse angewandt werden. Die als Default vorgegebenen ACL-Einträge werden vererbt.
perms (Berechtigung) setzt sich aus den Buchstaben r, w und x zusammen. Wenn keine Rechte vergeben werden ist ein - anzugeben.
<user> und <group> können sowohl als Anwender-/Gruppenname wie als numerischer Wert angegeben werden.
Setzen der Default Rechte auf ein Verzeichnis:
$ setfacl -m d:u::rwx,d:u:anton:rwx,d:u:1000:rwx,o::-,d:m::rwx ordner
Wenn diese Operation auf einen Teilbaum, welcher Dateien und Unterverzeichnisse enthält, angewandt werden soll, ist die Option -R anzugeben:
$ setfacl -R -m d:u::rwx,d:u:anton:rwx,d:u:1000:rwx,o::-,d:m::rwx ordner
Bei diesem Kommando ist es wichtig die Rechte rwx für erzeugende Anwender (d:u::rwx) zu setzen. Diese Rechte werden für neu angelegte Dateien oder Ordner verwendet. Dies gilt analog für g (Gruppe) und o (Rest der Welt).
Die Maske (m::rwx) sollte auch auf rwx gesetzt werden damit in Unterverzeichnisse gewechselt werden kann. Diese Rechte sind die maximalen Rechte die vererbt werden.
Damit die Vererbung der ACL funktioniert, müssen auch Anwender als Default eingetragen werden.
Wenn spezielle Gruppen zur Steuerung der Rechte bei ACL verwendet werden, ist für Gruppen wie für Besitzer zu verfahren.
Setzen der Zugriffsrechte auf eine Datei oder einen Ordner
$ setfacl -m u:1001:rwx ordner $ setfacl -m u:1001:rw datei
Tar und co. kennen keine ACL. Um ACL zu sichern und zu restaurieren kann wie folgt verfahren werden:
$ cd dir $ getfacl -R -n . > .acl $ cd .. $ tar cf dir.tar dir
# tar xpf dir.tar # cd dir # setfacl -R -M .acl dir
Das Setfacl Kommando muss als root ausgeführt werden!
Die bessere Alternative ist es star zu installieren und zu verwenden.
Archivdatei erzeugen:
$ star -c -acl H=xustar f=dir.star dir
Archivdatei entpacken
$ star -x -acl f=dir.star
Rsync beherrscht ACL, muss jedoch unter root Kennung laufen, damit die ACL weitergegeben werden!.
# rsync -aA dir /tmp/
Wenn der Anwender nicht root ist, werden die ACL, entsprechend der im Hauptordner vorgegebenen ACL, gesetzt. Veränderte ACL werden aber nicht berücksichtigt.