Unix Dateirechte

Einführung

Da ich nun schon öfters darauf angesprochen wurde und auch leider kein Link auf der Projektseite existiert, habe ich mich mal eben hingesetzt, um den Neulingen unter den Unix-Anwendern das Konzept der Dateirechte unter Unix näher zu bringen.

Grundlagen

Jede Datei und jedes Verzeichnis hat unter Unix verschiedene Zugriffsrechte. Lässt man sich mal ein Verzeichnis mit ls -l anzeigen, so hat die Ausgabe ungefähr folgendes Aussehen:

philipp@P150:/home/philipp/gdi1 > ls -l
total 60
-rw-r--r--   1 philipp  users       23215 Feb 27 22:17 objio.zip
drwxr-xr-x   5 philipp  users        1024 Feb 27 22:24 project/
-rw-r--r--   1 philipp  users       34816 Feb 27  1995 x.tar
lrwxrwxrwx   1 philipp  users          18 Feb 27 22:00 test -> /test
-rwxr-xr--   2 philipp  student       135 Jan 12 13:55 help.perl

Das bedeutet in etwa folgendes:

Verzeichniseinträge
Spalte 1 2 3 4 5 6 7
Bedeutung Rechte Hardlinks Besitzer Gruppe Größe Datum Dateiname
Beispiel -rwxr-xr-- 5 philipp student 1024 Feb 27 1995 objio.zip

Wir wollen uns aber zunächst nur mit den Rechten, dem Besitzer und der Gruppe beschäftigen.

Besitzer

Jede Datei bzw. jedes Verzeichnis gehört einem Besitzer. Er kann die Rechte für eine andere Gruppe und alle übrigen Benutzer festlegen.

Beachte die Unterscheidung zwischen Besitzer einer Datei und deren Benutzer: Der Besitzer stellt eine Ressource (Programm,Information) zur Verfügung, die dann von anderen Benutzern genutzt werden kann. Der Besitzer entscheidet deswegen auch, wer wie was mit seiner Ressource machen darf.

Gruppe

