Skip to content

14 Zugriffsrechte

14 Zugriffsrechte

Lernziele

  • Das Linux-Rechtekonzept beherrschen

  • Zugriffsrechte für Dateien und Verzeichnisse vergeben können

  • Die Begriffe SUID, SGID und sticky bit kennen

Vorkenntnisse

  • Kenntnisse über das Linux-Benutzer- und Gruppenkonzept (siehe Kapitel 13)

  • Kenntnisse über das Linux-Dateikonzept

14.1 Das Linux-Rechtekonzept

Wenn mehrere Benutzer gleichzeitig auf einem System arbeiten, muss auch ein Rechtekonzept für Prozesse, Dateien und Verzeichnisse existieren. Nur so kann verhindert werden, dass Benutzer A ohne weiteres auf Dateien von Benutzer B zugreifen kann. Linux setzt dazu das Standardkonzept aller Unix-Betriebssysteme um.

In diesem Konzept ist jede Datei und jedes Verzeichnis genau einem Benutzer (Besitzer) und einer Gruppe zugeordnet. Jede Datei hat getrennte Rechte für den Besitzer, die Mitglieder der Gruppe, der die Datei zugeordnet ist (kurz „die Gruppe” genannt), und alle anderen Benutzer („der Rest der Welt”). Für diese drei Benutzergruppen können jeweils separat Schreib-, Lese- und Ausführungsrechte vergeben werden. Der Eigentümer darf die Zugriffsrechte einer Datei bestimmen. Die Gruppe und alle anderen Benutzer haben nur dann Rechte an einer Datei, wenn der Eigentümer ihnen diese einräumt. Die gesamte Einstellung der Rechte für eine Datei wird auch als deren Zugriffsmodus bezeichnet.

In einem Mehrbenutzersystem, in dem private oder gruppeninterne Daten auf einem allgemein zugänglichen Medium gespeichert werden, kann der Eigentümer einer Datei durch entsprechende Zugriffsbeschränkungen das Lesen oder die Veränderung seiner Daten verbieten. Die Rechte einer Datei können für den Eigentümer, die Benutzergruppe und die sonstigen Benutzer separat und unabhängig voneinander festgelegt werden. Dadurch lassen sich mithilfe der Zugriffsrechte bereits die Kompetenzen und Zuständigkeiten eines Gruppenarbeitsprozesses auf die Dateien, mit denen die Gruppe arbeitet, abbilden.

14.2 Zugriffsrechte auf Dateien und Verzeichnisse

14.2.1 Grundlagen

Für jede Datei und jedes Verzeichnis im System erlaubt Linux für jede der drei Benutzerkategorien – Eigentümer, Mitglieder der Dateigruppe und der Rest der Welt – separate Zugriffsrechte. Diese Rechte teilen sich in Leserecht, Schreibrecht und Ausführungsrecht auf.

Für Dateien bedeuten diese Rechte in etwa das, was ihre Namen aussagen: Wer Leserecht hat, darf sich den Inhalt der Datei anschauen, wer Schreibrecht hat, darf ihn ändern. Das Ausführungsrecht ist notwendig, um die Datei als Programm starten zu können.

💡 Zum Starten eines binären „Maschinenprogramms” ist nur das Ausführungsrecht nötig. Für Dateien mit Shellskripten oder anderen „interpretierten” Programmen benötigen Sie zusätzlich das Leserecht.

Bei Verzeichnissen sieht es etwas anders aus: Leserecht ist notwendig, um den Inhalt eines Verzeichnisses anschauen zu können, beispielsweise indem Sie das ls-Kommando ausführen. Schreibrecht benötigen Sie, um Dateien im Verzeichnis anlegen, löschen oder umbenennen zu können. Das „Ausführungsrecht” steht für die Möglichkeit, das Verzeichnis „benutzen” zu dürfen, d. h., Sie können mit cd in das Verzeichnis wechseln oder seinen Namen in Pfadnamen von weiter unten im Dateibaum liegenden Dateien verwenden.

