Das FreeBSD-Handbuch
Zurück | Kapitel 3. Grundlagen des UNIX Betriebssystems | Weiter

# 3.3. Zugriffsrechte

FreeBSD, das ein direkter Abkömmling von BSD UNIX® ist, stützt sich auf mehrere Grundkonzepte von UNIX Systemen. Das erste und ausgeprägteste: FreeBSD ist ein Mehrbenutzer-Betriebssystem. Das System ermöglicht, dass mehrere Benutzer gleichzeitig an völlig verschiedenen und unabhängigen Aufgaben arbeiten können. Es ist verantwortlich für eine gerechte Auf- und Zuteilung von Nachfragen nach Hardware- und Peripheriegeräten, Speicher und CPU-Zeit unter den Benutzern.

Da das System mehrere Benutzer unterstützt, hat alles, was das System verwaltet, einen Satz von Rechten, die bestimmen, wer die jeweilige Ressource lesen, schreiben oder ausführen darf. Diese Zugriffsrechte stehen in drei Achtergruppen, die in drei Teile unterteilt sind: einen für den Besitzer der Datei, einen für die Gruppe, zu der die Datei gehört und einen für alle anderen. Die numerische Darstellung sieht wie folgt aus:

Wert | Zugriffsrechte | Auflistung im Verzeichnis
--- | --- | ---
0 | Kein Lesen, Kein Schreiben, Kein Ausführen | `---`
1 | Kein Lesen, Kein Schreiben, Ausführen | `--x`
2 | Kein Lesen, Schreiben, Kein Ausführen | `-w-`
3 | Kein Lesen, Schreiben, Ausführen | `-wx`
4 | Lesen, Kein Schreiben, Kein Ausführen | `r--`
5 | Lesen, Kein Schreiben, Ausführen | `r-x`
6 | Lesen, Schreiben, Kein Ausführen | `rw-`
7 | Lesen, Schreiben, Ausführen | `rwx`

Sie können `-l` auf der Kommandozeile von ls(1) angeben, um eine ausführliche Verzeichnisauflistung zu sehen, die in einer Spalte die Zugriffsrechte für den Besitzer, die Gruppe und alle anderen enthält. Die Ausgabe von `ls -l` könnte wie folgt aussehen:

    % ls -l
    total 530
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
    -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
    ...

Die erste Spalte der Ausgabe enthält die Zugriffsrechte:

    -rw-r--r--

Das erste Zeichen von links ist ein Symbol, welches angibt, ob es sich um eine normale Datei, ein Verzeichnis, ein zeichenorientiertes Gerät, ein Socket oder irgendeine andere Pseudo-Datei handelt. In diesem Beispiel zeigt `-` eine normale Datei an. Die nächsten drei Zeichen, dargestellt als `rw-`, ergeben die Rechte für den Datei-Besitzer. Die drei Zeichen danach `r--` die Rechte der Gruppe, zu der die Datei gehört. Die letzten drei Zeichen, `r--`, geben die Rechte für den Rest der Welt an. Ein Minus bedeutet, dass das Recht nicht gegeben ist. In diesem Fall sind die Zugriffsrechte also: der Eigentümer kann die Datei lesen und schreiben, die Gruppe kann lesen und alle anderen können auch nur lesen. Entsprechend obiger Tabelle wären die Zugriffsrechte für diese Datei `644`, worin jede Ziffer die drei Teile der Zugriffsrechte dieser Datei verkörpert.

Das ist alles schön und gut, aber wie kontrolliert das System die Rechte von Hardware-Geräten? FreeBSD behandelt die meisten Hardware-Geräte als Dateien, welche Programme öffnen, lesen und mit Daten beschreiben können wie alle anderen Dateien auch. Diese Spezial-Dateien sind im Verzeichnis `/dev` gespeichert.

Verzeichnisse werden ebenfalls wie Dateien behandelt. Sie haben Lese-, Schreib- und Ausführ-Rechte. Das Ausführungs-Bit hat eine etwas andere Bedeutung für ein Verzeichnis als für eine Datei. Die Ausführbarkeit eines Verzeichnisses bedeutet, dass in das Verzeichnis zum Beispiel mit `cd` gewechselt werden kann. Das bedeutet auch, dass in dem Verzeichnis auf Dateien, deren Namen bekannt sind, zugegriffen werden kann, vorausgesetzt die Zugriffsrechte der Dateien lassen dies zu.

