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.
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:
- Welche 5 Zugriffsrechte existieren
- Wie Sie Zugriffsrechte ändern
- Warum neue Dateien/Verzeichnisse offensichtlich immer dieselben Rechte erhalten
- Was Dateiattribute sind
- Wie Sie Ihre Daten vor versehentlichem Modifzieren schützen können
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).
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
|
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.
ist gleichbedeutend mit
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
|
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.
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.
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.
|