Zum Inhalt springen

Linux

chmod erklärt: Unix-Dateiberechtigungen ohne Rätselraten

10 Min. Lesezeit

"Warum kann ich diese Datei nicht löschen?" ist die klassische erste Frage unter Linux. Die Antwort ist fast immer: Sie haben Schreibrecht auf die Datei, aber das Verzeichnis, das sie enthält, erlaubt es nicht — und chmod-Zahlen ergeben keinen Sinn, bis man aufhört, 644 als abstrakten Code zu lesen. Sobald man erkennt, dass jede Berechtigungsziffer nur drei Schalter (lesen, schreiben, ausführen) summiert zu einer Zahl ist, erschließt sich das ganze System. Dieser Leitfaden geht von dieser einen Idee weiter zu den oktalen Zahlen, der ls -l-Ausgabe und den Alltagsstandards wie 644 und 755, die Webserver und Home-Verzeichnisse zuverlässig am Laufen halten.

Jede Datei hat drei Zielgruppen: Besitzer, Gruppe, Andere

Jede Datei und jedes Verzeichnis unter Unix trägt eine kleine Karteikarte, wer was darf. Drei Identitäten zählen, und jedes Berechtigungszeichen in einer Auflistung erscheint einmal pro Identität:

  • Besitzer (u) — der Benutzer, der die Datei erstellt hat. Volle Kontrolle wird hier meist vorausgesetzt.
  • Gruppe (g) — Benutzer, die eine Gruppe mit dem Besitzer teilen. Mitgliedschaft ist, wie Teams zusammenarbeiten, ohne alles der Welt zu öffnen.
  • Andere (o) — alle übrigen im System. Die Öffentlichkeit.

An jeder Identität hängen drei Aktionen: lesen (r), schreiben (w) und ausführen (x). Ihre Bedeutung verschiebt sich fein, wenn das Objekt ein Verzeichnis statt einer Datei ist — und genau dort entsteht die meiste Verwirrung.

Die oktalen Zahlen: warum 4, 2 und 1

Die numerische Form von chmod — das, was man tatsächlich tippt — sind drei oktale Ziffern, eine pro Identität, immer in der Reihenfolge Besitzer, Gruppe, Andere. Jede Ziffer ist eine Summe von Aktionswerten: lesen zählt 4, schreiben 2, ausführen 1. Da es Zweierpotenzen sind (4 + 2 + 1 = 7), beschreibt jede Summe von 0 bis 7 eine eindeutige Kombination, niemals eine zweideutige:

OktalSymbolischBedeutung
7rwxLesen, schreiben und ausführen
6rw-Lesen und schreiben, kein Ausführen
5r-xLesen und ausführen, kein Schreiben
4r--Nur lesen
3-wxNur schreiben und ausführen
2-w-Nur schreiben
1--xNur ausführen
0---Keine Berechtigungen

Also ergibt 644: 6 für den Besitzer (lesen + schreiben), 4 für die Gruppe (nur lesen) und 4 für Andere (nur lesen). Der Bindestrich bedeutet schlicht "dieser Schalter ist aus": rw- heißt lesen und schreiben, Ausführen aus.

ls -l lesen: was -rwxr-xr-- bedeutet

Schauen wir auf die erste Spalte von ls -l. Sie ist die Zeichenkette aus zehn Zeichen, die Menschen grundlos einschüchtert:

$ ls -l
-rw-r--r--  1 mustafa web   18740 Sep 16 09:12 index.html
drwxr-xr-x  2 mustafa web    4096 Sep 16 09:12 assets
-rw-------  1 mustafa web     512 Sep 16 09:12 id_rsa

Das erste Zeichen ist der Typ: - für eine normale Datei, d für ein Verzeichnis, l für einen symbolischen Link. Die restlichen neun Zeichen sind drei Dreiergruppen — Besitzer, Gruppe, Andere — jeweils mit fester r-w-x-Reihenfolge und Bindestrich, wo ein Recht fehlt. -rw-r--r-- ist also eine Datei, deren Besitzer lesen und schreiben darf, während alle anderen nur lesen; drwxr-xr-x ist ein Verzeichnis, in dem der Besitzer volle Freiheit hat und Gruppe plus Andere lesen und durchqueren dürfen.

Das Convrs-Werkzeug erzeugt genau diese Zeichenkette aus denselben Häkchen, die Sie von Hand setzen würden — das macht die Zuordnung zwischen "r, w, x anklicken" und dem Endtext leicht verinnerlichbar.

chmod 644 gegen 755: warum Dateien und Verzeichnisse auseinanderlaufen

Die beiden häufigsten chmod-Argumente in der Praxis sind 644 und 755. Beide lassen dem Besitzer volle Kontrolle und geben allen Leserecht; der Unterschied ist das Ausführungsbit für Gruppe und Andere. Bei normalen Dateien ist Ausführen ein seltenes, bewusst gesetztes Privileg — Sie wollen nicht, dass beliebige Dateien ausführbar sind. Bei Verzeichnissen bedeutet es etwas anderes: Durchquerung.