Zunächst gehört jeder Benutzer (mindestens) einer Gruppe an. Diese Gruppenzugehörigkeit wird meistens so eingerichtet, das Personen, die am gleichen Projekt arbeiten, in einer gemeinsamen Gruppe sind. Jede Datei ist exakt einer Gruppe zugeordnet, für deren Mitglieder (bis auf den Besitzer dann die sog. Gruppenrechte der Datei gelten.

Typ und Rechte

Die 1. Angabe ist noch einmal in verschiedene Sparten unterteilt:

t rwx rwx rwx

Die 1. Spalte gibt den Typ des Eintrags an:

-
Normale Datei
l
Soft-Link: ein Verweis auf einen Dateinamen
d
Verzeichnis: Container für weitere Einträge
c
Zeichen-orientiertes Gerät, z.B. Modems
b
Block-orientiertes Gerät, z.B. Festplatte
s
UNIX-Socket: dient der lokalen bidirektionalen Kommunikation mit einem Programm
p
Pipe: dient dem unidirektionalen Austausch zwischen zwei Programmen ähnlich der anonymen Pipe |

So dann folgen 3 Blöcke à 3 Zeichen. Der 1. Block gibt dabei die Rechte für den Besitzer an, der 2. Block die Rechte für die Benutzer, die zu der Gruppe gehören, und der 3. Block gibt die Rechte für alle übrigen Benutzer an.

Jeder dieser 3 Blöcke hat dabei folgende Bedeutung:

Zugriffsrechte
Zeichen Bedeutung Oktal Beschreibung
r Leserechte 0444 Der Benutzer kann sich die Datei und das Verzeichnis anzeigen lassen
w Schreibrechte 0222 Der Benutzer kann die Datei verändern und überschreiben bzw. Dateien in dem Verzeichnis anlegen oder dieses löschen
Dateien
x Ausführrechte 0111 Die Datei ist ein Programm, das direkt ausgeführt werden kann. Für Binär-Programme (ELF,COEFF,…) reicht alleine das Ausführrechte, Skript-Programme (Shell,Perl,Python,…) müssen zusätzlich auch das Leserecht haben!
s Start als Besitzer 4000 Das Programm wird so gestartet, als ob es der Besitzer der Datei starten würde
s Start als Gruppe 2000 Das Programm wird so gestartet, als ob ein Gruppenmitglied die Datei aufrufen würde
Verzeichnisse
x Suchrecht 0111 Der Anwender darf in das Verzeichnis wechseln und auf Einträge zugreifen, die er bereits (anderweitig) kennt
s Gruppenbesitz 2000 Alle Dateien, die in das Verzeichnis geschrieben werden, gehören automatisch der Gruppe, der auch das Verzeichnis gehört
t Löschschutz 1000 Nur der Besitzer der Dateien kann diese löschen, auch wenn andere Benutzer Schreibrechte auf das Verzeichnis haben

Die Zugriffsrechte können statt in der symbolischen Schreibweise auch direkt als Oktalwert angeben: Im Gegensatz zu dem sonst übliche Zehner-System mit den Ziffern 0 bis 9 nutzt das Oktal-System nur die Ziffern 0 bis 7. Damit lassen sich 8 Zustände kodieren, was genau den 8 Möglichkeiten der Rechte pro Besitzer, Gruppe und Anderen entspricht. Die 4. (vorderste Stelle links) kodiert dabei ggf. die zusätzlichen SUID, SGID und Sticky-Bits, die im nächsten Abschnitt genauer beschrieben werden. Für die Berechnung des Oktalwertes müssen lediglich pro Block jeweils die Werte 4 für das Leserecht, 2 für das Schreibrecht und 1 für das Ausführ- bzw. Suchrecht addiert werden.

Symbolische und Oktalschreibweise der Rechte
Sonderrechte Besitzer Gruppe Rest
Rechte SUID SGID Sticky r w x r w x r w x
Oktal
ls
chmod u=, g=, o=

SUID und SGID

Die SUID- (Set User Identifier) bzw. SGID-Funktionalität (Set Group Identifier) ist eigentlich nur für Programme interessant, ist aber auch nicht ungefährlich. Bei einigen Anwendungsfällen kann es sein, daß die Rechte, die ein normaler Benutzer hat, nicht ausreichen. Durch das Setzen des SUID-Bits erhält das Programm bei Ausführung die Rechte, die der Besitz des Programms normalerweise hat. Das SGID-Bit dagegen sorgt dafür, das das Programm bei Ausführung zusätzlich in die Gruppe aufgenommen wird, die die Datei hat.

Klassisches Beispiel ist die Datei /etc/shadow, in der die Passwörter gespeichert sind: Normale Benutzter sollen sie nicht auslesen oder beliebig verändern können, wollen aber dennoch ihr eigenes Passwort ändern können. Deshalb gehört die Datei dem Benutzer root, ist der Gruppe shadow zugeordnet und hat die Rechte 0640. Damit hat zunächst nur root die notwendigen Rechte, die Datei zu verändern.

Damit auch andere Personen ihr Passwort ändern können, hat root das vertrauenswürdige Programm /usr/bin/passwd installiert. Vertrauenswürdig heißt hier, daß dieses Programm ein sehr begrenztes Funktionsspektrum besitzt und nur eine Aufgabe ausführt, die aber sehr sicher. Es überprüft neben dem aufrufenden Benutzer auch die Dateirechte und den Dateiinhalt von /etc/shadow, damit es nicht fälschlicherweise ausgetickst oder missbraucht wird, um andere Benutzerpasswörter oder Dateien zu verändern.

Jeder Benutzer kann dieses Programm aufrufen, da es die Rechte 4755 hat. Ohne das SUID-Bit würden allerdings die Rechte des aufrufenden Benutzers gelten, der /etc/shadow nicht einmal lesend öffnen darf. Durch das gesetzte SUID-Bit hat root allerdings seine Rechte an das Programm delegiert: Bei der Ausführung wird so getan, als ob root das Programm selber ausführen würde, wodurch das Programm die nötigen Rechte hat, /etc/shadow auch zu verändern. So hat jeder Benutzer die Möglichkeit, sein Passwort zu ändern.

Da SUID- und SGID-Bit nur bei Programmen mit Ausführrecht bzw. SGID auch bei Verzeichnissen mit Suchrecht Sinn macht, werden die gesetzten Bits dadurch angezeigt, daß das Benutzer-x-Bit bzw. Gruppen-x-Bit durch jeweils ein kleines s ersetzt werden. Sind die zugehörigen x-Bits jedoch nicht gesetzt, wird stattdessen ein großes S angezeigt.

Hardlinks, Verzeichnisse und das Löschen von Datei

Man sollte verstehen, daß Linux zwischen der Datei selbst und ihren Namen unterscheidet. Jede Datei hat zunächst nur eine eindeutige Nummer, die sog. INode-Nummer. Über diese Nummer kann man eine Datei nicht direkt ansprechen, sie dient nur innerhalb des Betriebssystemkerns für die Identifizierung der Datei. Damit auf ein solches Dateiobjekt zugegriffen werden kann, werden dem Dateiobjekt ein oder auch mehrere Namen zugewiesen. (Mich gibt es nur einmal, aber ich nenne mich ich, meine Eltern nennen mich Sohn, meine Schwestern mich Bruder und alle anderen rufen mich Philipp.) Diese Namen werden als Verzeichniseinträge bezeichnet und sind nicht viel mehr als eine simple Zuordnung von einem Namen zu einer INode-Nummer. (Wenn ich xyz sage, meine ich die Datei mit der Nummer 123.) Hat ein Dateiobjekt mehr als einen Namen, nennt man diese Einträge auch Hardlinks.

Alle Namenseinträge müssen allerdings auch irgendwo gespeichert werden, nämlich in einem Verzeichnis (vergleichbar einem Telefonbuch). Dieses Verzeichnis ist aber selber auch wieder ein Dateiobjekt, hat also auch eine eigene INode(-Nummer) und einen Namen. (Im Unterschied zu normalen Dateien dürfen Verzeichnisse nur einen Namen haben, damit es keine Zyklen zwischen diesen gibt.)

Daraus ergeben sich auch, warum man zum Löschen einer Datei keine Rechte an der zu löschenden Datei selbst braucht: Beim Löschen wird lediglich der Verzeichniseintrag entfernt, und dazu braucht man eben das Schreibrecht für das Verzeichnis. Erst wenn ein Dateiobjekt alle seine Namen verloren hat, d.h. alle Verzeichniseinträge gelöscht wurden, wird es wirklich gelöscht.

Stick-Bit

Das Sticky-Bit (Löschschutz, o=t, 1000) bietet noch einen zusätzlichen Schutz, der z.B. beim Verzeichnissen wie /tmp Anwendung findet: Jeder Benutzer soll darin eigene Dateien anlegen können (er benötigt also Schreibrechte für das Verzeichnis, um den Namen eintragen zu können), aber nur er selbst soll sie auch wieder löschen dürfen (alle anderen Benutzer haben zwar auch Schreibrechte auf dem Verzeichnis, dürfen dies aber trotzdem nicht ausüben).

Durch das Setzen des t-Bits wird genau diese Zusatzfunktion realisiert: Zum Löschen muß der Benutzer nicht nur das Schreibrecht für das Verzeichnis haben, sondern er muß zusätzlich auch der Besitzer der zu löschenden Datei sein. Bei ls wird das gesetzte t-Bit ähnlich wie bei den s-Bits mit dem x-Bit verschmolzen: Ein kleines t steht für gesetztes Sticky-Bit bei vorhandenen Suchrechten, ein großes T bei fehlenden Suchrechten.

Änderungen

Ändern von Rechten

Um die Rechte einer Datei oder eines Verzeichnisses zu ändern, gibt es das Unix-Kommando chmod (von CHangeMODus). Dabei kann man entweder die symbolische Schreibweise verwenden oder direkt den oktalen Wert angeben.

chmod MODUS[,MODUS] DATEIEN

Da sich die Zugriffsrechte in drei Sparten teilen, gibt es in der symbolischen Schreibweise noch folgende Zeichen mit Zusatzbedeutungen:

Modifikatoren von chmod
u Einstellungen betreffen nur den Benutzer
g Einstellungen betreffen nur die Gruppe
o Einstellungen betreffen nur den Rest
a Einstellungen betreffen Alle
= Rechte setzen
+ Rechte hinzufügen
- Rechte entfernen

Mann kann die Rechte entweder direkt für alle angeben oder aber auch nur die Änderungen zum jetzigen Stand angeben. Um z.B. dem Benutzer alle Rechte, der Gruppe Lese- und Ausführrechte und dem Rest nur Leserechte auf die Datei meinProgramm zu geben, kann man folgende äquivalenten Befehle ausführen:

Will man alle Dateien im aktuellen Verzeichnis für dir Gruppe les-/schreibbar machen und allen anderen Personen den Lesezugriff verweigern, ohne andere Einstellungen zu verändern, kann man das mit chmod g+rw,o-r * erledigen.

Ändern der Gruppenzugehörigkeit

Es ist möglich, daß man mehreren Gruppen angehört. Um diese Gruppen aufzulisten, gibt es den Befehl groups. Je nach Betriebssystem kann man sich das auch mit id anzeigen lassen. Letzterer Befehl gibt auch an, zu welcher Gruppe man primär gehört. Standardmäßig gehören alle Dateien, die man anlegt, zu dieser Primärgruppe. Man kann jedoch mit newgrp die Primärgruppe wechseln, so das ab dann alle neu angelegten Dateien zu der neuen Gruppe gehören. Um nachträglich die Gruppenzugehörigkeit einer Datei zu ändern, gibt es den chgrp-Befehl (von CHangeGRouP). Als 1. Parameter übergibt man die neue Gruppe, danach folgen die zu verändernden Dateien.
chgrp inf1g18 *.java

Ändern des Besitzers

Genauso wie man die Gruppenzugehörigkeit ändern kann, kann man auch den Besitzer einer Datei ändern. Allerdings darf dies nur der Administrator tun, da man ansonsten in Systemen, wo Benutzer nur eine begrenzte Menge an Speicherplatz zur Verfügung haben, seine Dateien einfach jemand anderes übertragen könnte.

Ähnlich dem Befehl zum Verändern von Gruppenzugehörigkeiten heißt der Befehl hierzu chown (von CHangeOWNer). Als 1. Parameter folgt der neue Benutzer, danach die zu verändernden Verzeichnisse und Dateien.
chown fmattern garbage.* NochEineDatei
Bei einigen Systemen kann man chown und chgrp zusammenfassen, indem man chown user:group * ausführt.

Standardrechte für neue Dateien

Neue Dateien werden standardmäßig mit Lese- und Schreibrechten für alle (0666), Verzeichnisse zusätzlich mit Suchrechten für alle (0777) angelegt. Mit dem Befehl umask lassen sich diese Standardrechte einschränken. Dabei ist zu beachten, das die als Oktalzahl angegebenen Rechte gerade nicht erteilt werden, d.h. die angegebenen Rechte werden von 0666 für Dateien und 0777 für Verzeichnisse sozusagen abgezogen (genauer: negiert Und-Verknüpft). Z.B. erhält man durch eine umask 077 nur alleine Rechte an neuen Dateien, während eine umask 027 zusätzlich der Gruppe Schreib- und bei Verzeichnissen auch noch Suchrechte lässt.

Wem es zu kompliziert ist, das selber auszurechnen, der kann auch direkt die gewünschten Rechte symbolisch angeben. umask u=rw,g=rw,o= ermöglicht nur dem Benutzer und seiner Gruppe Lese- und Schreibrechte und entspricht umask 0117.

Zu beachten dabei ist aber immer, daß durch die umask nie mehr Rechte vergeben werden als standardmäßig, sonder immer nur weniger. D.h. beim Anlegen einer Datei mit umask 0000 wird diese Datei dadurch nicht plötzlich Ausführrechte erhalten.

Ausblick

Wem das noch nicht reicht, es gibt auch noch so genannte Access Control Lists (ACL), mit deren Hilfe man einzelnen Benutzern noch zusätzliche Rechte einräumen kann. Allerdings funktioniert das nicht auf allen Computern und mit allen Dateisystemen. Wer sich dafür interessiert, der möge einen Blick auf das Kommando chacl bzw. setfacl werfen.

Unter Solaris unterstützt das UFS-Dateisystem ACLs, was auch über NFS funktionieren sollte. Unter Linux werden inzwischen SGIs XFS, IBMs JFS, ext2, ext3, ext4 und Namesys' ReiserFS unterstützt.

Beispiele für gebräuchliche Rechte

Private Dateien

0100
Binär-Programm, daß nur von Besitzer selber ausgeführt werden kann
0200
Schreibgeschützte Textdatei, die nur von Besitzer selber lesbar ist
0400
Textdatei, die nur von Besitzer selber les- und schreibbar ist
0500
Programm oder Skript, daß nur von Besitzer selber ausgeführt werden kann. Die Datei kann allerdings nicht verändert werden.
0700
Programm oder Skript, daß nur von Besitzer selber ausgeführt und geändert werden kann

Gruppen Dateien

0640
Textdatei, die nur vom Besitzer verändert, aber auch von anderen Gruppenmitgliedern gelesen werden kann
0660
Textdatei, die nur vom Besitzer und anderen Gruppenmitgliedern gelesen und verändert werden kann
0664
Textdatei, die von allen gelesen, aber nur vom Besitzer und anderen Gruppenmitgliedern verändert werden kann
0710
Binär-Programm, daß vom Besitzer der Gruppe lediglich zur Ausführung bereitgestellt wird
0750
Programm oder Skript, daß vom Besitzer der Gruppe zur Ausführung (und zur Ansicht) bereitgestellt wird
4750
sicheres Programm (kein Skript), daß der Gruppe erlaubt, es im Sinne des Besitzers auszuführen

Allgemeine Dateien

0644
Textdatei, die nur vom Besitzer verändert, aber von allen gelesen werden kann
0755
Programm oder Skript, daß von allen ausgeführt werden kann
Allgemeines Verzeichnis
0711
Binär-Programm, das zwar von allen ausgeführt, aber nicht betrachtet werden kann. Oft ein zweifelhafter Versuch die Sicherheit zu erhöhen, aber nutzlos, da viele Programme sowieso Open-Source sind und auch die übersetzten Programme von öffentlichen Quellen heruntergeladen werden können.
2755
sicheres Programm (kein Skript), daß einen kontrollierten Zugriff im Sinne der Gruppenzugehörigkeit ermöglicht
Beispiel: chage muß lediglich die Informationen aus /etc/shadow lesen können, soll die Datei aber nicht verändern dürfen.
-rw-r----- … root shadow … /etc/shadow
-rwxr-sr-x … root shadow … /usr/bin/chage
4755
sicheres Programm (kein Skript), daß es allen erlaubt, es im Sinne des Besitzers (und mit dessen Rechten) auszuführen

Sonstige Fälle

1777
Temporäres Verzeichnis wie /tmp
1770
Temporäres Verzeichnis nur für Gruppenmitglieder
0711
Verzeichnis, daß für den Besitzer einsehbar ist, aber für alle anderen keine Auflistung der Inhalte erlaubt. Ist allerdings der Name einer Datei oder eines Verzeichnisses darin bekannt, kann diese Datei — ihrerseits geeignete Rechte Vorausgesetzt — genutzt werden.
2775 oder 2770
Projekt-Verzeichnis, um z.B. Gruppenmitgliedern die gemeinsame Benutzung eines Verzeichnisses zu ermöglichen: Neue Dateien und Verzeichnisse werden automatisch der Gruppe zugeordnet. Die umask sollte so eingestellt sein, daß neue Dateien auch für die Gruppe schreibbar bleiben (umask 0007 oder umask 0002). Aus diesem Grund ist es sinnvoll, daß jeder Benutzer auch seine eigene primäre Gruppe hat: Seine neuen Dateien gehören erstmal seiner eigenen Gruppe an und bleiben so nur für ihn schreibbar. Befindet er sich aber in so einem solchen Projektverzeichnis, so können auch andere Gruppenmitglieder diese Dateien bearbeiten.