Linux Zugriffsrechte
Ich gehöre zu den Leuten für die das Zugriffsrechte System vom Linux anfänglich etwas schwer zu verstehen war. Vielleicht auch weil ich aus der Windows Welt komme? Mittlerweile verstehe ich es und mag es sehr, aber trotzdem vergesse ich oft die einfachsten Dinge. War jetzt 4 lesen oder 2? Wenn es dann um die richtigen umasks geht muss ich nach lesen. Deshalb hier eine kurze Zusammenfassung der Befehle und Werte.
Auf einem Linux/Unix System kann man jeder Datei Zugriffsrechte für 3 "Gruppen" geben. Da Verzeichnisse auch zu den Dateien zählen, gilt das gleich auch für sie. Die erste Gruppe ist der Besitzer (Owner) der Datei, die zweite ist die Gruppe und die dritte ist Global (alle anderen). Für jede dieser Gruppen kann man die Rechte einzeln festlegen.
$ ls -l total 4 drwxr-x--- 2 root root 4096 Mar 15 10:13 dirname1 -rw-r----- 1 root root 0 Mar 15 10:13 file1 -rw-r----- 1 root root 0 Mar 15 10:13 file2
In diesem Beispiel ist der Besitzer der Dateien root und die Gruppe ist auch root. Das es sich bei dirname1 um ein Verzeichnis handelt sieht man an dem d am Anfang. Wenn es ein Link wäre, würde hier ein l stehen. Wirkliche Dateien haben hier ein Minus. Nach dem ersten Zeichen kommen 3 Stellen für die Rechte für den Besitzer, dann kommen die drei Stellen für die Gruppe und dann noch 3 Stellen für den Rest. Die Zugriffsrechte kann man mit Buchstaben bestimmen/erklären oder mit Zahlen. Die Zahlen ergeben sich wenn man die drei Rechte (Schreiben, Ausführen und Lesen) addiert.
| Rechte | Zahlen | Buchstaben |
|---|---|---|
| Ausführbar | 1 | x |
| Schreibbar | 2 | w |
| Lesbar | 4 | r |
| Ausführ- und schreibbar | 3 | wx |
| Ausführ- und lesbar | 5 | rx |
| Schreib- und lesbar | 6 | rw |
| Ausführ-, les- und schreibbar | 7 | rwx |
Möchte man die Rechte anpassen, dann sind chmod, chown und chattr die 3 wichtigsten Befehle im Zusammenhang mit Zugriffsrechten. Die Linux Welt stellt noch einige andere zur Verfügung, aber mit diesen 3 Befehlen kommt man gut aus. Mit chmod kann man die Zugriffsrechte für die schon erwähnten 3 Gruppen anpassen. chown ist zum verändern des Besitzers oder der Gruppe zuständig und mit chattr kann man zusätzliche Attribute setzen oder entfernen.
Beispiele:
# setzt den Besitzer der Datei file1 auf test und die Gruppe auf admin $ chown test:admin file1 # -R steht für recursive und führt den Befehl für alle Ordern und Unterverzeichnisse aus # der Stern sagt das alle Dateien und Ordner im aktuellen Verzeichnis geändert werden $ chown -R test:admin * # setzt die Zugriffsrechte auf Lesen/Schreiben für den Besitzer, Lesen für Gruppe/Global $ chmod 644 file1 # das gleiche geht mit den Buchstaben: # "u" für Besitzer, "g" für Gruppe, "o" für Global und "a" alles # gibt Global das Rechte lesen $ chmod o+r file2 # zum entfernen benutzt man das Minus $ chmod o-r file2 # zum expliziten setzen von Rechten nimmt man das Gleichzeichen $ chmod o= file2 $ chmod u=rwx file2
Da ausführen auf ein Verzeichnis etwas anderes ist als ausführen für eine Datei, sollte man aufpassen wie man es setzt. Ein Verzeichnis muss nicht nur Lesbar sein, sondern auch ausführbar um den Inhalt anzeigen zu können. Wenn man Dateien darin ablegen möchte, dann muss es auch noch Schreibbar sein. Hier ist die 7 also angebracht. Eine normale Datei die nicht ausführbar sein soll, kommt aber mit 6 (lesen/schreiben) aus. Deshalb macht es Sinn den Befehl find zu benutzen will man die Rechte Rekursiv anpassen.
$ find /var/www/vh-example/htdocs -type d -exec chmod 750 {} +
$ find /var/www/vh-example/htdocs -type f -exec chmod 640 {} +
Über -type (d = directory, f = file) wird angegeben für welche Dateien der Befehl chmod ausgeführt werden soll. Ordner bekommen hier all Rechte für den Besitzer und Ausführen/Lesen für die Gruppe. Die Dateien bekommen Lesen/Schreiben für den Besitzer und nur Lesen für die Gruppe. Die anderen dürfen gar nichts!
chattr und ext2/ext3
Bei den ext Dateisystemen kann man Dateien noch weitere Rechte zuweisen, die vom Dateisystem geprüft werden. Das einzige was ich hier für erwähnenswert halte ist das Immutable Bit. Damit ist es möglich unabhängig von den gesetzten Rechten das verändern von Dateien zu verbieten. Nur der root Benutzer kann es setzen und entfernen. Ein Anwendungsbeispiel ist beim fcgid Starter beim Suexec/Apache. Hier muss der Owner des Starters der User sein unter dem man die Scripte ausführen lassen möchte. Man will aber nicht das dieser User den Starter bearbeiten kann. Dies wird durch das setzen des Immutable Bits verhindert.
# setzt das Immutable Bit und zeigt die Attribute (-V) an $ chattr +i -V file1 # entfernt das Immutable Bit $ chattr -i -V file1
Weitere Attribute kann man hier nachlesen.
Umask
Mit dem setzen der Umask (User mask) kann man den Standard Erstellungsmodus für Dateien und Ordner festlegen. Bei der Standardeinstellung 022 bekommen neue Dateien die Rechte 644 und neue Verzeichnisse 755. Das heißt das jeder die Ordner öffnen kann und Dateien anzeigen lassen und jeder neue Dateien lesen kann. Stellt man die umask auf 027, dann werden Verzeichnisse mit 750 und neue Dateien mit 640 angelegt, was sehr viel sicherer ist. Hier ein Beispiel an dem man es besser erkennen kann:
Umask 022:
$ touch test.txt $ ls -ahl -rw-r--r-- 1 root root 0 Dec 10 18:48 test.txt $ mkdir test $ ls -ahl drwxr-xr-x 2 root root 4.0K Dec 10 18:51 test
Umsak 027:
$ touch test.txt $ ls -ahl -rw-r----- 1 root root 0 Dec 10 18:55 test.txt $ mkdir test $ ls -ahl drwxr-x--- 2 root root 4.0K Dec 10 18:54 test
Will man trotzdem einer Datei oder einem Verzeichnis andere Rechte geben, kann man dies immer noch mit chmod machen. Es wird hier sehr gut erklärt.