weidner/archives/2013/10/

Analyse von Zugriffsproblemen unter Linux (1) - traditionelle Zugriffsrechte

In diesem und den folgenden Artikeln widme ich mich der Analyse von Zugriffsproblemen unter Linux.

In diesem ersten Teil geht es um traditionelle UNIX-Zugriffsrechte.

Teil 2 beschäftigt sich mit Dateiattributen bei ext2, ext3 und ext4.

Teil 3 beschäftigt sich mit POSIX Capabilities.

In Teil 4 gehe ich auf AppArmor ein.

Ein Indiz für ein Zugriffsproblem ist zum Beispiel ein fehlgeschlagener Systemaufruf, den ich in der Ausgabe von strace finden kann, wie diesen hier:

open("tmp/abc", O_RDONLY) = -1 EACCES (Permission denied)

Um Zugriffsprobleme analysieren zu können, muss ich wenigstens die Grundlagen der Zugriffskontrolle verstehen.

Ich fange meine Betrachtungen mit der traditionellen benutzerbestimmten Zugriffskontrolle (discretionary access control, DAC) an und widme mich in den nachfolgenden Artikeln den Mechanismen für zwingend erforderliche Zugriffskontrolle (mandatory access control, MAC).

Allen Mechanismen für Zugriffskontrolle gemeinsam ist, dass in dem Moment, in dem ein Subjekt (ein Prozess) eine Aktion, wie zum Beispiel Lesen oder Schreiben, auf ein Objekt (eine Datei) anwenden will, die Zugriffsrechte geprüft und dann gewährt oder verweigert werden.

Traditionelle Unix-Dateirechte

Im traditionellen Zugriffsmodell werden die Zugriffsrechte zusammen mit den Informationen über den Eigentümer und die Gruppe der Datei im Inode geführt, und zwar als Bitmap mit je drei Bits, die die grundlegenden Rechte für den Dateieigentümer, die Eigentümergruppe sowie alle anderen bestimmen. In dieser Reihenfolge werden die Rechte auch geprüft und angewandt.

Grundlegende Rechte

Das Leserecht (r, read) bedeutet für reguläre und Gerätedateien, dass Daten aus dieser gelesen werden dürfen. Für Verzeichnisse bedeutet es, dass diese aufgelistet werden dürfen.

Das Schreibrecht (w, write) bedeutet für reguläre Dateien und Gerätedateien, dass Daten dorthin geschrieben werden dürfen. Bei Verzeichnissen bedeutet es, dass Einträge neu angelegt beziehungsweise entfernt werden dürfen, unabhängig von den Rechten der Datei, auf die der betreffende Eintrag verweist. Somit ist es möglich, eine Datei zu löschen oder umzubenennen, auf die man keine Schreib- oder Leserechte besitzt.

Das Ausführrecht (x, execute) bei einer regulären Datei bedeutet, dass sie als Prozess ausgeführt werden kann. Dabei ist bei einer Binärdatei nicht einmal das Leserecht auf diese Datei nötig. Bei einem ausführbaren Skript wird das Leserecht benötigt, da der Skript-Interpreter die Datei lesen muss, um ihr Programm abzuarbeiten. Bei einem Verzeichnis bedeutet das x Bit, dass ich in das Verzeichnis wechseln und darin verzeichnete Dateien benutzen darf. Dafür ist kein Leserecht erforderlich, wenn ich den Namen der Datei kenne.

Sonderrechte

Zusätzlich zu den Standardrechten gibt es drei Bits für Sonderrechte.

Das setuid Bit bei einer ausführbaren Datei bedeutet, dass diese nicht unter der UID des aufrufenden Prozesses, sondern unter der der Datei ausgeführt wird.

Das setgid Bit bei einem Verzeichnis bewirkt, dass in diesem Verzeichnis neu angelegte Dateien automatisch der Gruppe des Verzeichnisses anstelle der aktiven Gruppe des erzeugenden Prozesses zugeordnet werden.

Das sticky Bit bewirkt bei einem Verzeichnis, dass Dateien in diesem Verzeichnis nur von ihrem Eigentümer oder root gelöscht werden dürfen. Bei einer ausführbaren Datei bewirkte es früher, dass der Programmcode nach der Ausführung im Hauptspeicher verblieb. Das brachte Vorteile bei Programmen, die sehr häufig benutzt wurden und dann nicht mehr jedesmal von der Platte geladen werden mussten. Bei modernen Systemen ist das obsolet.

Einschränkungen

Die Zugriffsrechte können durch Optionen beim Einhängen des Dateisystems eingeschränkt werden. Diese kann ich mit dem Befehl mount ohne Parameter anzeigen lassen.

Die Option noexec bewirkt, dass das x Bit keinen Effekt hat. Damit gekennzeichnete Dateien können nicht einfach durch Angabe ihres Pfades gestartet werden.

Die Option nosuid bewirkt, dass das setuid Bit keinen Effekt hat. Ausführbare Dateien werden immer mit der UID des aufrufenden Prozesses ausgeführt.

Programme zum Ansehen und Bearbeiten der Zugriffsrechte

Um die traditionellen Zugriffsrechte einer Datei anzusehen kann ich das Program ls mit der Option -l verwenden:

$ ls -a -l
insgesamt 116
drwxr-xr-x 2 mathias mathias  4096 Okt  5 10:19 .
drwxr-xr-x 5 mathias mathias  4096 Sep 30 22:26 ..
-rw-r--r-- 1 mathias mathias    34 Sep 30 22:26 .project
...

Das Programm zeigt mir in der ersten Spalte den Typ und die Rechte der Datei an, in der dritten Spalte den Eigentümer und in der vierten die Gruppe.

Um den Eigentümer einer Datei zu ändern, verwende ich das Programm chown. Diese Operation ist nur root erlaubt, da alle anderen Benutzer damit ihre Rechte an der Datei verlieren würden.

Die Gruppe einer Datei kann ich mit chgrp ändern. Das darf sowohl der Eigentümer der Datei als auch root.

Die Dateirechte ändere ich mit dem Programm chmod. Auch diese Operation darf nur der Eigentümer oder root.

Details zu den Programmen finden sich in den entsprechenden Handbuchseiten.

Dieser Artikel wird Teil des Buches Fehlersuche bei Linux-Servern und IP-Netzwerken, an dem ich momentan arbeite. Weitere Informationen zu diesem Buch finden sich unter http://buecher.mamawe.net/buecher/troubleshoot-linux-network/.

Posted 2013-10-06
Tags: