Unix Zugriffsrechte
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].
ACL anzeigen
getfacl zeigt die ACL einer Datei an.
getfacl [file]