Die Dateirechte sind Unix-weit identisch, aber teilweise werden sie durch ACLs noch erweitert, um die Rechtevergabe noch feiner einteilen zu können.

In der Praxis gibt es aber kaum Szenarien, wo das nötig ist, wenn man das Prinzip der Unix-Standardrechte erst einmal begriffen hat.

Noch etwas: Dateierweiterungen sind Unix völlig egal: Man kann problemlos ein Programm "Textdatei.txt" nennen, es ausführbar machen und dann ausführen. Dateierweiterungen sind auch nicht so festgelegt wie unter DOS - der Punkt ist ein ganz normaler Bestandteil des Dateinamens und nimmt keine Sonderrolle ein.

Unter UNIX allgemein gibt "ls -l" für jede Datei etwa so etwas aus:

-rwxr-xr-x   2 root     root        13876 Nov 17 15:13   myfile

Der Attribut-Zeichenkette (10 Zeichen) gibt Auskunft darüber, wer mit dieser Datei was machen darf und was für ein Typ es ist. Die Rechte-Zeichenkette teilt sich in 1+3+3+3 Zeichen auf. Kurzgefasst:

Die Zeichenfolge "rwx" steht beziehungsweise für "Read", "Write", und "eXecute":

Recht

Datei

Verzeichnis

r

Dateiinhalt lesen

Verzeichnisinhalt (Listing) lesen

w

Dateiinhalt schreiben

Verzeichnisinhalt ändern (Dateien hinzufügen, löschen und umbenennen)

x

(Programm-)Datei ausführen

in dieses Verzeichnis hineinwechseln

Zusätzlich gibt es noch folgende Attribute, die i.d.R. statt dem "x" eingesetzt werden, wo sie auftauchen:

Zusätzlich zu den Rechten gibt es je nach DateiSystem noch DateiAttribute, die besondere Verhaltensweise regeln.

Oft werden die Dateirechte auch in Form von Ziffernkombinationen angeben, meist in Verbindung mit dem Befehl chmod.

Hier einmal die gängigsten:

0755

rwxr-xr-x

weltlesbare Verzeichnisse/weltausführbare Dateien/Eigentümerschreibrecht

0644

rw-r--r--

weltlesbare Dateien

0666

rw-rw-rw-

bekanntermaßen ist das böse ;)

Wie kommt man auf diese Ziffernfolgen? Wenn man die Buchstabenkürzel für die Dateirechte rechts von den Ziffern als Binärzahl liest, wobei ein beliebiger Buchstabe für 1 und das Minuszeichen für 0 steht, ist diese Binärzahl gleich der Ziffernfolge, wenn man diese als Oktalzahl liest. Also: Bits für User, Gruppe und Rest in Dreiergruppen lesen und in Oktalziffern wandeln. chmod 0755 dateiname wandelt alle Rechte auf einmal auf rwxr-xr-x. Die erste der vier Ziffern steht für die SetUid/!SetGid/Sticky-Bits.

Oder etwas einfacher erklärt: 4=r 2=w 1=x, die Kombinationen erhält man durch Addition. Für die erste Ziffer gilt: 4=SetUid 2=SetGid 1=Sticky.

Führende Nullen kann man auch weglassen, d.h. 0755 = 755.

Besonderheiten

Dateien erstellen/löschen

Um eine Datei erstellen oder löschen zu können, muss man Schreibberechtigung auf das Verzeichnis haben.

Hintergrund: Eine Datei ist nichts anderes als ein Verzeichniseintrag, und um in einem Verzeichnis etwas einzutragen (oder auszutragen), muss man hineinschreiben können.

(!) Wenn auf dem Verzeichnis das sticky-Bit gesetzt ist, muss man immer der Eigentümer der Datei sein, um sie zu löschen.

Gruppenarbeit einfach gemacht ( Private Benutzergruppen / User Private Groups (UPG) )

Wenn mehr als ein Benutzer an einem System arbeitet und diese zusammen an Dateien arbeiten sollen, kann man die Zusammenarbeit sehr erleichtern, indem man sogenannte "Private Gruppen" und "SetGID" Gruppenverzeichnisse einrichtet. Ansonsten müssen die Benutzer jedesmal per Hand die Dateirechte anpassen, anstatt sie nur in ein entsprechendes Verzeichnis zu speichern, um anderen Zugriff erlauben.

Bei privaten Gruppen, auch "User Private Groups" (UPG) genannt, ist die primäre Gruppe jedes Benutzers seine private Gruppe, in dieser ist nur der Benutzer selbst einziges Mitglied. Diese Gruppe hat den gleichem Namen und ID-Nummer wie der Benutzer selbst. Vorteilhaft ist nun, dass man die standardmäßigen Datei-Erstellungsrechte "umask" gefahrlos so einstellen kann, dass auch der Gruppe Schreibzugriff erlaubt ist (umask 002). Da eine Datei normalerweise der primären Gruppe des Erstellers zugeordnet wird, ist bei Verwendung von privaten Grupen in dieser Gruppe ja nur der Eigentümer selbst.

BeiDebian und RedHat/Fedora sind private Gruppen und umask 002 Standard.