Um in ein Verzeichnis zu gelangen, seinen Inhalt zu listen, eine Datei darin zu öffnen oder etwas darunter zu erreichen, brauchen Sie das x-Bit am Verzeichnis selbst. Es ist nicht optional. Daher die Faustregel der Administratoren:

  • Dateien: 644 (rw-r--r--) — für alle lesbar, vom Besitzer schreibbar, nur ausführbar, wenn es wirklich sein muss.
  • Verzeichnisse: 755 (rwxr-xr-x) — jeder darf hinein und lesen, ändern darf nur der Besitzer.

Dieselben Standards betreiben Webserver

NGINX und Apache servieren Dateien, die der Web-Benutzer lesen kann, innerhalb von Verzeichnissen, die er durchqueren kann: 644 für Dateien, 755 für Verzeichnisse. Private Schlüssel bleiben 600 (nur Besitzer), und Ihr ~/.ssh-Ordner sollte 700 sein — Besitzer liest/schreibt/durchläuft, niemand sonst. Wer das anwendet, hat deutlich weniger Fehler in produktiven Seiten.

Symbolische Notation: u+x, g-w, a=r

Oktal eignet sich hervorragend, um einen kompletten Berechtigungssatz anzugeben; für eine einzige chirurgische Änderung liest sich die symbolische Form besser. Die Syntax ist das Ziel (u Besitzer, g Gruppe, o Andere, a alle), der Operator (+ hinzufügen, - entfernen, = exakt setzen) und die Buchstaben r, w, x. Ein paar Beispiele aus dem Alltag:

$ chmod u+x script.sh        # Besitzer darf ausführen
$ chmod g-w config.php       # Gruppe darf nicht mehr schreiben
$ chmod a=r notes.txt        # alle: exakt lesen, sonst nichts
$ chmod u=rw,g=r,o= file.txt # Besitzer rw, Gruppe r, Andere nichts

a=r ist eine Falle, die man kennen sollte: = setzt exakt, also entfernt a=r jedem das Ausführen und Schreiben — es fügt nicht bloß Lesen hinzu.

Sonderbits: suid, sgid und das Sticky-Bit

Drei Zusatzbits werden selten gebraucht, sollte man aber erkennen. setuid (chmod u+s, in der Ausführen-Spalte des Besitzers als s sichtbar) lässt ein Programm mit den Rechten des Dateibesitzers laufen — so schreibt /usr/bin/passwd in eine Datei, die normale Benutzer nicht anfassen dürfen. setgid (chmod g+s) tut dasselbe für die Gruppe und lässt bei Verzeichnissen neue Dateien die Gruppe des Elternverzeichnisses erben. Das Sticky-Bit (chmod +t, als t sichtbar) erscheint als allerletztes Zeichen: Bei weltweit beschreibbaren Verzeichnissen bedeutet es "jeder darf hier Dateien anlegen, aber nur der Besitzer löscht die eigene." /tmp ist das kanonische Beispiel — ls -ld /tmp zeigt drwxrwxrwt.

Sparsam, bitte

setuid und setgid sind Sicherheitsscheren — ein Fehler gibt unprivilegierten Benutzern erhöhte Rechte. In zwanzig Jahren ändert ein durchschnittlicher Systemadministrator sie seltener, als man denkt.

Moment der Vorsicht: der 777-Reflex

Die größte Quelle berechtigungsbedingter Sicherheitslücken unter Linux sind die chmod -R 777-Kommandos in Stack-Overflow-Antworten. 777 gibt alles jedem, und -R wendet es rekursiv auf jede Datei und jedes Verzeichnis darunter an. Ein einziges fehlplatziertes chmod -R 777 in einem Web-Verzeichnis macht Ihre hochgeladenen Dateien weltweit ausführbar und lässt jedes künftige Skript Ihre Backups lesen.

Die ehrliche Lösung sind selten großzügigere Berechtigungen; es sind falsche Besitzer. Lassen Sie den Webserver als eigenen Benutzer laufen, geben Sie Ihre Dateien diesem Benutzer und überlassen Sie den Rest 644/755. Wenn etwas "permission denied" meldet, maskiert chmod -R 777 das Symptom, statt das eigentliche Besitzer- oder Gruppenproblem zu zeigen.

chmod ohne Raten bei Convrs berechnen

Der chmod-Rechner von Convrs bildet dieselbe Logik ab wie die Tabellen oben: Kreuzen Sie lesen, schreiben und ausführen für Besitzer, Gruppe und Andere an, schalten Sie Datei/Verzeichnis um, und Sie erhalten sofort den oktalen Wert (chmod 644), die symbolische Zeichenkette (-rw-r--r--) und Kopier-Buttons für beides. Alles läuft in Ihrem Browser — die Zahlen, die Sie für einen Produktionsserver berechnen, verlassen nie Ihr Gerät.

Buy me a coffee