Wie funktionieren die Dateirechte?

Grundlagen

Eigentlich ist das Rechtesystem von Linux recht einfach. Jede Datei hat festgelegte Dateirechte, sowie einen Besitzer und eine Gruppe. Wenn man mal ls -l in der Konsole eintippt, dann werden diese dort angezeigt:

$ ls -l
insgesamt 102424
-rw-r--r--  1 user group    4043 2007-12-13 12:57 archive.zip
-rw-r--r--  1 user group  728481 2007-12-10 13:39 document.pdf
drwx------  2 user group    4096 2007-09-29 11:59 directory
-rwxr--r--  1 user group  700514 2007-12-02 20:28 script.sh

Die erste Spalte enthält die Zugriffsrechte. In der dritten steht der Besitzer und in der vierten die Gruppe. Die Benutzerrechte setzen sich jetzt so zusammen:

d ur uw ux gr gw gx or ow ox

Das d gibt dabei an, ob es sich um ein Verzeichnis handelt. Danach gibt es drei Gruppen von Rechten, die jeweils r, w und x enthalten, die Lese-, Schreib- und Ausführungsrechte beschreiben. Die erste Gruppe (u, user) bezieht sich hierbei auf den Besitzer, die zweite (g, group) auf die Gruppe und die letzte (o, others) auf alle anderen. Die Präfixe zeigt Linux nicht an, sondern nur r, w und x.

Wenn eine Berechtigung nicht gesetzt ist, erscheint an ihrer Stelle einfach ein Minus.

Hier nun drei Beispiele und eine Erklärung, was sie bedeuten:

1) -rw-r--r--
2) drwxrwx---
3) -rwx------
  1. Dies sind die Standardrechte für Dateien auf einem Linuxsystem. Der Besitzer darf die Datei lesen und verändern. Alle anderen dürfen sie nur lesen.
  2. Hier handelt es sich um ein Verzeichnis, das vom Besitzer und allen Gruppenmitgliedern geöffnet und beschrieben werden darf. Alle übrigen Benutzer haben keinen Zugriff.
  3. Auf diese Datei darf nur der Besitzer zugreifen und er kann sie sogar ausführen. Alle anderen haben keinen Zugriff.

Hinweis bezüglich Verzeichnissen: Damit man den Inhalt eines Verzeichnisses anzeigen kann, braucht man für das Verzeichnis Ausführungsrechte!

Numerische Rechteangaben

Die Zugriffsrechte können auch über einen Zahlencode angegeben werden. Hierbei gibt es für jede Nutzergruppe eine Stelle. Die erste ist für den Besitzer, die zweite für die Gruppe und die dritte für alle anderen. Die Werte, die an diesen Stellen stehen müssen, berechnen sich durch eine ganz einfache Rechnung. Man addiert einfach folgende Werte auf:

  • 4: Leserechte
  • 2: Schreibrechte
  • 1: Ausführungsrechte

Die Standardrechte für eine Datei bekommt man also so:

user  = read + write = 4 + 2 = 6
group = read                 = 4
world = read                 = 4

=> 644

Ein Verzeichnis hat zusätzlich noch für alle Ausführungsrechte:

user  = read + write + execute = 4 + 2 + 1 = 7
group = read + execute         = 4 + 1     = 5
world = read + execute         = 4 + 1     = 5

=> 755

Will man irgendwo einfach garkeine Rechte vergeben, nimmt man natürlich die 0.

Dateirechte ändern

Um Dateirechte zu ändern, braucht man Schreibzugriff. Hat man diesen, kann man mit dem Befehl chmod die Rechte für eine Datei oder ein Verzeichnis ändern. Am einfachsten ist es eigentlich, wenn man hier zur Rechteangabe durch Zahlen zurückgreift:

$ chmod 644 eindokument.pdf

So würde man einer Datei die Standardrechte geben. Wem Buchstaben lieber sind, der kann sein Ziel auch so erreichen:

$ chmod u=rw,g=r,o=r eindokument.pdf

Statt dem = kann man hier auch + oder - verwenden, wenn man die vorhandenen Rechte nur ergänzen oder beschneiden will.

Zusätzliche Dateirechte

Es gibt neben den Rechten, die den Zugriff auf eine Datei bzw. ein Verzeichnis regeln auch noch zusätzliche Einstellungen:

  • Sticky: Ist eine Altlast, die eigentlich keinen Rolle mehr spielt.
  • SetUID: Sorgt dafür, dass die Datei immer mit dem Benutzerkonto des Besitzers ausgeführt wird.
  • SetGID: Wie bei SetUID nur statt mit dem Besitzer mit der Gruppe.

Will man einer Datei ein solches zusätzliches Bit verpassen, dann kann man dies tun, indem man es hinzufügt:

$ chmod u+s einscript.sh

Nun würde für den Benutzer das SUID Bit gesetzt und das Script immer mit dem Konto des Besitzers ausgeführt. In der Ausgabe der Rechte würde nun in der Spalte für den Besitzer das x durch ein s ersetzt. Würde man das SGID-Bit setzen wollen, müsste man es für die Group setzen:

$ chmod g+s einscript.sh

Alternativ zu dieser Methode kann man auch wieder zur numerischen Repräsentation greifen, wobei hier nun eine zusätzliche Zahl vor den anderen eingeführt wird, bei der folgende Belegungen gelten:

  • 4: SetUID
  • 2: SetGID
  • 1: Sticky

Wenn man also ein Script haben möchte, das immer als der Besitzer ausgeführt werden darf, nur vom Besitzer editiert und von Gruppenmitglieder nur angesehen und ausgeführt werden darf, dann hätte man:

$ chmod 4750 einscript.sh

Besitzer und Gruppe ändern

Mit den Befehlen chown und chgrp kann man Besitzer und Gruppe einer Datei bzw. eines Verzeichnisses ändern:

$ chown einuser einedatei.txt
$ chgrp einegroup einedatei.txt

Einfacher geht es auch so:

$ chown einuser:einegroup einedatei.txt