💡 In Verzeichnissen, in denen Sie nur das Leserecht haben, können Sie die Dateinamen lesen, aber keine weiteren Informationen zu den Dateien abrufen. Haben Sie für ein Verzeichnis nur das Ausführungsrecht, können Sie Dateien ansprechen, solange Sie deren Namen kennen.

Normalerweise hat es wenig Sinn, Schreib- und Ausführungsrechte für Verzeichnisse getrennt voneinander zu vergeben. In gewissen Spezialfällen kann es allerdings nützlich sein.

⚠️ Es ist wichtig, hervorzuheben, dass ein Schreibrecht für die Datei selbst zum Löschen der Datei völlig unnötig ist – Sie benötigen lediglich ein Schreibrecht für das Verzeichnis, in dem die Datei gespeichert ist. Beim „Löschen” wird lediglich der Verweis auf die tatsächliche Dateiinformation (die Inode) aus dem Verzeichnis entfernt, weshalb es sich dabei um eine reine Verzeichnisoperation handelt. Das rm-Programm warnt Sie zwar, wenn Sie versuchen, eine Datei zu löschen, auf die Sie kein Schreibrecht haben. Wenn Sie die Operation jedoch bestätigen und Schreibrecht auf das Verzeichnis der Datei haben, steht dem erfolgreichen Löschen nichts im Weg. (Linux kennt – wie jedes andere unixartige System auch – keine Möglichkeit, eine Datei direkt zu „löschen“. Sie können nur alle Verweise auf die Datei entfernen. Daraufhin entscheidet der Linux-Kernel von sich aus, dass niemand mehr auf die Datei zugreifen kann, und entsorgt ihren Inhalt.)

💡 Wenn Sie dagegen Schreibrecht auf die Datei, aber nicht auf ihr Verzeichnis haben, können Sie die Datei nicht vollständig löschen. Sie können jedoch die Länge der Datei auf 0 setzen und somit den Inhalt entfernen, auch wenn die Datei selbst prinzipiell noch existiert.

Für jeden Benutzer gelten diejenigen Zugriffsrechte, die „am besten passen”.

Haben die Mitglieder der Gruppe, der eine Datei zugeordnet ist, zum Beispiel kein Leserecht für die Datei, der „Rest der Welt” dagegen schon, dann dürfen die Gruppenmitglieder die Datei nicht lesen. Das auf den ersten Blick verlockende Argument, dass, wenn schon der „Rest der Welt” die Datei lesen darf, die Gruppenmitglieder, die ja in gewissem Sinne auch Teil des „Rests der Welt” sind, das eigentlich auch dürfen sollten, zählt nicht.

14.2.2 Zugriffsrechte anschauen und ändern

Mit dem Befehl „ls -l” erhalten Sie Informationen darüber, welche Rechte, Benutzer- und Gruppenzuordnung für eine Datei gelten:

$ ls -l
-rw-r--r-1 hugo users 4711 Oct 4 11:11 datei.txt
drwxr-x--2 hugo group2 4096 Oct 4 11:12 testdir

Die Zeichenkette am linken Rand der Tabelle gibt die Zugriffsrechte für den Eigentümer, die Dateigruppe und den „Rest der Welt” an (das allererste Zeichen gibt lediglich den Dateityp an und hat mit den Zugriffsrechten nichts zu tun). Die dritte Spalte nennt den Benutzernamen des Eigentümers und die vierte Spalte den Namen der Dateigruppe.

In der Rechteliste stehen „r”, „w” und „x” jeweils für ein vorhandenes Lese-, Schreib- und Ausführungsrecht. Steht nur ein „-” in der Liste, dann hat die betreffende Kategorie das betreffende Recht nicht. „rw-r--r--” steht also für „Lese- und Schreibrecht für den Eigentümer, aber nur Leserecht für die Gruppenmitglieder und den Rest der Welt”.

Als Dateieigentümer können Sie mit dem Befehl „chmod” (von „change mode”, „Zugriffsmodus ändern”) die Zugriffsrechte für die Datei setzen. Dabei können Sie die drei Kategorien durch die Abkürzungen „u” (user) für den Eigentümer (also Sie selbst), „g” (group) für die Mitglieder der Dateigruppe und „o” (others) für den „Rest der Welt” bestimmen. Die Rechte selbst werden durch die bereits erwähnten Kürzel „r”, „w” und „x” festgelegt. Mit „+“, „-“ und „=“ können Sie angeben, ob die benannten Rechte zusätzlich zu den existierenden vergeben, von den existierenden „subtrahiert“ oder anstelle der bisherigen gesetzt werden sollen. Ein Beispiel:

$ chmod u+x datei # Ausführungsrecht für Eigentümer
$ chmod go+w datei # setzt Schreibrecht für Gruppe und RdW
$ chmod g+rw datei # setzt Lese- und Schreibrecht für die Gruppe
$ chmod g=rw,o=r datei # setzt Lese und Schreibrecht,
$ chmod a+w datei # löscht Ausführungsrecht für die Gruppe setzt reines Leserecht für den Rest der Welt äquivalent zu ugo+w

💡 Tatsächlich sind Rechtespezifikationen deutlich komplexer. Konsultieren Sie die Info-Dokumentation zu chmod, um weitere Details zu erfahren.

Der Dateieigentümer ist neben root der einzige Benutzer, der die Zugriffsrechte für eine Datei oder ein Verzeichnis ändern darf. Dieses Privileg ist unabhängig von den tatsächlichen Dateirechten: Der Eigentümer darf sich selbst alle Rechte entziehen, hindert sich dadurch aber nicht daran, sich später wieder Rechte zu erteilen.

Die allgemeine Syntax des chmod-Kommandos ist

chmod [⟨Optionen⟩] ⟨Rechte⟩ ⟨Name⟩ …

Es können beliebig viele Datei- oder Verzeichnisnamen angegeben werden. Die wichtigsten Optionen sind:

  • -R: Wenn ein Verzeichnis angegeben wurde, werden auch die Rechte von Dateien und Verzeichnissen innerhalb dieses Verzeichnisses geändert.

  • –reference=Name: Es werden die Zugriffsrechte der Datei Name verwendet. In diesem Fall müssen keine Rechte angegeben werden.

💡 Sie können den Zugriffsmodus einer Datei statt wie eben angegeben „symbolisch” auch „numerisch” angeben. In der Praxis ist das sehr verbreitet, wenn Sie alle Rechte für eine Datei oder ein Verzeichnis auf einmal setzen wollen. Das funktioniert so: Die drei Rechtetripel werden als dreistellige Oktalzahl dargestellt: Die erste Ziffer beschreibt die Rechte des Eigentümers, die zweite die Rechte der Dateigruppe und die dritte die Rechte für den „Rest der Welt”. Jede dieser Ziffern ergibt sich aus der Summe der jeweiligen Rechte, wobei Leserecht 4, Schreibrecht 2 und Ausführrecht 1 zählt. Hier sind ein paar Beispiele für gängige Rechtezuordnungen in „ls -l” und oktaler Darstellung:

rw-r--r--  644
r--------  400
rwxr-xr-x  755

💡 Mit der numerischen Rechte-Darstellung können Sie nur alle Rechte auf einmal setzen. Es gibt keine Möglichkeit, wie bei den „+” und „-” Operatoren der symbolischen Darstellung, einzelne Rechte zu setzen oder zu entfernen, ohne die anderen dabei zu beeinflussen. Das Kommando

$ chmod 644 datei

entspricht also der symbolischen Form

$ chmod u=rw,go=r datei

14.2.3 Dateieigentümer und Gruppe setzen – chown und chgrp

Mit dem Kommando „chown” kann der Eigentümer und die Gruppe einer Datei oder eines Verzeichnisses geändert werden. Dem Befehl werden die Benutzerkennung des Besitzers und/oder die gewünschte Gruppenkennung sowie der Datei- bzw. Verzeichnisname übergeben, dessen Eigentümer geändert werden soll. Der Aufruf sieht wie folgt aus:

chown ⟨Benutzername⟩[:][⟨Gruppenname⟩] ⟨Name⟩ … chown :⟨Gruppenname⟩ ⟨Name⟩ …

Werden sowohl Benutzername als auch Gruppenname angegeben, werden beide gesetzt. Wird nur ein Benutzername angegeben, bleibt die Gruppe unverändert. Wird ein Benutzername mit Doppelpunkt angegeben, wird die Datei der primären Gruppe des Benutzers zugeordnet. Wird nur ein Gruppenname angegeben (mit Doppelpunkt), bleibt der Eigentümer unverändert. Ein Beispiel:

# chown hugo:entw brief.txt
# chown www-data bla.html # Neuer Benutzer www-data
# chown :entw /home/entwicklung # Neue Gruppe entw

💡 chown unterstützt auch die veraltete Syntax, bei der statt des Doppelpunkts ein einfacher Punkt verwendet wird.

Um Dateien an andere Benutzer oder beliebige Gruppen zu „verschenken”, müssen Sie Systemverwalter sein. Der Hauptgrund dafür ist, dass normale Benutzer sich sonst gegenseitig behindern können, wenn das System „Kontingentierung“ (Quotas) verwendet, d. h., wenn jeder Benutzer nur über eine bestimmte Menge Festplattenspeicher verfügen darf.

Mit dem Kommando chgrp können Sie die Gruppe einer Datei ändern – auch als normaler Benutzer –, solange Sie Eigentümer der Datei sowie Mitglied der neuen Gruppe sind:

chgrp ⟨Gruppenname⟩ ⟨Name⟩ …

💡 Änderungen des Dateieigentümers oder der Dateigruppe beeinflussen die Zugriffsrechte der verschiedenen Kategorien nicht.

Auch die Befehle chown und chgrp unterstützen die Option -R zur rekursiven Anwendung auf eine ganze Verzeichnishierarchie.

💡 Selbstverständlich können Sie die Rechte, die Gruppe und den Eigentümer einer Datei auch mit den meisten Dateibrowsern (wie Konqueror oder Nautilus) ändern.

Übungen

✏️ 14.1 [!2] Legen Sie eine neue Datei an. Welcher Gruppe soll diese Datei zugeordnet werden? Verwenden Sie den Befehl „chgrp”, um die Datei einer Ihrer anderen Gruppen zuzuordnen. Was passiert, wenn Sie die Datei einer Gruppe zuordnen möchten, deren Mitglied Sie nicht sind?

✏️ 14.2 [4] Vergleichen Sie die Mechanismen verschiedener Dateibrowser (zum Beispiel Konqueror, Nautilus usw.) zum Setzen von Dateirechten, Eigentümern, Gruppen usw. Gibt es nennenswerte Unterschiede?

14.3 Eigentum an Prozessen

In Linux werden nicht nur die mehr oder weniger festen Daten auf einem dauerhaften Speichermedium als Objekte betrachtet, die einem Eigentümer zugeordnet werden. Auch die Prozesse im System haben einen Eigentümer.

Viele Kommandos, die Sie über die Tastatur eingeben, erzeugen einen Prozess im Arbeitsspeicher des Rechners. Im normalen Betrieb befinden sich immer mehrere Prozesse gleichzeitig im Speicher, die vom Betriebssystem streng voneinander abgegrenzt werden. Die einzelnen Prozesse werden mit all ihren Daten einem Benutzer als Eigentümer zugeordnet. In der Regel ist dies der Benutzer, der den Prozess gestartet hat. Auch hier haben Prozesse, die mit Administratorrechten gestartet wurden, die Möglichkeit, ihre Identität zu ändern. Der SUID-Mechanismus (Abschnitt 14.4) kann hier ebenfalls eingreifen.

