CHMOD - Lese-, Schreib- und Ausführungsrechte

Was ist CHMOD? .. ist die am häufigsten aufkommende Frage, wenn es um Themen, wie die Installation der PHP+MySQL Skripte geht. Mit folgendem Text wird versucht, die Frage zu beantworten.

Mit dem Befehl CHMOD (englisch: change mode) werden im UNIX Umfeld Lese-, Schreib- und Ausführungsrechte von Dateien und Verzeichnisse gesetzt. UNIX bzw. Linux Betriebssysteme (wie Suse, Debian, Redhat, Ubuntu, usw..) werden am häufigsten im Website-Hosting Bereich eingesetzt und werden damit zum Thema vieler Webmaster.

Wenn man einem Programm die Möglichkeit geben möchte eine Datei zu lesen, muss es die notwendigen Leserechte zugewiesen bekommen. Soweit ist das nichts Neues. Im Webserver-Umfeld ist das in vielen Fällen noch etwas anders. Bei vielen Webspace-Angeboten werden Dateien unter einem anderen Benutzer auf dem Webserver (FTP) geladen, als sie letztendlich ausgeführt werden. So läuft der Webserver (Apache) unter einem ganz anderen Benutzer. Für diesen Webserver-Benutzer muss nun explizit die Genehmigung zum lesen, schreiben oder ausführen der Datei gesetzt werden, ansonsten können bestehende Dateien von diesem unterschiedlichen Benutzer nicht gelesen und neue Dateien nicht erstellt werden.
Und genau diese Rechtezuweisung wird mit dem Befehl CHMOD durchgeführt.


Im folgenden wird mit dem Programm WinSCP in wenigen Schritten das Ändern dieser Einstellungen veranschaulicht.
WinSCP ist kostenfrei und kann für SSH/SCP/SFTP/FTP verbindungen genutzt werden, für Windows und Linux.
Als Alternative sollen hier noch folgende Tools erwähnt werden:
- Fire FTP - FTP Client Plugin für den Firefox Browser; für Windows, Linux, Mac, ..
- SmartFTP - kostenpflichtig, Trialversion verfügbar; für Windows

Schritt 1: Datei/Verzeichnisauswahl

Nachdem Sie sich mit WinSCP zu einem Webspace verbunden haben, wird ihnen sofort die Datei Struktur angezeigt. Navigieren Sie zum gewünschten Verzeichnis. Im Beispiel von ScarFormManager ist es das Verzeichnis /sfm/acp/data/. Wir wollen die Rechte so setzen, das der Webserver diesen Verzeichnis nicht nur lesen, sondern auch beschreiben kann. Dafür müssen wir den CHMOD 777 setzen.

Durch einen Rechts-Klick auf den Verzeichnisnamen öffnet sich das Context-Menü, am Ende befindet sich die gewünschte Option "Eigenschaften".

WinSCP, CHMODWinSCP, CHMOD

Schritt 2: Rechtevergabe

Im Dialog für die Rechtevergabe können einige Informationen neu gesetzt werden, wir betrachten nur den Block "Rechte", "Gruppe" und "Eigentümer" bleibt unverändert.

Markieren Sie alle Lese- (R), Schreib- (W) und Ausführungsrechte (X) für den Eigentümer, die Gruppe und Andere, dadurch ergibt sich im Oktal-Feld die Textinterpretation 777.

In diesem Beispiel sollen alle Dateien und Verzeichnisse unterhalb vom /data/ Verzeichnis diese Rechte erhalten, deshalb selektieren wir zusätzlich "Gruppe, Eigentümer und Rechte rekursiv setzen". Das Programm geht so alle enthaltenen Verzeichnisse durch und setzt die Rechte für jedes enthaltene Verzeichnis und Datei.
Wenn diese Option nicht gesetzt wird, wird lediglich das ausgewählte Verzeichnis bzw. Datei angepasst.

WinSCP, CHMOD - OptionWinSCP, CHMOD - Option

Bestätigen Sie die Änderung durch "OK". Der Vorgang kann je nach Verzeichnisumfang und Verbindungsgeschwindigkeit etwas länger benötigen.


CHMOD Rechte-System

