Um den ganzen Sinn von User- und Gruppenmechanismen zu durchblicken ist es notwendig, das Dateikonzept von Unix etwas genauer zu durchleuchten. Die Zugriffsrechte, also die Frage, welche User was mit einer Datei anfangen können, sind für jede Datei einzeln gesetzt. Jede Datei im System, jedes Unterverzeichnis und jede Gerätedatei haben diese Zugriffsrechte und sind damit einstellbar. Wie das im konkreten funktioniert soll hier beschrieben werden.
Jede Datei hat, wie wir schon bei den Unix-Dateisystemen gesehen haben, neben den normalen Angaben, die wir von DOS her kennen wie Dateiname, Größe, Datum, noch mehrere andere Attribute. Interessant sind in diesem Zusammenhang hier für uns die Attribute Eigentümer, Gruppenmitgliedschaft und Zugriffsmodus. Eigentümer Jede Datei im System (wirklich jede, auch Verzeichnisse, Gerätedateien usw.) hat einen Eigentümer. Dabei handelt es sich bei Systemdateien immer um den Systemverwalter, normale Dateien gehören dem User, der die Datei angelegt hat. Der Eigentümer ist über seine UserID (UID) angegeben, d.h. jede Datei hat eine 16 Bit Zahl, die den Eigentümer bezeichnet. Gruppenmitgliedschaft Jede Datei gehört genau einer Gruppe an. In der Regel ist das die Standardgruppe des Users, der die Datei angelegt hat, das ist aber nicht zwingend. Es ist nicht einmal vorgeschrieben, dass der Eigentümer einer Datei Gruppenmitglied der Gruppe ist, der die Datei angehört. Auch die Gruppenzugehörigkeit wird über eine 16 Bit Zahl, die GroupID (GID) dargestellt. Zugriffsmodus Jede Datei hat eine 16 Bit Zahl, die den Zugriffsmodus bestimmt, wie auf sie zugegriffen werden kann und welchen Typ sie hat. Diese Zahl ist in 5 Oktalziffern aufgeteilt, die den Typ und die einzelnen Rechte darstellen.
Genaueres zum Zugriffsmodus
Das Prinzip des Zugriffsmodus wurde bei den Dateisystemen schon erklärt. Jede Datei hat ein rwx-triple, für den Eigentümer, für ein Gruppenmitglied der Gruppe, der die Datei angehört und für den Rest der Welt. Dabei steht r für Lesen und hat den Wert 4, w für Schreiben mit dem Wert 2 und schließlich x für Ausführen (execute) mit dem Wert 1.
Es existieren drei wesentliche Befehle zum Manipulieren dieser Dateieigenschaften.
- chown zum Wechseln des Eigentümers einer Datei
- chgrp zum Wechseln der Gruppenzugehörigkeit einer Datei
- chmod zum Wechseln des Zugriffsmodus einer Datei
Neben den drei üblichen Zugriffsrechten für User, Group und Rest gibt es noch ein viertes, das auch ausgesprochen wichtig für die Systemverwaltung ist. Die normale Darstellung eines Zugriffsrechts geschieht ja numerisch mit den Oktalziffern. Normalerweise werden drei Oktalziffern verwendet, es gibt aber noch eine vierte, führende Ziffer. Eigentlich müsste der Zugriffsmodus 640 eigentlich also 0640 heißen.
Diese führende Ziffer hat nur Bedeutung für Programme bzw. Unterverzeichnisse. Die einzelnen Werte bedeuten:
Ziffer | Bedeutung |
---|---|
4 | Das Substitute UserID-Bit ist gesetzt |
2 | Das Substitute GroupID-Bit ist gesetzt |
1 | Das Sticky-Bit ist gesetzt |
Im Einzelnen haben diese drei Bits folgende Bedeutung: Substitute UID (SUID) Ein Programm, das dieses Bit gesetzt hat wird nicht unter der UID des Users ausgeführt, der das Programm aufgerufen hat sondern unter der UID des Eigentümers des Programms. Ein kurzes Beispiel mag das verdeutlichen.
Das Programm passwd erlaubt es jedem User sein Passwort zu verändern. Das ist vernünftig, sonst müßte jedesmal der Systemverwalter diese Aufgabe erledigen und der sollte die Passwörter ja auch nicht kennen. Die Passwörter werden aber verschlüsselt in der Datei /etc/shadow gespeichert, auf die ein Normaluser weder lesenden noch gar schreibenden Zugriff hat. Damit ein Normaluser trotzdem sein Passwort ändern kann, hat das Programm passwd als Eigentümer root und es hat das Substitute UserID Bit gesetzt. Das Programm wird also nicht unter der UID des Users ausgeführt, der es aufruft sondern unter der UID des Users, dem das Programm gehört – hier also root. Damit kann das Programm schreibend auf die Datei /etc/shadow zugreifen.
In diesem Fall kann kein Unfug mit dieser Fähigkeit getrieben werden, weil das Programm passwd ja sowieso nur das Passwort des Users ändern kann, der es aufruft. Schlimm wird es, wenn ein Programm mit Ausgang zur Shell mit dem SUID-Bit läuft. Dann hätte jeder User root-Rechte, der das Programm ausführt – sofern das Programm root gehört. Substitute GroupID (SGID) Dieses Bit erfüllt die exakt gleiche Aufgabe wie das SUID-Bit, nur dass es sich nicht um die UserID sondern um die GroupID handelt. Ein User, der ein Programm ausführt, dessen SGID-Bit gesetzt ist, führt dieses Programm nicht unter seiner GID aus, sondern unter der GID des Programmes. Sticky-Bit Früher, auf alten Großrechneranlagen gab es das Problem, dass ein Programm nur sehr langsam in den Arbeitsspeicher geladen wurde (Magnetbänder). Damit ein häufig benutztes Programm nicht jedesmal wieder geladen werden mußte, konnte man es sticky (klebrig) machen, es blieb also nach der Ausführung im Speicher erhalten.
Heute hat das Sticky-Bit eine andere Aufgabe, die ausschließlich Verzeichnisse betrifft. In einem Verzeichnis, dessen Sticky-Bit gesetzt ist, kann ein Normaluser – auch wenn er Schreibrechte in diesem Verzeichnis besitzt – Dateien nicht löschen.
Voreingestellter Zugriffsmodus
Es bleibt jetzt natürlich die Frage, welche Zugriffsberechtigungen beim Anlegen einer Datei verwendet werden. Um das festzulegen, kennt Unix das Kommando umask, dessen Anwendung aber etwas merkwürdig ist.
Der Befehl umask erwartet eine Maske als Parameter, die sich auf den Zugriffsmodus bezieht, den neu zu erstellende Dateien bekommen sollen. Das Wort Maske bedeutet, dass nicht die Werte eingegeben werden, die gesetzt werden sollen, sondern umgekehrt, die Werte, die nicht gesetzt (maskiert) werden sollen. Die einfachste Möglichkeit besteht darin, die gewünschten oktalen Werte jeweils von 7 abzuziehen:
Wollen wir z.B. dafür sorgen, dass alle unsere Dateien die Zugriffsberechtigung rw-r—– bekommen, also Lese-und Schreibrecht für den Eigentümer, Leserecht für Gruppenmitglieder und keine Rechte für den Rest der Welt, dann entspräche das der oktalen Darstellung 640.
Die dafür notwendige umask wäre dann:
7-6=1
7-4=3
7-0=7
Mit dem Befehl
umask 137
würden also alle Dateien, die wir anlegen die gewünschte Zugriffsberechtigung 640 bekommen. Das hat noch einen kleinen Haken, weil die Verzeichnisse, die wir erstellen würden auch diesen Modus bekämen. Damit wäre für uns selbst das Durchsuchungsrecht (x) nicht gesetzt. Unix hat aus diesem Grund dafür den Mechanismus entwickelt, dass selbst wenn im umask-Kommando das x-Recht gesetzt ist, beim Erzeugen von normalen Dateien dieses Recht nicht gesetzt wird, beim Erzeugen von Verzeichnissen hingegen schon. Ein vernünftiges umask-Kommando setzt also zumindestens für den Eigentümer auch das x-Recht. Damit wäre ein typischer Wert für umask z.B. 022 (rwxr-xr-x) oder 027 (rwxr-x—).
Neben dieser umständlichen Methode gibt es aber auch die symbolische Form, die die Rechte direkt bezeichnet. Sie wird in der Form u=…,g=…,o=… eingegeben, wobei für … immer die entsprechenden Rechte eingesetzt werden. Also würde der Befehl
umask u=rwx,g=rx,o=
die gleiche Wirkung haben wie
umask 027