Die Eigentümer der Prozesse werden vom Programm „ps” angezeigt, wenn es mit der Option „-u” aufgerufen wird.

# ps -u
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
bin 89 00 1.0 788 328 ? S 13:27 0:00 rpc.portmap
test1 190 00 2.0 1100 28 3 S 13:27 0:00 bash
test1 613 00 1.3 968 24 3 S 15:05 0:00 vi XF86.tex
nobody 167 00 1.4 932 44 ? S 13:27 0:00 httpd
root 1 00 1.0 776 16 ? S 13:27 0:03 init [3]
root 2 00 0.0 0 0 ? SW 13:27 0:00 (kflushd)

14.4 Besondere Zugriffsrechte für ausführbare Dateien

Wenn Sie den Befehl „ls -l“ ausführen, um die Dateien aufzulisten, werden bei manchen Dateien neben den bekannten Zugriffsrechten rwx abweichende Anzeigen wie

-rwsr-xr-x 1 root shadow 32916 Dec 11 20:47 /usr/bin/passwd

Was soll das? Hierzu müssen wir etwas weiter ausholen:
Angenommen, das Programm passwd sei mit folgenden Zugriffsrechten versehen:

-rwxr-xr-x 1 root shadow 32916 Dec 11 20:47 /usr/bin/passwd

Ein normaler (unprivilegierter) Benutzer namens Hugo möchte nun sein Kennwort ändern und ruft das Kommando passwd auf. Als Nächstes erhält er die Meldung „permission denied”. Was ist die Ursache? Der passwd-Prozess (der mit den Rechten von Hugo läuft) versucht, die Datei /etc/shadow zum Schreiben zu öffnen, was natürlich scheitert, da nur Root die erforderliche Schreibberechtigung besitzt. Dies darf auch nicht anders sein, da sonst jeder die Kennwörter beliebig manipulieren könnte, etwa um das Root-Kennwort zu ändern.

Mithilfe des Set-UID-Bits (oft kurz „SUID-Bit” genannt) kann erreicht werden, dass ein Programm nicht mit den Rechten des Aufrufers, sondern mit den Rechten des Dateieigentümers – in diesem Fall root – ausgeführt wird. Im Fall von „passwd” hat der Prozess, der „passwd” ausführt, also Schreibrechte für die Datei „/etc/shadow”, obwohl der aufrufende Benutzer als Nicht-Systemadministrator diese Rechte sonst nicht hat. Der Programmierer von passwd ist dafür verantwortlich, zu verhindern, dass dieses Recht missbraucht wird, beispielsweise indem Programmierfehler ausgenutzt werden, um beliebige Dateien außer /etc/shadow zu manipulieren oder um andere Einträge in /etc/shadow außer dem Kennwortfeld des aufrufenden Benutzers zu verändern. Unter Linux funktioniert der SUID-Mechanismus übrigens nur für Maschinencode-Programme, nicht für Shell- oder andere Interpreterskripte.

💡 Die Bell Labs hatten eine Weile lang ein Patent auf den von Dennis Ritchie erfundenen SUID-Mechanismus [SUID]. AT&T hatte Unix zuerst nur unter der Voraussetzung verteilt, dass nach der Erteilung des Patents Lizenzgebühren erhoben werden würden. Aufgrund der logistischen Schwierigkeit, Jahre später von Hunderten von Unix-Installationen rückwirkend kleine Geldbeträge einzutreiben, entschloss man sich jedoch, das Patent der Allgemeinheit zur Verfügung zu stellen.

Analog zum Set-UID-Bit gibt es auch ein SGID-Bit. Damit wird ein Prozess mit der Gruppenzugehörigkeit der Programmdatei und den damit verbundenen Rechten (typischerweise zum Zugriff auf andere Dateien, die dieser Gruppe zugeordnet sind) statt mit der Gruppenzugehörigkeit des Aufrufers ausgeführt.

