Unix Zugriffsrechte

Aus schokokeks.org Wiki
Wechseln zu: Navigation, Suche

Wegen mehrmaliger Nachfragen verschiedener Leute, wie das mit den Zugriffsrechten eigentlich funktioniert, hier eine kleine Einführung.

Zugriffsgruppen

Jede Datei und jeder Ordner kennt drei Zugriffsgruppen: Besitzer (user), eine Gruppe (group) und alle anderen (others oder auch world).

Jede Datei hat einen Besitzer und ist einer Gruppe zugeordnet. Den Besitzer kann man in der Regel nicht ändern, das ist immer der Ersteller. Nur Admins (root) können das ändern. Anders die Gruppe, das kann man auf der Kommandozeile mit dem Befehl chgrp machen. Ist für unseren Server aber nicht relevant, da wir mit ACLs viel flexiblere Möglichkeiten haben.

Für jede dieser 3 Zugriffsgruppen sind die Rechte einstellbar. Dafür gibt es Leserechte (read), Schreibrechte (write) und das Recht, die Datei auszuführen (execute).

Anmerkung: Das Recht Ausführen hat bei Verzeichnissen eine Sonderrolle, es bedeutet nämlich hineinwechseln. Wenn man in einem Verzeichnis also nur das Recht ausführen hat, dann kann man dort zwar hineinwechseln (und auch in Unterverzeichnisse, sofern dort die Rechte entsprechend sind), aber nicht den Inhalt anzeigen. So kann man z.B. das Benutzer-Home-Verzeichnis für den Webserver zugänglich machen, ohne diesem das Recht zu geben, die enthaltenen Dateien anzuzeigen. (siehe auch Webserver-Zugriffsrechte)

Zudem gibt es noch drei Sonder-Rechte, suid, setguid und das sticky-bit. Auf die letzten drei werde ich nicht weiter eingehen, da sie für normale Benutzer nicht relevant sind. Nur soviel: lasst die Finger davon!

Darstellung der Rechte

Oktal- oder Dezimalzahlen

Oft werden Unix-Dateirechte als Zahlen dargestellt. Da soll ein Verzeichnis auf 755 gesetzt werden, oder eine Datei auf 666. Das sieht jetzt so aus als müsste man sich nun hunderte von Zahlen merken, das stimmt aber nicht. Eigentlich sind es nur 3. ;-)

Vorab: Wir rechnen jetzt erstmal mit Binärzahlen. Zumindest sieht man es da sehr gut, wie man rechnen muss. Ich hoffe der Begriff binäres oder ist bekannt? ;-) Ok, ich erklär's ...

Man kann es als Tabelle darstellen:

Recht dezimal /
oktal
binär
Besitzer Gruppe alle anderen
lesen 4 100 100 100
schreiben 2 010 010 010
ausführen 1 001 001 001

Nun muss man lediglich senkrecht zusammenzählen, was man haben will.

So entspricht die Angabe 755 zum Beispiel diesem:

Recht dezimal /
oktal
binär
Besitzer Gruppe alle anderen
lesen 4 100 100 100
schreiben 2 010 010 010
ausführen 1 001 001 001
Gesamt: 4+2+1=
7
4+1=
5
4+1=
5

Das ist schon alles, mehr gibt es da erstmal nicht. Das bedeutet lediglich, man hat eine 3-stellige Zahl (ob oktal oder dezimal ist in dem Moment egal, es geht eh nicht über 7) und jede Stelle zeigt für sich genommen das Recht einer der oben genannten Gruppen an.

als Text

Alternativ werden Rechte auch oft mit einer 10-stelligen Buchstaben-Kette angegeben. Wenn alle Zeichen benutzt werden, sieht das etwa so aus:

drwxrwxrwx

Dabei ist das erste Zeichen erstmal irrelevant, es zeigt in diesem Fall (d) an, dass wir es mit einem Verzeichnis zu tun haben. Die folgenden 9 Zeichen sind dagegen eine andere Darstellung für das oben genannte. Auch hier gibt es 3 Blöcke, diesmal à 3 Stellen. Jeder Buchstabe kann da sein oder nicht da sein (Sonderfälle wollen wir hier nicht behandeln). Das oben genannte 755 würde also in dieser Darstellung für ein Verzeichnis so aussehen:

drwxr-xr-x

und für eine Datei so:

-rwxr-xr-x

Solange es um klassische Unix-Zugriffsrechte geht, sind diese beiden Darstellungen identisch, man kann mit beiden die Zugriffsrechte beschreiben, die normalerweise wichtig sind.

Wenn man nun aber mit ACLs arbeitet (siehe weiter unten), dann verwendet man in aller Regel die Darstellung als Text.


Ändern der Rechte

chmod

Der Befehl chmod erlaubt das Ändern der angesprochenen klassischen Unix-Zugriffsrechte. Er erlaubt die Angabe des gewünschten Zugriffsrechts entweder als 3-stellige Zahl (wie oben, z.B. 755) oder als Zeichen. Dabei können bei chmod einzelne Rechte auch einzeln gesetzt oder gelöscht werden. Das funktioniert folgendermaßen:

chmod [option] [u|g|o|a][+|-][r|w|x]
Legende:
u: user (Besitzer), g: group (Gruppe), o: others (alle anderen), a: all (alle Rechte gleichzeitig ändern)
+: das nachfolgend angegebene Recht wird neu gesetzt, -: Das angegebene Recht wird gelöscht
r: read (Lesen), w: write (Schreiben), x: execute (Ausführen; in ein Verzeichnis hineinwechseln)

Es kann also explizit gesagt werden "Ich will, dass die Datei nicht mehr für andere schreibbar ist", das wäre dann der Befehl chmod go-w <datei>. Die übrigen Rechte (z.B. Leserecht oder Ausführen) bleiben davon gänzlich unberührt.

Alternativ versteht chmod natürlich auch Oktalzahlen, dabei kann man z.B. mit chmod 644 <datei> eine Datei so einstellen, dass man selbst zwar lesen und schreiben darf, andere aber nur lesen dürfen.


ACL (Access Control Lists)

Um detailliertere Zugriffsrechte zu setzen, gibt es die Möglichkeit der Access Control Lists. Diese erlauben, das Recht nicht nur für den Besitzer, die Gruppe und alle anderen zu setzen sondern es wird damit möglich, gezielt einem oder mehreren bestimmten Benutzer(n) oder einer oder mehreren bestimmten Gruppe(n) Zugriff zu erlauben. So werden beispielsweise die Zugriffsrechte für den Apache-Webserver bei uns eingestellt. (siehe Webserver-Zugriffsrechte)

ACL setzen

Um eine neue ACL für eine Datei zu erstellen oder eine bestehende zu bearbeiten, wird der Befehl setfacl -m benutzt.

Beispiele:

setfacl -m u:[user]:r [file]

Gibt dem User [user] Lesezugriff auf die Datei [file].

setfacl -m g:[group]:rw [file]

Gibt allen Nutzern der Gruppe [group] Lese- und Schreibzugriff auf die Datei [file].


Vererbte Standard-Rechte setzt man mit dem Präfix default:

setfacl -m default:u:apache:rx /home/[user]/websites

gibt dem Benutzer apache sämtlichen in dem Verzeichnis "websites" neu angelegten Dateien und Ordnern die Rechte rx.

ACL anzeigen

getfacl zeigt die ACL einer Datei an.

getfacl [file]