Zugriffsrechte

Was schon bekannt sein sollte... Weiter

Wer dem Buch durch die einzelnen Kapitel folgte, hat schon Bekanntschaft mit den wichtigsten Zugriffsmechanismen unter Unix geschlossen. Diese Rechte betreffen (die Darstellung entspricht der ersten Kolonne des Kommandos ls -l):

-rwxrwxrwx den Eigentümer,
-rwxrwxrwx die besitzende Gruppe und
-rwxrwxrwx alle anderen.

Ein r in der entsprechenden Dreiergruppe, erlaubt das Lesen für den betreffenden Nutzerkreis, ein w steht für die Befugnis, die Datei zu ändern und das x erlaubt das Ausführen der Datei bzw. - im Falle von Verzeichnissen - die Erlaubnis, in jenes zu wechseln.

Ziel dieses Abschnitts Zurück Anfang Weiter

Zunächst werden wir zwei spezielle Zugriffsrechte kennen lernen, die für gewisse Anwendungsfälle die üblichen Rechte "verbiegen". Des Weiteren werden Sie in der Lage sein, die Zugriffsrechte Ihrer Dateien nach Ihren Wünschen zu gestalten. Ebenso in diesem Abschnitt behandeln wir Dateiattribute, die einen anderweitigen Schutz der Daten gewährleisten.

Nach dem Studium dieses Abschnitts wissen Sie:

Spezielle Zugriffsrechte Zurück Anfang Weiter

Typische Listings im Langformat führen zu Ausgaben folgender Gestalt:

user@sonne>ls -l
drwxr-xr-x    23    root    root         1024  Feb 15 15:54   /usr
-rwxr-xr-x     1    root    root       110890  Dec 12 18:01   /usr/bin/zoo
-rw-r--r--     1    user   users         9655  Apr  6 09:38   nis.tex

Was die einzelnen Bits zu bedeuten haben, sollte bereits bekannt sein. Betrachten wir nun aber folgende Ausgaben:

user@sonne>ls -ld /t*
drwxrwxrwt   7   root    root       1024  Apr  7 10:07    /tmp

user@sonne>ls -l /usr/bin/passwd
-rwsr-xr-x   1   root    shadow    32916  Dec 11 20:47   /usr/bin/passwd

Die erste Besonderheit betrifft das Bit t des Verzeichnisses /tmp. Der Buchstabe steht in diesem Fall für »save program text on swap device« und bewirkt, dass in dieses Verzeichnis zu schreibende Daten so lange wie möglich nur in der Swap-Partition (bzw. Hauptspeicher) existieren und eventuell erst beim Shutdown des Systems tatsächlich zurückgeschrieben werden. Für kurzlebige Daten (temporäre Daten) kann ein solches Verhalten zur Performancesteigerung beitragen, da zeitaufwändige Schreiboperationen vermieden werden. Wird das Flag auf ein normales Verzeichnis angewandt, darf dessen Besitzer Dateien anderer Benutzer aus diesem Verzeichnis nicht löschen (das trifft auch auf /tmp! zu). In diesem Zusammenhang spricht man auch vom »Sticky Bit«.

Zur Erläuterung des s-Bits »set user or group ID on execution« betrachten wir ein kurzes C-Programmfragment, so wie das Programm passwd (dient zum Ändern des Passwortes) realisiert sein könnte:

// Programmfragment passwd.c

int main() {
   FILE *new;
   //...

   new = fopen ("/etc/passwd","a");
   if ( new == NULL ) {
      perror("fopen");
      // ...
   }
   //...
}

Der Systemadministrator übersetzt das Programm und installiert es mit folgenden Zugriffsrechten im Verzeichnis /usr/bin:

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

Ein normaler Benutzer möchte nun sein Passwort ändern und startet das Programm passwd:

user@sonne>passwd
fopen: permission denied

Was ist die Ursache?

Das Programm versucht, die Datei /etc/passwd zum Schreiben zu öffnen und scheitert natürlich, da nur Root die Schreibberechtigung besitzt (dies darf auch nicht anders sein, sonst könnte jeder die Passwörter manipulieren). Grund hierfür ist, dass der Prozess, der das Programm ausführt, die Benutzerkennung von user erhält.

Mit Hilfe des s-Flags kann die Benutzerkennung des Prozesses vom rufenden Benutzer/Gruppe in die des Besitzers / der besitzenden Gruppe umgewandelt werden, so dass passwd nun "im Auftrag" von Root die Datei /etc/passwd öffnet. Ein s-Bit darf nur bei Binärdateien gesetzt werden (keine Shellskripte).

Chmod -Symbolischer Modus Zurück Anfang Weiter

Zum Ändern der Zugriffsrechte steht das Kommando chmod zur Verfügung:

Aufruf:  chmod [options] <mode> <dateiname>

Für die möglichen Optionen sei auf die Manuals verwiesen.