Wenn jetzt eine Gruppe von Benutzern gemeinsam Zugriff auf Dateien haben sollen, braucht man nur ein Verzeichnis zu erstellen, es der "echten" Gruppe mit den zugehörigen Benutzern zuzuordnen und das "Set Group ID" Attribut für das Verzeichnis zu setzten. Damit werden neu erstellte Dateien in dem Verzeichnis der echten Arbeitsgruppe zugeordnet, und durch die entsprechende umask Einstellung bekommen alle Mitglieder der Gruppe auch automatisch Schreibzugriff.

Siehe Beispiel 2 (Gruppenverzeichnis).

Beispiele

Beispiel 1

Ein Verzeichnis (d) namens "Dateien" mit folgenden Attributen

drwx--x---   2 oliver   winusers       1024 Nov 17 18:00 Dateien

dürfte also von Oliver gelesen, beschrieben und betreten (rwx) werden, alle User in der Gruppe "winusers" dürfen zwar ins Verzeichnis hineinwechseln, aber haben keine Möglichkeit, den Inhalt des Verzeichnisses zu erfahren (s.u.). Alle anderen dürfen gar nichts. Diese Rechte ändern darf nur der Besitzer der Datei, hier halt oliver.

Obiges Gruppenrecht ist u.U. sehr nützlich: Man kann (als Oliver) jemandem der Gruppe erzählen, im Verzeichnis befindet sich eine Datei namens "Steuererklärung.sdc", die er -- entsprechende Rechte der Datei vorausgesetzt -- problemlos öffnen und auch verändern kann. Aber er hat keine Möglichkeit herauszufinden, daß in demselben Verzeichnis noch eine Datei namens "Steuererklärung - Version fürs Finanzamt.sdc" liegt, die ganz andere Daten enthält, da er ja den Verzeichnisinhalt nicht erfahren kann. >:>

Einfach mal mit den Rechten rumspielen, das kann im Netzwerk sehr nützlich werden, wenn man diese flexibel einsetzt. Oliver braucht im obigen Beispiel übrigens nicht zur Gruppe winusers zu gehören, er hat seine Rechte als Dateieigentümer trotzdem ...

Beispiel 2 (Gruppenverzeichnis)

Ein Verzeichnis (d) namens "/home/share/Users" mit folgenden Attributen

drwxrws---   1 root   users           1024 Jun 19 10:43 /home/share/Users

Nehmen wir an, die User ronny und thomas gehören jeweils ihrer privaten Gruppe ronny bzw. thomas an (z.B. bei RedHat so üblich), wenn diese User nun zusätzlich der Gruppe users angehören, dann können beide über dieses Verzeichnis Dateien austauschen, ohne dass sie manuell die Gruppe der Dateien ändern müssten, da alle neuen Dateien automatisch der Gruppe users gehören (der Eigentümer bleibt immer der Ersteller der Datei und kann auch nur von root geändert werden, ein set user id für Verzeichnisse funktioniert nicht (das wäre auch nicht gut))

Wichtig: Die darüber liegenden Verzeichnisse müssen begehbar sein ('x' muss gesetzt sein).

Beispiel 3

d-wx-wx-wx   1 ftp    nobody           1024 Jun 19 10:43 write-only-directory/

setzt für others (den Rest der Welt) die Rechte einer Datei auf "write" und löscht alle anderen - so können alle zwar Dateien in diesem Verzeichnis erstellen, aber weder kann jemand ein Listing anzeigen lassen noch können User andere Dateien ändern oder löschen, da sie deren Namen ja nicht erfahren können.

Solche Rechte hat Mc-Afee z.B. auf ihrem Viren-FTP-upload-Verzeichnis benutzt - jeder kann da Viren reinschieben, aber keiner kann gucken, was drin ist, geschweige denn Dateien herunterladen. Mittlerweile akzeptieren sie Viren-Submissionen wohl nur noch per EMail.

Und nun?

OK, wie ändere ich diese Attribute? Das Programm chmod (Change file Mode) ist dafür verantwortlich. Die gängigen Dateimanager wie Konqueror, Nautilus oder der MidnightCommander können natürlich auch die Dateirechte anzeigen und ändern.

Fragen

Frage: Was mache ich eigentlich, wenn ich möchte, dass eine Gruppe von Benutzern auf einen Verzeichnisinhalt schreibend zugreifen darf, eine andere Gruppe nur lesend und der Rest gar keinen Zugriff? Geht das nur mit ACL? -- WinfriedMueller


Fiese Fehler

Ausgangssituation

root@poseidon:/# man man
man: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied

Tja, und das als root.

Außerdem meinte der lokal laufende Apache auch generell zu allem "Permission denied", obwohl die httpd.conf und die Verzeichnisrechte (zumindest dort, wo man hinschaut ;) ) korrekt waren.

Lösung

# ls -ld /
drwxr-xr-- 29 nemo users   4096 203-09-04 23:18 .

Aaaaaaah! - man ist suid man - und hat daher keine Rechte. Überhaupt hat alles, was nicht root oder nemo oder group users ist, ziemlich wenig Rechte, v.a. das x-Recht fehlt - ganz abgesehen davon, dass natürlich Owner/Group völlig falsch ist...

Lösung:

# chown root.root /
# chmod 755 /

Und schon verhält sich das System deutlich weniger merkwürdig. ;)

DateiRechte (zuletzt geändert am 2011-02-21 13:39:53 durch p54B2BE1E)