Alles Recht
Sticky, SUID, SGID – Sonderrechte für Dateien und Verzeichnisse
Unter falscher Flagge
Ausnahmsweise nicht auf Verzeichnisse, sondern ausschließlich auf ausführbare Dateien bezieht sich das SUID-Bit, also das s-Bit, das im Tripel der Eigentümerrechte gesetzt wird. Es sorgt dafür, dass Linux das entsprechende Programm nicht mit den Rechten des aufrufenden Users, sondern mit denen der Datei-Besitzerin ausführt. So läuft beispielsweise das passwd-Programm zum Ändern des Passworts effektiv immer mit root-Rechten, selbst wenn es von unprivilegierten Usern aufgerufen wird:
pjung@linux:~> ls -al /usr/bin/passwd -r-sr-xr-x 1 root bin 8735 Feb 17 2000 /usr/bin/passwd
Der Grund: Beim Setzen des Passworts muss die Passwortdatei geändert werden. Diese darf aber nicht für alle Welt schreibbar sein, sonst wäre dem Schabernack mit fremden Passwörtern Tür und Tor geöffnet. Liefe das passwd-Programm hingegen wie üblich mit den Rechten der Aufrufenden, so kann es natürlich nur Dateien ändern, für die diese Benutzerin Schreibrechte hat, also sicher nicht die Passwortdatei. Aus dem Dilemma hilft das SUID-Bit: Das passwd-Programm bekommt für die Dauer seiner Tätigkeit root-Rechte und darf somit das Passwort austauschen.
Doch so hilfreich das SUID-Bit ist, so gefährlich ist es auch: Wenn ein mit SUID-Rechten laufendes Programm nicht sauber programmiert ist, bietet es Hackern u. U. Angriffsmöglichkeiten. Im schlimmsten Fall heißt das, dass der unter Fremdrechten laufende Prozess weitere Programme mit den privilegierteren Rechten ausführt und/oder dem aufrufenden User eigentlich nicht zugängliche Dateien manipuliert. Deshalb ist es aus Sicherheitsgründen angeraten, das SUID-Bit sehr sparsam zu vergeben. Bei Shell-Skripten wirkt es vorsichtshalber gar nicht.
Was mit User-Berechtigungen geht, funktioniert auch bei Gruppen: Setzt man das SGID-Bit für ausführbare Dateien, laufen entsprechende Prozesse "im Namen" der Besitzergruppe, also effektiv mit deren Rechten. Voraussetzung ist nur, dass der aufrufende User die Datei auch ausführen darf.
Sonderrechte einräumen
Ob nun rwx oder s und t – Rechte vergibt oder entzieht das Kommando chmod (change mode). Wie bei den Lese-, Schreib- und Ausführbarkeitsrechten geht das mit den arithmetischen Operationen +, - und =: chmod u-s programmdatei entfernt das SUID-Recht von einem Programm, chmod g+xs verzeichnis verteilt das SGID-Bit gleichzeitig mit dem Verzeichniswechselrecht für die Inhabergruppe und chmod o=rwxt verzeichnis setzt das für alle anderen User gedachte Rechtetripel auf rwt.
Fehlt dem Sonderrecht das "darunterliegende" x-Bit, macht ls dies durch einen Großbuchstaben S bzw. T an der entsprechenden Stelle deutlich.
Natürlich lassen sich die Spezialrechte auch in Oktalschreibweise setzen. So wie dem Leserecht r der Wert 4, dem Schreibrecht w der Wert 2 und dem x-Bit die 1 zugeordnet sind, bekommen auch sie Zahlen-Äquivalente:
- 1 für das
t-Bit (Sticky Bit), - 2 für das SGID-Bit und
- 4 für das SUID-Bit.
Damit sich diese nicht mit rwx beißen, addiert man sie nicht etwa zur Summe der Eigentümer-, Gruppen- oder Anderen-Rechte hinzu, sondern summiert sie in einem eigenen, vierten Wert zusammen: chmod 1777 verzeichnis sorgt genauso wie chmod u,g=rwx,o=rwxt dafür, dass verzeichnis die Rechte rwxrwxrwt bekommt: Die erste Ziffer steht für die Summe der Sonderrechte, hier also 1 für t, die zweite zählt die "normalen" Rechte der Eigentümerin zusammen (r+w+x=4+2+1=7), die dritte die der Gruppe und die letzte die der Anderen. Soll das Verzeichnis noch das SGID-Bit hinzubekommen (rwxrwsrwt), lautet der Befehl chmod 3777 verzeichnis. Die oben aufgelisteten Rechte von /usr/bin/passwd hingegen (r-sr-xr-x) wurden sicher einmal mit chmod 4555 /usr/bin/passwd gesetzt.
Glossar
ls
Das Kommando /bin/ls kann man deshalb einfach mit seinem Dateinamen ls ("list") aufrufen, weil das Verzeichnis /bin im Suchpfad steht. Gibt man die Option -a mit an, listet es auch versteckte Dateien mit auf. Die Option -l erzwingt ein "langes Listing", bei dem zum Beispiel die Rechteangaben mit aufgeführt werden. Mit -d sagt man ls, dass nicht der Inhalt des als Argument angegebenen Verzeichnisses interessiert, sondern nur die Angaben zum Verzeichnis ("directory") selbst.
grep
Dieses Kommandozeilenprogramm sucht eine angegebene Zeichenkette (genauer gesagt: einen regulären Ausdruck) in einer Datei (oder den Daten von der Standardeingabe). Sofern man seine Funktionsweise nicht mit Optionen modifiziert, gibt es die Zeilen aus, in denen der Suchausdruck vorkommt.