Symbolisch lassen sich die Rechte setzen durch eine Kombination aus der betreffenden Rechtegruppe:

Symbol Rechtegruppe
u Eigentümer (user)
g Gruppe (group)
o Andere (others)
a Alle (all)

und den entsprechenden Rechten:

Symbol Recht
r Leserecht
w Schreibrecht
x Ausführungsrecht
s s-Bit setzen
t t-Bit setzen
+ Recht(e) hinzufügen
- Recht(e) entfernen
= Genau diese Recht(e) setzen

Beispiele

user@sonne>ls -l hello
-rw-r--r--   1  user    users    108 Apr  7 12:10   hello

user@sonne>chmod a+w hello
-rw-rw-rw-   1  user    users    108 Apr  7 12:10   hello

user@sonne>chmod g-rw,u+xs hello
-rws---rw-   1  user    users    108 Apr  7 12:10   hello

Chmod -Numerischer Modus Zurück Anfang Weiter

Nummerischer Modus von chmod

Abbildung 1: Nummerischer Modus von chmod

Rechte werden bitweise dargestellt, für Eigentümer, Gruppe und Andere.

Recht Bitdarstellung Wert
Execute 0000 0001 1
Write 0000 0010 2
Read 0000 0100 4
rwx 0000 0111 7

Jede Rechtegruppe wird durch einen numerischen Wert repräsentiert, die Sonderrechte (s,t) werden durch einen eigenen Wert dargestellt. Somit werden dem Kommando chmod maximal vier Werte übergeben (Abbildung). Fehlen Werte, werden diese von links her (!) als Null (keine Rechte) angenommen, d.h.

chmod 1 <datei>

ist gleichbedeutend mit

chmod 0001 <datei>

Für die Sonderrechte gelten folgende Bitdarstellungen:

Recht Bitdarstellung Wert
t-Flag 0000 0001 1
s-flag der Gruppe 0000 0010 2
s-Flag des Eigentümers 0000 0100 4

Beispiele

user@sonne>ls -l hello
-rw-r--r--   1  user    users    108 Apr  7 12:10   hello

user@sonne>chmod 666 hello
-rw-rw-rw-   1  user    users    108 Apr  7 12:10   hello

user@sonne>chmod 4706 hello
-rws---rw-   1  user    users    108 Apr  7 12:10   hello


Voreinstellung für neue Dateien Zurück Anfang Weiter

Neue Dateien/Verzeichnisse werden offensichtlich stets mit ein und denselben Zugriffsrechten erzeugt:

user@sonne> mkdir testdir
user@sonne> touch testdat
user@sonne> ls -ld test*
-rw-r--r--   1  user    users           0 Apr  7 13:11   testdat
drwxr-xr-x   2  user    users        1024 Apr  7 13:11   testdir

Zuständig für dieses Verhalten ist die so genannte umask, die oft in der Datei /etc/profile auf den Wert 022 voreingestellt wird. Zusätzlich wird noch eine Maximalmaske benötigt, die sich für Verzeichnisse und andere Dateien unterscheidet. Die bei der Erzeugung gesetzten Rechte entstehen nun, indem von der Maximalmaske der durch umask vorgegebene Wert subtrahiert wird:

Verzeichnisse Dateien
Maximalmaske 777 666
umask 022 022
Ergebnis 755 644

Mit dem Kommando umask lässt sich die Voreinstellung ändern.

Besitzer ändern Zurück Anfang Weiter

Wird eine Datei neu erzeugt, so ist ihr Eigentümer immer derjenige, der die Aktion veranlasste und die Datei gehört zur Default-Gruppe des Benutzers. Zum Ändern der Werte dienen die Kommandos chown (change owner) und chgrp (change group).

Den Besitzer einer Datei darf einzig Root ändern. Wäre dem nicht so, könnten hintertriebene Hacker einem beliebigen Benutzer ein modifziertes Programm unterschieben, das dann, mit dessen Rechten gestartet, ggf. allerlei Schindluder im System treiben könnte.
Etwas liberaler geht es bei Gruppen zu, wo der Besitzer Dateien beliebig zwischen Gruppen, denen er angehört, hin und her jonglieren kann.

Beginnen wir mit dem Kommando chgrp:

Aufruf:   chgrp [OPTIONEN]... GRUPPE DATEI...

Um die Gruppenzugehörigkeit einer Datei zu wechseln, geben wir Folgendes ein:

user@sonne> ls -l datei
-rw-r--r--   1  user    users       120 May 30 11:25   datei
user@sonne> chgrp fibel datei
user@sonne> ls -l datei
-rw-r--r--   1  user    fibel       120 May 30 11:25   datei

Das Beispiel funktioniert allerdings nur, wenn "user" Mitglied in den Gruppen "users" und "fibel" und Eigentümer von "datei" ist. "chgrp" kann auch auf Verzeichnisse angewandt werden, in dem Fall ist die Option "-R" hilfreich, um rekursiv alle enthaltenen Dateien/Verzeichnisse zu bearbeiten.

