Drei Triaden, je drei Bits
Jede Unix-Datei trägt neun Berechtigungsbits, angeordnet als drei Gruppen zu je dreien. Die erste Triade gehört dem Dateibesitzer, die zweite der Dateigruppe und die dritte allen anderen auf dem System. Innerhalb jeder Triade bedeuten die Bits Lesen, Schreiben und Ausführen, und sie sind wert 4, 2 und 1. Die Addition der Werte der gewünschten Bits ergibt eine einzelne Ziffer von 0 bis 7, weshalb Berechtigungen traditionell als drei oktale Ziffern geschrieben werden.
Das ist der ganze Trick hinter einer Zahl wie 755. Die Besitzer-Ziffer ist 7, also 4 + 2 + 1, sodass der Besitzer lesen, schreiben und ausführen darf. Die Gruppen- und Andere-Ziffer sind beide 5, also 4 + 1, sodass sie lesen und ausführen, aber nicht ändern dürfen. Symbolisch geschrieben lautet derselbe Wert rwxr-xr-x, genau das, was ls -l nach dem führenden Dateityp-Zeichen ausgibt.
Die drei Verben bedeuten bei einem Verzeichnis etwas anderes. Lesen lässt dich die Namen darin auflisten, Schreiben lässt dich Einträge erstellen und löschen, und Ausführen lässt dich hindurch navigieren, um einen Pfad zu erreichen, den du bereits kennst. Ein Verzeichnis mit Lesen, aber ohne Ausführen ist fast nutzlos: du kannst die Namen sehen, aber nichts dahinter öffnen.
Die Werte, die du tatsächlich eintippst
Eine Handvoll Kombinationen deckt die meiste reale Arbeit ab. 644 (rw-r--r--) ist der normale Modus für ein Dokument oder eine Quelldatei: der Besitzer bearbeitet sie, alle anderen lesen sie. 755 (rwxr-xr-x) ist der normale Modus für ein Verzeichnis oder ein ausführbares Skript, weil beide das Ausführ-Bit brauchen, um überhaupt nutzbar zu sein. 600 (rw-------) hält eine Datei privat für ihren Besitzer, was OpenSSH für private Schlüssel verlangt, und 700 macht dasselbe für ein Verzeichnis.
Modi, die anderen Schreibzugriff gewähren, verdienen einen zweiten Blick. 777 lässt jedes Konto auf dem Rechner die Datei überschreiben oder löschen, und es ist fast nie die richtige Antwort – es ist einfach der schnellste Weg, einen Berechtigungsfehler ohne Verständnis dafür verschwinden zu lassen. Wenn ein Webserver nicht in ein Upload-Verzeichnis schreiben kann, ist der echte Fix meist, den besitzenden Benutzer oder die Gruppe mit chown zu ändern, nicht die Datei für die Welt zu öffnen.
Berechtigungen interagieren auch mit der umask. Neue Dateien werden mit einem Standardmodus erstellt, der um den umask-Wert (üblich 022) verringert ist, weshalb eine frisch erstellte Datei eher als 644 statt 666 ankommt.
Setuid, setgid und das Sticky-Bit
Eine vierte Ziffer kann vor den drei vertrauten stehen, und sie trägt drei Sonderbits: setuid (4), setgid (2) und das Sticky-Bit (1). Sie ändern, als wer ein Programm läuft und wie ein Verzeichnis die darin erstellten Dateien behandelt.
Setuid auf einer ausführbaren Datei lässt sie mit den Rechten des Dateibesitzers statt des Benutzers laufen, der sie startete. So kann passwd eine systemweite Datei aktualisieren, während ein unprivilegierter Benutzer sie ausführt, und das ist auch, warum setuid-Binärdateien so sorgfältig geprüft werden – ein Fehler darin ist ein direkter Weg zu den Rechten des Besitzers. Setgid macht dasselbe für die Gruppe. Auf einem Verzeichnis hat setgid eine freundlichere Bedeutung: neue Dateien, die darin erstellt werden, erben die Gruppe des Verzeichnisses, was einen gemeinsamen Projektordner konsistent hält, egal wer hineinschreibt.
Das Sticky-Bit ist am bekanntesten für /tmp, üblicherweise geschrieben 1777. Es erlaubt jedem, Dateien im Verzeichnis zu erstellen, beschränkt aber das Löschen auf den jeweiligen Besitzer der Datei, sodass Benutzer einander ihre temporären Dateien nicht entfernen können. In einer langen Auflistung ersetzen diese Bits das Ausführ-Zeichen: ein s an Stelle von x bedeutet, dass setuid oder setgid gesetzt ist, ein großes S bedeutet, dass das Bit gesetzt ist, während Ausführen nicht gesetzt ist, und t markiert das Sticky-Bit.