Das Leserecht auf einem Verzeichnis erlaubt es, sich den Inhalt des Verzeichnisses anzeigen zu lassen. Um eine Datei mit bekanntem Namen in einem Verzeichnis zu löschen, müssen auf dem Verzeichnis Schreib- und Ausführ-Rechte gesetzt sein.

Es gibt noch mehr Rechte, aber die werden vor allem in speziellen Umständen benutzt, wie zum Beispiel bei SetUID-Binaries und Verzeichnissen mit gesetztem Sticky-Bit. Mehr über Zugriffsrechte von Dateien und wie sie gesetzt werden, finden Sie in chmod(1).

## 3.3.1. Symbolische Zugriffsrechte

Beigesteuert von Tom Rhodes.

Die Zugriffsrechte lassen sich auch über Symbole anstelle von oktalen Werten festlegen. Symbolische Zugriffsrechte werden in der Reihenfolge `Wer`, `Aktion` und `Berechtigung` angegeben. Die folgenden Symbole stehen zur Auswahl:

Option | Symbol | Bedeutung
--- | --- | ---
`Wer` | u | Benutzer (user)
`Wer` | g | Gruppe (group)
`Wer` | o | Andere (other)
`Wer` | a | Alle
`Aktion` | + | Berechtigungen hinzufügen
`Aktion` | - | Berechtigungen entziehen
`Aktion` | = | Berechtigungen explizit setzen
`Berechtigung` | r | lesen (read)
`Berechtigung` | w | schreiben (write)
`Berechtigung` | x | ausführen (execute)
`Berechtigung` | t | Sticky-Bit
`Berechtigung` | s | Set-UID oder Set-GID

Symbolische Zugriffsrechte werden wie die numerischen mit dem Kommando chmod(1) vergeben. Wenn Sie beispielsweise allen anderen Benutzern den Zugriff auf die Datei `FILE` verbieten wollen, benutzen Sie den nachstehenden Befehl:

    % chmod go= FILE

Wenn Sie mehr als eine Änderung der Rechte einer Datei vornehmen wollen, können Sie eine durch Kommata getrennte Liste der Rechte angeben. Das folgende Beispiel entzieht der Gruppe und der Welt (den anderen) die Schreibberechtigung auf die Datei `FILE` und fügt dann für alle Ausführungsrechte hinzu:

    % chmod go-w,a+x FILE

## 3.3.2. FreeBSD Datei-Flags

Beigetragen von Tom Rhodes.

Zusätzlich zu den vorhin diskutierten Zugriffsrechten unterstützt FreeBSD auch die sogenannten “Datei-Flags”. Diese erhöhen die Sicherheit Ihres Systems, indem sie eine verbesserte Kontrolle von Dateien erlauben. Verzeichnisse werden allerdings nicht unterstützt.

Diese verbesserte Sicherheit führt dazu, dass manche Dateien nicht einmal von `root` gelöscht oder bearbeitet werden können.

Datei-Flags können über chflags(1) gesetzt oder gelöscht werden. Um beispielsweise die Datei `file1` mit dem “unlöschbar”-Flag zu sichern, geben Sie folgenden Befehl ein:

    # chflags sunlink file1

Um dieses Flag wieder zu löschen, geben Sie den Befehl erneut ein. Allerdings setzen Sie ein “no” vor `sunlink`:

    # chflags nosunlink file1

Um die Flags dieser Datei anzuzeigen, verwenden Sie ls(1) zusammen mit der Option `-lo`:

    # ls -lo file1

Dadurch erhalten Sie eine Ausgabe ähnlich der folgenden:

    -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

Viele Flags können nur von `root` gesetzt oder gelöscht werden. Andere wiederum können auch vom Eigentümer der Datei gesetzt werden. Weitere Informationen zu Datei-Flags finden sich in den Manualpages chflags(1) und chflags(2).

## 3.3.3. Die Berechtigungen setuid, setgid, und sticky

Beigetragen von Tom Rhodes.

Anders als die Berechtigungen, die bereits angesprochen wurden, existieren drei weitere Einstellungen, über die alle Administratoren Bescheid wissen sollten. Dies sind die Berechtigungen `setuid`, `setgid` und `sticky`.

Diese Einstellungen sind wichtig für manche UNIX-Operationen, da sie Funktionalitäten zur Verfügung stellen, die normalerweise nicht an gewöhnliche Anwender vergeben wird. Um diese zu verstehen, muss der Unterschied zwischen der realen und der effektiven Benutzer-ID erwähnt werden.