CHMOD verfügt über drei unterschiedliche Rechte Bereiche.
1. Stelle - Eigentümer: Die eigenen Rechte (englisch: user)
2. Stelle - Gruppe: Die Rechte der selben Gruppe (englisch: group)
3. Stelle - Alle Anderen: Die Rechte für alle anderen Benutzer (englisch: others)

Alle drei Bereiche können die folgenden unterschiedliche Rechte aufweisen. Der zusätzlich aufgeführte Wert ist wichtig für die Berechnung der Oktaldarstellung eines CHMOD Wertes, bei diesem werden die einzelnen Werte pro Bereich zusammengerechnet und ergeben einen Gesamtwert zwischen 0 - 7.
r Leserechte (read), Wert: 4
w Schreibrechte (write), Wert: 2
x Ausführungsrechte (execution), Wert: 1

Zugriffsrecht Oktal Bedeutung
Eigentümer Gruppe Andere    
rwx rwx rwx 777 Lesbar, schreibbar und ausführbar für Alle Benutzer .
rwx rwx r-x 775 Wie 1., aber ohne Schreibrecht für Andere Benutzer (z.b. CGI-Scripts, Perl-Skripte).
rwx r-x r-x 755 Wie 1., aber ohne Schreibrecht für Andere Benutzer und Benutzer der eigenen Gruppe.
rw- rw- rw- 666 Alle Benutzer dürfen lesen und schreiben.
Optimaler CHMOD Wert, wenn der PHP Parser in einer anderen Gruppe ist und von PHP selbst geändert werden können soll.
rw- rw- r-- 664 Typischer Standardwert für neue Dateien: Lesbar für alle Benutzer, nicht schreibbar für Andere Benutzer, nicht ausführbar.
rw- rw- --- 660 Der Dateibesitzer und die Gruppe kann die Datei lesen und schreiben, alle Anderen haben keine Berechtigungen.
Optimaler CHMOD Wert, wenn der PHP Parser in der selben Gruppe ist und von PHP selbst geändert werden können soll.
rw- r-- r-- 644 Lesbar für alle Benutzer, nicht schreibbar für Andere Benutzer und Benutzer der eigenen Gruppe, nicht ausführbar.
rw- r-- --- 640 Der Dateibesitzer kann lesen und schreiben, die Gruppe nur schreiben und alle übrigen Benutzer haben keinen Zugriff.
Optimaler CHMOD Wert, wenn der PHP Parser in einer anderen Gruppe ist.
rw- --- r-- 604 Lesbar für alle Benutzer, nicht schreibbar für Andere Benutzer und Benutzer der eigenen Gruppe, nicht ausführbar.
Optimaler CHMOD Wert, wenn der PHP Parser in einer anderen Gruppe ist.
rw- --- rw- 606 Lesbar für alle Benutzer, nicht schreibbar für Andere Benutzer und Benutzer der eigenen Gruppe, nicht ausführbar.
Optimaler CHMOD Wert, wenn der PHP Parser in einer anderen Gruppe ist und von PHP selbst geändert werden können soll.
rw- --- --- 600 Der Dateibesitzer kann lesen und schreiben, alle übrigen Benutzer haben keinen Zugriff.
Optimaler CHMOD Wert, wenn PHP unter dem selben Benutzernamen, als der Dateibesitzer, ausgeführt wird (möglich durch suPHP) und von PHP selbst geändert werden können soll.
r-- --- --- 400 Der Dateibesitzer kann lesen, alle übrigen Benutzer haben keinen Zugriff.
Optimaler CHMOD Wert, wenn PHP unter dem selben Benutzernamen, als der Dateibesitzer, ausgeführt wird (möglich durch suPHP).

Verzeichnisse benötigen immer das Ausfürhungsrechte (X), da sie ansonsten nicht betreten und eingesehen werden können und damit auch der Inhalt des Verzeichnisses nicht erreichbar ist (zum Beispiel sind die System-Befehle "cd", "ls" oder "ll" betroffen).


Die Oktal Schreibweise vom CHMOD Wert - UID-Bit, GID-Bit und Sticky-Bit

Die Oktal-Form wurde bereits in der oberen Tabelle dargestellt, je nachdem ob man eine Datei/Verzeichnis lesen, schreiben und/oder ausführen darf, unterscheidet sich der Wert von 0 bis 7.

