Das Symptom
In /tmp liegt eine große, offensichtlich verwaiste Datei eines Kollegen und belegt
Platz. Ein Blick auf das Verzeichnis beruhigt: Die Rechtemaske lautet drwxrwxrwt, alle
dürfen lesen, schreiben, betreten. Also weg damit. rm verweigert trotzdem, mit
Operation not permitted oder mit Permission denied. Mit sudo klappt es
sofort, was den Verdacht nährt, mit den Rechten auf dem System sei etwas kaputt.
Die Kehrseite derselben Verwechslung trifft Admins: Für ein Team wird ein gemeinsames Ablageverzeichnis angelegt, großzügig mit chmod 777, damit niemand an Rechten scheitert. Ein paar Wochen später sind Dateien verschwunden oder umbenannt, und niemand will es gewesen sein. Technisch durfte es jeder.
Die „Layer 8“-Wahrheit
Im letzten Zeichen von drwxrwxrwt steckt mehr als ein Ausführrecht: Das t zeigt ein eigenes Bit an. chmod(1) nennt es das restricted deletion flag oder Sticky-Bit und beschreibt seine Wirkung auf Verzeichnisse genau: „For directories, it prevents unprivileged users from removing or renaming a file in the directory unless they own the file or the directory“. Der Satz endet mit dem Hinweis, dass man es üblicherweise auf weltweit beschreibbaren Verzeichnissen wie /tmp findet. Genau dafür ist es da.
Der Denkfehler liegt in der Annahme, Schreibrecht auf ein Verzeichnis sei Schreibrecht auf alles darin. Ohne Sticky-Bit stimmt das für das Löschen sogar: Wer ein Verzeichnis beschreiben und betreten darf, darf darin Namen entfernen, auch fremde. Mit Sticky-Bit nicht mehr. inode(7) zählt abschließend auf, wer dann löschen oder umbenennen darf: „only by the owner of the file, by the owner of the directory, and by a privileged process“. Der Kollege darf, root darf, man selbst nicht. Die Fehlermeldung ist dabei nicht einmal eindeutig. unlink(2) führt für diesen Fall „EPERM or EACCES“ auf, und errno(3) nennt dazu die beiden Texte: Operation not permitted beziehungsweise Permission denied. Die zweite Meldung klingt nach fehlendem Schreibrecht, obwohl genau das vorhanden ist.
Für das Teamverzeichnis gilt dasselbe Prinzip von der anderen Seite. 777 gibt allen alles, einschließlich des Löschens fremder Dateien. Die erste von vier Ziffern der Oktalschreibweise ist laut chmod(1) für Set-User-ID, Set-Group-ID und eben dieses Bit zuständig; 1777 heißt also: alle dürfen schreiben, aber jeder räumt nur seine eigenen Dateien weg. Wer das will, setzt es mit chmod +t nachträglich, ohne die anderen Rechte anzufassen.
Das Bit schützt dabei nicht den Inhalt, sondern den Namen im Verzeichnis. Ob jemand eine fremde Datei beschreiben darf, entscheiden ihre eigenen Rechte, und je nach Einstellung zusätzlich die Linux-Sperre protected_regular, die in solchen Verzeichnissen greift. Ein drwxrwxrwt ist also kein Freibrief, sondern eine Hausordnung: Jeder darf rein, jeder darf etwas abstellen, aber weggeräumt wird nur das Eigene.