Die reale Benutzer-ID ist die UID, welche den Prozess besitzt oder gestartet hat. Die effektive UID ist diejenige, als die der Prozess läuft. Beispielsweise wird passwd(1) mit der realen ID des Benutzers ausgeführt, der sein Passwort ändert. Um jedoch die Passwortdatenbank zu bearbeiten, wird es effektiv als `root`-Benutzer ausgeführt. Das ermöglicht es normalen Benutzern, ihr Passwort zu ändern, ohne einen “`Permission Denied`”-Fehler angezeigt zu bekommen.

> Anmerkung: Die `nosuid` mount(8)-Option wird dafür sorgen, dass diese Anwendungen stillschweigend scheitern. Genauer gesagt, sie werden nicht ausgeführt und der Anwender wird darüber auch nicht informiert. Auf diese Option kann man sich nicht vollständig verlassen, da ein `nosuid`-Wrapper in der Lage wäre, dies zu umgehen, wie in der mount(8) Manualpage zu lesen ist.

Die setuid-Berechtigung kann durch das Voranstellen bei einer Berechtigungsgruppe mit der Nummer Vier (4) gesetzt werden, wie im folgenden Beispiel gezeigt wird:

    # chmod 4755 suidexample.sh

Die Berechtigungen auf der ``suidexample.sh``-Datei sollten jetzt wie folgt aussehen:

    -rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

In dem Beispiel sollte auffallen, dass ein `s` jetzt Teil der Berechtigungen des Dateibesitzers geworden ist, welches das Ausführen-Bit ersetzt. Dies ermöglicht es Werkzeugen mit erhöhten Berechtigungen zu laufen, wie z.B. `passwd`.

Um dies in Echtzeit zu beobachten, öffnen Sie zwei Terminals. Starten Sie auf einem den `passwd`-Prozess als normaler Benutzer. Während es auf die Passworteingabe wartet, überprüfen Sie die Prozesstabelle und sehen Sie sich die Informationen des `passwd`-Kommandos an.

Im Terminal A:

    Changing local password for trhodes
    Old Password:

Im Terminal B:

    # ps aux | grep passwd

    trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
         root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

Wie oben erwähnt, wird `passwd` von einem normalen Benutzer ausgeführt, benutzt aber die effektive UID von `root`.

Die `setgid`-Berechtigung führt die gleiche Aktion wie die `setuid`-Berechtigung durch, allerdings verändert sie die Gruppenberechtigungen. Wenn eine Anwendung oder ein Werkzeug mit dieser Berechtigung ausgeführt wird, erhält es die Berechtigungen basierend auf der Gruppe, welche die Datei besitzt und nicht die des Benutzers, der den Prozess gestartet hat.

Um die `setgid`-Berechtigung auf einer Datei zu setzen, geben Sie dem `chmod`-Befehl eine führende Zwei (2) mit, wie im folgenden gezeigt:

    # chmod 2755 sgidexample.sh

Die neue Einstellung kann wie zuvor betrachtet werden. Beachten Sie, dass das `s` sich jetzt in dem Feld befindet, das für die Berechtigungen der Gruppe bestimmt ist:

    -rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

> Anmerkung: Obwohl es sich bei dem in diesen Beispielen gezeigten Shellskript um eine ausführbare Datei handelt, wird es nicht mit einer anderen EUID oder effektiven Benutzer-ID ausgeführt. Das ist so, weil Shellskripte keinen Zugriff auf setuid(2)-Systemaufrufe erhalten.

Diese beiden ersten angesprochenen Spezialberechtigungen (die `setuid` und `setgid` Berechtigungs-Bits) können die Systemsicherheit verringern, da sie erhöhte Rechte ermöglichen. Es gibt noch ein drittes Berechtigungs-Bit, das die Sicherheit eines Systems erhöhen kann: das `sticky bit`.

Das `sticky bit` erlaubt, wenn es auf ein Verzeichnis angewendet wird, nur dem Besitzer der Datei diese Dateien auch zu löschen. Dieses Recht ist nützlich, um die Löschung von Dateien in öffentlichen Verzeichnissen durch Benutzer, denen diese Dateien nicht gehören, zu verhindern, wie z.B. in `/tmp`. Um diese Berechtigung anzuwenden, stellen Sie der Berechtigung eine Eins (1) voran, beispielsweise so:

    # chmod 1777 /tmp

Den Effekt können Sie sich ansehen, indem Sie das Kommando `ls` ausführen:

    # ls -al / | grep tmp

    drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

Das `sticky bit` kann anhand des `t` ganz am Ende der Berechtigungen abgelesen werden.

Zurück | Zum Anfang | Weiter
Virtuelle Konsolen und Terminals | Nach oben | Verzeichnis-Strukturen

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.