Zur Vollständigkeit soll hier noch das UID-Bit, GID-Bit und Sticky-Bit erwähnt werden. Im Linux Umfeld existieren Benutzername und Login lediglich zur Systemanmeldung in den Dateien /etc/passwd und /etc/shadow, weiterhin wird dort eine UID und GID angegeben. Diese können theoretisch für mehrere Benutzer identisch sein.

Beispiel-Inhalt der /etc/passwd. Das zugehörige Password, hier nur ein "x", befindet sich in der Datei /etc/shadow.

USERNAME:x:UID:GID:BEZEICHNUNG:/home/username:/bin/bash

In der Oktal-Schreibweise sieht man daher auch häufig vierstellige Schreibweisen wie 0777. Die erste Stelle kombiniert UID-, GID- und Sticky-Bit in der selben Form, wie die übrigen drei Stellen.
UID = 4, GID = 2, Sticky-Bit = 1

Ein CHMOD kann also entweder in der dreistlligen oder vierstelligen Variante oktal dargestellt werden. Bei der dreistelligen Variante, wird automatisch eine 0 gesetzt.


Hinweis: CHMOD 777 vs. 666 vs. 755 vs. 744 usw.

PHP Dateien benötigen keine Ausführungsrechte und müssen daher nicht auf den maximalen Wert, CHMOD 777, gesetzt werden. In den Anleitungen wird CHMOD 777 oft als allgemeiner Standard angegeben, da die unterschiedlichen Benutzerstrukturen gleichzeitig zu unterschiedlichen "optionalen" Berechtigungen führen.

Das Hauptanliegen ist oft das Erreichen einer "beschreibaren Datei". Gleichzeitig wird dadurch aber der Zugriff und die Ausführung für alle Benutzer des selben Servers ermöglicht. Wenn es sich um keine Ausführbare Datei handelt, zum Beispiel ein Shell-Skript, genügt als maximaler Wert CHMOD 666.

Will man für den eigenen Benutzer alle Berechtigungen, für andere aber nur eingeschränkte genügen oft CHMOD Werte 755 oder 744.

Im normalen Linux Umfeld (zum Beispiel Suse) vererben sich Berechtigungen von übergeordneten Verzeichnissen. Kann ein Benutzer auf ein Verzeichnis also nicht zugreifen, kann er auch nicht auf darin enthaltene Verzeichnisse und Dateien zugreifen.In diesem Fall ist CHMOD 777 also nur eine Gefahr, wenn Benutzer auch in allen davor liegenden Verzeichnisse zugreifen können.
Auf einigen UNIX und Host Systemen gilt diese Vererbung nicht, hier gilt explizit das recht eines einzelnen Verzeichnisses bzw. Datei.

Warum PHP Dateien keine Ausführungsrechte benötigen

Eine PHP Datei liegt im Quelltext vor und wird vom Parser eingelesen, dieser Parser kann der selben oder einer anderen Benutzergruppe auf dem Server angehören. Befindet sich der PHP Parser in der selben Gruppe sind die Rechte an der zweiten ansonsten an der dritten Stelle relevant. Da im PHP Umfeld der PHP Parser über den Webserver (z. B. Apache, IIS) die Ausführung übernimmt (und damit das eigentliche PHP Programm darstellt), benötigen PHP Dateien keine Ausführungsrechte um aufgerufen zu werden.

Das wäre anders, wenn eine PHP Datei auf dem Server als eigenes Programm genutzt wird und in der ersten Zeile der Interpreter angegeben wurde (im Perl Umfeld typisch), darauf wird hier aber nicht näher eingegangen.


Achtung: Sicherheitsanmerkung

Durch das falsche setzen von CHMOD können unberechtigte Benutzer (vom selben Server) Zugriff auf Ihre Dateien erhalten, beachten Sie diesen Umstand und seien Sie entsprechend vorsichtig.
Die Berechtigungen Ihres obersten Verzeichnisses sollten Sie deshalb niemals ändern, bzw. niemals mit vollen Rechten (CHMOD 777) versehen. Mit dem "obersten Verzeichnis" ist ihr Account-Start-Verzeichnis gemeint.