Die SUID- und SGID-Modi werden wie alle anderen Dateimodi mit dem Systemprogramm chmod verändert. Sie geben dazu symbolische Schlüssel wie u+s (setzt das SUID-Bit) oder g-s (löscht das SGID-Bit) an. Auch in oktalen Modi können Sie diese Bits setzen, indem Sie eine vierte Ziffer ganz links hinzufügen. Das SUID-Bit hat den Wert 4 und das SGID-Bit den Wert 2. So können Sie einer Datei beispielsweise den Zugriffsmodus 4755 geben. Damit ist die Datei für alle Benutzer lesbar und ausführbar (der Eigentümer darf auch schreiben) und das SUID-Bit wird gesetzt.

Programme, die mit den Rechten des Eigentümers oder der Gruppe der Programmdatei arbeiten, erkennen Sie in der Ausgabe von „ls -l” an der symbolischen Abkürzung „s” anstelle von „x” für normal ausführbare Dateien.

14.5 Besondere Zugriffsrechte für Verzeichnisse

Eine weitere Ausnahme von der Zuordnung des Eigentums an Dateien nach dem Verursacherprinzip ist, dass der Eigentümer eines Verzeichnisses bestimmen kann, dass die in diesem Verzeichnis erzeugten Dateien der gleichen Benutzergruppe gehören wie das Verzeichnis selbst. Dies wird erreicht, indem das SGID-Bit des Verzeichnisses gesetzt wird. (Da Verzeichnisse nicht ausgeführt werden können, ist das SGID-Bit hierfür frei.)

Die Zugriffsrechte auf ein Verzeichnis werden durch das SGID-Bit nicht verändert. Um eine Datei in einem solchen Verzeichnis anzulegen, muss ein Benutzer das Schreibrecht in der für ihn zutreffenden Kategorie (Eigentümer, Gruppe oder andere Benutzer) besitzen. Wenn ein Benutzer beispielsweise weder Eigentümer noch Mitglied der Benutzergruppe eines SGID-Verzeichnisses ist, muss das Verzeichnis für alle Benutzer beschreibbar sein, damit er neue Dateien hineinschreiben kann. Die im SGID-Verzeichnis erzeugte Datei gehört dann der Gruppe des Verzeichnisses, auch wenn der Benutzer selbst dieser Gruppe nicht angehört.

💡 Ein typischer Anwendungsfall für das SGID-Bit auf einem Verzeichnis ist ein Verzeichnis, das einer „Projektgruppe” als Datenablage dient. Nur die Mitglieder der Projektgruppe sollen alle Dateien im Verzeichnis lesen und schreiben sowie neue Dateien anlegen können. Das heißt, alle Benutzer, die an dem Projekt mitarbeiten, müssen in die Projektgruppe aufgenommen werden (sekundäre Gruppe reicht):

# groupadd projekt Neue Gruppe anlegen
# usermod -a -G projekt hugo hugo in die Gruppe
# usermod -a -G projekt susi susi auch
✁✁✁✁✁

Nun können Sie das Verzeichnis anlegen und der neuen Gruppe zuordnen.

Sowohl Eigentümer als auch Gruppe erhalten alle Rechte, während der Rest der Welt keine erhält. Außerdem setzen Sie noch das SGID-Bit:

# cd /home/projekt
# chgrp projekt /home/projekt
# chmod u=rwx,g=srwx /home/projekt

Wenn Hugo jetzt eine Datei im Verzeichnis „/home/projekt” anlegt, sollte diese der Gruppe „projekt” zugeordnet sein:

$ id
uid=1000(hugo) gid=1000(hugo) groups=101(projekt),1000(hugo)
$ touch /tmp/hugo.txt Test: gewöhnliches Verzeichnis
$ ls -l /tmp/hugo.txt
-rw-r--r-1 hugo hugo 0 Jan 6 17:23 /tmp/hugo.txt
$ touch /home/projekt/hugo.txt Projektverzeichnis
$ ls -l /home/projekt/hugo.txt
-rw-r--r-1 hugo projekt 0 Jan 6 17:24 /home/projekt/hugo.txt

Das Ganze hat jedoch einen Schönheitsfehler, den Sie erkennen, wenn Sie sich die letzte Zeile des Beispiels ansehen. Die Datei hat zwar die richtige Gruppenzugehörigkeit, aber andere Mitglieder der Gruppe „projekt” dürfen sie trotzdem nur lesen. Wenn alle Mitglieder von „projekt” schreiben dürfen sollen, müssen Sie entweder nachträglich „chmod” anwenden (was lästig ist) oder die „umask” so setzen, dass das Gruppenschreibrecht erhalten bleibt (siehe Übung 14.4).

Der SGID-Modus verändert lediglich das Verhalten des Betriebssystems beim Erzeugen neuer Dateien. Der Umgang mit bereits existierenden Dateien ist in diesen Verzeichnissen völlig normal. Das bedeutet beispielsweise, dass eine Datei, die außerhalb des SGID-Verzeichnisses erzeugt wurde, beim Verschieben dorthin ihre ursprüngliche Gruppe behält (während sie beim Kopieren die Gruppe des Verzeichnisses erhalten würde).

Auch das Programm chgrp arbeitet in SGID-Verzeichnissen völlig normal: Der Eigentümer einer Datei kann sie jeder Gruppe zuteilen, der er selbst angehört. Gehört der Eigentümer nicht zu der Gruppe des Verzeichnisses, kann er die Datei mit chgrp nicht dieser Gruppe übergeben. Dazu muss er sie in dem Verzeichnis neu erzeugen.

💡 Es ist möglich, bei einem Verzeichnis das SUID-Bit zu setzen, allerdings hat diese Einstellung keine Wirkung.

Linux unterstützt noch einen weiteren Spezialmodus für Verzeichnisse. In diesem Modus ist das Löschen oder Umbenennen von darin enthaltenen Dateien nur dem Besitzer der jeweiligen Datei erlaubt:

drwxrwxrwt 7 root root 1024 Apr 7 10:07 /tmp

Mit diesem t-Modus, auch sticky bit genannt, kann einem Problem begegnet werden, das bei der gemeinsamen Verwendung öffentlicher Verzeichnisse entstehen kann. Das Schreibrecht für das Verzeichnis erlaubt nämlich auch das Löschen fremder Dateien – unabhängig von deren Zugriffsmodus und Besitzer! Die /tmp-Verzeichnisse sind beispielsweise ein öffentlicher Raum, in dem von vielen Programmen temporäre Dateien angelegt werden. Um darin Dateien anlegen zu können, haben alle Benutzer Schreibrecht für diese Verzeichnisse. Damit hat jeder Benutzer auch das Recht, Dateien in diesem Verzeichnis zu löschen.

Normalerweise berücksichtigt das Betriebssystem beim Löschen oder Umbenennen einer Datei die Zugriffsrechte auf die Datei selbst nicht. Wenn jedoch das Sticky Bit für ein Verzeichnis gesetzt wird, kann eine Datei in diesem Verzeichnis anschließend nur von ihrem Eigentümer, dem Eigentümer des Verzeichnisses oder Root gelöscht werden. Das Sticky Bit kann über die symbolische Angabe +t bzw. -t gesetzt oder gelöscht werden. Oktal hat es in derselben Ziffer wie SUID und SGID den Wert 1.

💡 Das Sticky Bit hat seinen Namen von einer weiteren Bedeutung, die es früher in anderen Unix-Systemen hatte: Seinerzeit wurden Programme vor dem Start komplett in den Swap-Speicher kopiert und nach dem Programmlauf wieder daraus entfernt. Programmdateien, auf denen das Sticky Bit gesetzt war, wurden dagegen auch nach dem Programmende im Swap-Speicher liegengelassen. Dies beschleunigte weitere Startvorgänge für dasselbe Programm, da der anfängliche Kopiervorgang entfiel. Linux verwendet wie die meisten heutigen Unix-Systeme demand paging und holt nur die wirklich benötigten Teile des Programmcodes direkt aus der Programmdatei. Es kopiert gar nichts in den Swap-Speicher, sodass das Sticky Bit unter Linux niemals seine ursprüngliche Sonderbedeutung hatte.

Übungen

✏️ 14.3 [2] Was bedeutet das spezielle Zugriffsrecht „s“? Wo finde ich es? Können Sie dieses Recht auf eine selbst erstellte Datei anwenden?

✏️ 14.4 [!1] Mit welchem umask-Aufruf können Sie eine Umask einstellen, die allen Mitgliedern der Gruppe „projekt” im Projektverzeichnis das Lesen und Schreiben von Dateien erlaubt?

✏️ 14.5 [2] Was bedeutet das spezielle Zugriffsrecht „t“? Wo finde ich es?

✏️ 14.6 [4] (Für Programmierer:innen.) Schreiben Sie ein C-Programm, das ein geeignetes Kommando (z. B. id) aufruft. Machen Sie dieses Programm SUID root bzw. SGID root und beobachten Sie, was passiert.

✏️ 14.7 [3] Wenn Sie sie für ein paar Minuten mit einer Root-Shell allein lassen, könnten findige Benutzer versuchen, irgendwo im System eine Shell zu hinterlegen, die sie SUID root gemacht haben. Auf diese Weise könnten sie sich nach Bedarf Administratorrechte verschaffen. Funktioniert das mit der Bash? Mit anderen Shells?

14.6 Kommandos in diesem Kapitel

Kommando Beschreibung manpage
chgrp Setzt Gruppenzugehörigkeit von Dateien und Verzeichnissen chgrp(1)
chmod Setzt Rechte für Dateien und Verzeichnisse chmod(1)
chown Setzt Eigentümer und Gruppenzugehörigkeit für Dateien und Verzeichnisse chown(1)

14.7 Zusammenfassung

  • In Linux werden für Dateien die Rechte Lesen, Schreiben und Ausführen unterschieden. Diese Rechte können getrennt für den Eigentümer der Datei, die Mitglieder der der Datei zugeordneten Gruppe und den „Rest der Welt” angegeben werden.

  • Die Gesamtheit dieser Rechte für eine Datei wird auch als Zugriffsmodus bezeichnet.

  • Jede Datei (und jedes Verzeichnis) hat einen Eigentümer und eine Gruppe. Die Zugriffsrechte (Lese-, Schreib- und Ausführungsrechte) werden für diese beiden Kategorien und den „Rest der Welt“ getrennt vergeben. Nur der Eigentümer darf die Zugriffsrechte setzen.

  • Für den Systemverwalter (root) gelten die Zugriffsrechte nicht – er darf jede Datei lesen oder schreiben.

  • Dateirechte werden mit dem Kommando „chmod” manipuliert.

  • Mit dem Befehl chown kann der Systemverwalter die Eigentümer- und Gruppenzuordnung beliebiger Dateien ändern.

  • Normale Benutzer können ihre Dateien mit dem Befehl chgrp einer anderen Gruppe zuordnen.

  • SUID- und SGID-Bit erlauben es, Programme mit den Rechten des Dateieigentümers bzw. der der Datei zugeordneten Gruppe anstatt mit den Rechten des Aufrufers auszuführen.

  • Das SGID-Bit auf einem Verzeichnis bewirkt, dass neue Dateien in diesem Verzeichnis der Gruppe des Verzeichnisses und nicht der primären Gruppe des anlegenden Benutzers zugeordnet werden.

  • Das Sticky-Bit auf einem Verzeichnis erlaubt das Löschen von Dateien nur dem Eigentümer (und dem Systemadministrator).

Literaturverzeichnis

[SUID]: Dennis M. Ritchie. »Protection of data file contents«. US-Patent 4,135,240. Beantragt am 9.7.1973, erteilt am 16.7.1979.