Das Kommando ändert, wird es auf einen symbolischen Link angewandt, die Datei, auf die der Link verweist. Mit der Option "-h" lässt sich zusätzlich die Gruppe des Links modifizieren (ab Linux-Kernel 2.2).

user@sonne> ls -l bla datei
lrwxrwxrwx   1  user   users         5 May 30 11:43   bla -> datei
-rw-r--r--   1  user   users       120 May 30 11:25   datei

user@sonne> chgrp fibel bla
user@sonne> ls -l bla datei
lrwxrwxrwx   1  user   users         5 May 30 11:43   bla -> datei
-rw-r--r--   1  user   fibel       120 May 30 11:25   datei

user@sonne> chgrp users datei
user@sonne> chgrp -h fibel bla
user@sonne> ls -l bla datei
lrwxrwxrwx   1  user   fibel         5 May 30 11:43   bla -> datei
-rw-r--r--   1  user   fibel       120 May 30 11:25   datei

Mit chown kann sowohl der Besitzer einer Datei als auch deren Gruppenzugehörigkeit gesetzt werden.

Aufruf:   chown [OPTIONEN]... BESITZER[.[GRUPPE]] DATEI...

Die wichtigen Optionen arbeiten analog zu "chgrp"; also kann "-R" verwendet werden, um bei Verzeichnissen rekursiv deren Besitzer / besitzende Gruppe zu modifzieren. Im Unterschied zu "chgrp" bewirkt die Anwendung auf symbolische Links die Änderung deren Werte.

Soll nun nur der Besitzer geändert werden, wird dieser einfach angegeben:

root@sonne> chown newbie datei

Soll die Gruppe gesetzt werden, ist dem Gruppennamen ein (Doppel)Punkt voranzustellen:

root@sonne> chown .fibel datei

Wünscht man sowohl den Besitzer als auch die Gruppe zu wechseln, sind beide Namen durch einen Punkt oder Doppelpunkt voneinander zu trennen:

root@sonne> chown newbie:fibel datei

Gibt man den neuen Besitzer an, gefolgt von einem (Doppel)Punkt, so wird als neue Gruppe dessen Defaultgruppe aus der Datei /etc/passwd verwendet.

Dateiattribute Zurück Anfang

Die Anwendung von Attributen funktioniert nur auf dem Linux-Dateisystem "ext2".

Selbst der erfahrene Linuxer ist vor Fehlern nicht gefeit. Man stelle sich nur vor, man wollte alle Dateien aus einem Unterverzeichnis löschen:

user@sonne> rm -rf ~/DirToDelete/ *

Das Beispiel sieht harmlos aus, birgt aber einen fatalen Fehler in sich: das Leerzeichen zwischen Pfadangabe und dem *. Verschwunden sind nicht die gewünschten Daten, sondern der komplette Inhalt des aktuellen Verzeichnisses (falls man die Berechtigung dazu besaß).

Linux bietet bekannterweise keine zuverlässige Methode des Wiederherstellens gelöschter Daten. Dafür ermöglicht das Linux-Dateisystem ext2 die Vergabe von Attributen für Dateien und Verzeichnisse. Sicher wird man aus Bequemlichkeit meist auf diese verzichten, aber essentielle Daten lassen sich somit zuverlässig schützen. Zum Setzen von Attributen dient das Kommando chattr, anzeigen lassen sie sich mittels lsattr:

a

Die Datei kann weder gelöscht noch deren bisheriger Inhalt verändert werden. Allerdings ist das Anhängen von Daten möglich. Dieses Attribut darf nur Root setzen.

user@sonne> lsattr test.txt; ls test.txt
-------- test.txt
-rw-r--r--   1  user   users         32 Dec 19 19:52   test.txt
root@sonne> chattr +a test.txt
user@sonne> rm test.txt
rm: Entfernen von Żtest.txt½ nicht möglich: Die Operation ist nicht erlaubt
user@sonne> cat < test2.txt >> test.txt; ls -l test.txt
-rw-r--r--   1  user   users         64 Dec 19 19:53   test.txt

d

Eine so gekennzeichnete Datei wird beim Sichern mit dump nicht berücksichtigt.

i

Die Datei kann weder umbenannt noch modifiziert noch gelinkt werden. Nur Root darf das Attribut setzen.
Wird dieses Attribut für Verzeichnisse gesetzt, darf in diesem Verzeichnis keine Datei gelöscht werden, jedoch ist eine Änderung dieser und das Erzeugen neuer Dateien möglich.

s

Eine mit diesem Attribut versehene Datei wird beim Löschen mit 0-Bytes überschrieben.

S

Wird die Datei modifiziert, so wird sie unmittelbar auf die Festplatte zurückgeschrieben, also ohne Zwischenpufferung.

Es existieren weitere Attribute, die aber in der momentanen Implementierung des ext2 nicht unterstützt werden.