Dateirechte

Administratoren

Diese Seite beschreibt kurz PmWikis Einstellungen für Datei- und Verzeichnisrechte in einer typischen Unix-Umgebung.

Einfache Installation (out of the box)

Sehen wir uns zunächst PmWiki ohne geladene Kochbücher an. PmWiki muss in der Lage sein,

  • in das wiki.d/-Verzeichnis zu schreiben, um Seiten zu speichern,
  • in das uploads/-Verzeichnis zu schreiben, um Uploads zu speichern.

Das sind die *einzigen* Verzeichnisse, in die der Webserver schreiben können muss. Es ist für PmWiki egal, wer diese Verzeichnisse erzeugt oder besitzt, solange es Schreibrechte darin erhält.

Alles Andere sollte dem Besitzer des Accounts gehören und vom Webserver-Account gelesen werden können (aber normalerweise nicht für den Webserver-Account beschreibbar sein).

Das war's — alles andere hängt von der spezifischen PHP-Konfiguration und -Laufzeitumgebung ab, die weiter unten detailierter beschrieben wird (und die der Grund ist dafür, dass es nicht die definitive Antwort gibt, die auf alle Situationen passt). Aber die obigen zwei Regeln sind absolut und decken 95% der Fragen zu den Dateirechten ab.

Auf einem Unix-Host läuft der Webserver typischerweise mit einer 'userid' und 'groupid', die nicht die des Besitzers des Accounts ist. Gewöhnlich ist die 'userid' so etwas wie "nobody", "apache", "www" oder "httpd". Deshalb erzeugt der Besitzer des Accounts in einer Standardinstallation die Verzeichnisse wiki.d/ und uploads/ von Hand und setzt die Rechte der Verzeichnisse auf beschreibbar für jedermann, damit PmWiki (das unter dem Webserver-Account läuft) in der Lage ist, dort Dateien anzulegen.

$ pwd
/home/pmichaud/public_html/pmwiki
$ mkdir uploads
$ mkdir wiki.d
$ chmod 777 uploads wiki.d        
$ ls -ld . uploads wiki.d
drwxr-xr-x   12 pmichaud pmichaud     1024 Feb 10 11:51 .         
drwxrwxrwx    8 pmichaud pmichaud     1024 Jan 23 11:58 uploads             
drwxrwxrwx    2 pmichaud pmichaud    54272 Feb 10 15:29 wiki.d      

Vermeiden von für jedermann beschreibbaren Verzeichnissen

Dennoch mögen viele Leute diese Einstellung mit Schreibrechten für jedermann (******rwx) nicht. Die einzige praktikable Möglichkeit, diese Schreibrechte für jedermann zu eliminieren, ist, den Webserver und den Besitzer des Accounts zum 'owner' und zur 'group' der Verzeichnisse und der Dateien darin zu machen. Da Unix einem Nicht-Superuser eigentlich nicht erlaubt, die 'owner' von Verzeichnissen und Dateien zu ändern, die schon existieren, müssen wir sicherstellen, dass sie mit den passenden Besitzverhältnissen von Anfang an erzeugt werden.

Damit die Verzeichnisse dem Webserver-Account gehören, lassen wir PmWiki sich um das Erzeugen der Verzeichnisse kümmern. Das heißt, wir vergeben vorübergehend Schreibrechte für das Elternverzeichnis und starten dann PmWiki, so dass es die Verzeichnisse anlegt. Außerdem möchten wir, dass die neu erzeugten Verzeichnisse die gleiche Gruppe haben wie der Besitzer des Accounts, damit er Dateien dieser Verzeichnisse entfernen oder manipulieren kann. Darum benutzen wir Unix' setgid-Fähigkeiten (2777 oder '***rws***'-Rechte), damit alle neu erzeugten Dateien die Gruppenrechte vom Verzeichnis erben.

Um Verzeichnisse mit Schreibrechten für jedermann zu vermeiden, benutzen Sie die folgenden Anweisungen anstatt der obigen Beschreibung. Wenn Sie die Verzeichnisse wiki.d/ und uploads/ bereits angelegt haben, benutzen Sie 'chown' und 'chmod', um die folgenden Resultate zu erreichen.

$ pwd
/home/pmichaud/public_html/pmwiki
$ chmod 2777 .  
$ ls -ld .
drwxrwsrwx  10 pmichaud pmichaud 4096 May 28 09:55 .
# <-- execute pmwiki.php script from web browser -->
$ ls -ld . uploads wiki.d
drwxrwsrwx  10 pmichaud pmichaud 4096 May 28 09:55 .
drwxrwsr-x   2 nobody   pmichaud 4096 May 28 09:55 uploads
drwxrwsr-x   2 nobody   pmichaud 4096 May 28 09:55 wiki.d
$ chmod 755 .
drwxr-xr-x  10 pmichaud pmichaud 4096 May 28 09:55 .
drwxrwsr-x   2 nobody   pmichaud 4096 May 28 09:55 uploads
drwxrwsr-x   2 nobody   pmichaud 4096 May 28 09:55 wiki.d

Jetzt gehören die beiden Verzeichnisse 'nobody', d.h. der Webserver kann in ihnen schreiben. Wir haben keine Schreibrechte für jedermann in den Verzeichnissen und der Besitzer des Accounts (pmichaud) hat immer noch Schreibrechte vermittels der Gruppenzugehörigkeit und -rechte. Das 'setgid'-Bit sichert darüber hinaus, dass jede Datei und jedes Verzeichnis, die/das in uploads/ und wiki.d/ erzeugt wird, ebenfalls zu der Gruppe 'pmichaud' gehört.

Safe mode

ABER, wenn eine Site in PHPs "safe_mode" läuft, dann funktioniert die 'lass PmWiki sich um die Verzeichnisse kümmern'-Variante nicht, da PHP Dateien nur in Verzeichnissen jenes Benutzers erzeugt, dem auch das PHP-Skript selbst gehört. Deshalb kann PmWiki (Apache) die Verzeichnisse in diesem Fall nicht erzeugen, sonst wird safe_mode sich beklagen, sowie PmWiki eine Datei in diese Verzeichnisse zu schreiben versucht. Der einzige Weg, die Dinge im safe_mode zum Laufen zu kriegen, ist, die Verzeichnisse mit der Hand anzulegen und die Rechte auf 777 (rwxrwxrwx) zu setzen, wie es zu Beginn diese Artikels beschrieben wurde.

PHP als Besitzer des Skripts laufen lassen

Es gibt ein paar Webserver und PHP-Installationen, die so konfiguriert sind, dass ein PHP-Script mit der gleichen Identität wie der Besitzer des Skripts ausgeführt wird. Das wird oft 'suexec PHP' genannt oder sogar einfach 'suPHP'. In dem Fall, da PHP schließlich mit der Identität des Besitzers des Accounts ausgeführt wird, läuft alles einfach so 'out of the box' ohne eigenes Zutun. PmWiki erzeugt alle Verzeichnisse wie sie gebraucht werden und Rechte sind am Ende kein Thema.

Kochbuchskripten

Okay, sehen wir uns nun die Kochbuchskripten an. Wenn ein Skript Dateien enthält, die es für den Browser erreichbar zur Verfügung stellen will, sollten diese Dateien grundsätzlich irgendwo in der pub/-Hirarchie untergebracht werden und mittels '$PubDirUrl' referenziert werden.

Wenn ein Kochbuchskript Dateien auf die Platte *schreiben* muss, dann gelten für das entsprechende Verzeichnis die gleichen Regeln wie für die wiki.d- und uploads-Verzeichnisse mit den exakten Besitzverhältnissen und Rechten abhängig von der Konfiguration des Webservers und von PHP. Generell sollten die Kochbuchskripten das Gleiche tun wie PmWiki und einfach PmWikis mkdirp($dir)-Funktion aufrufen. PmWiki wird sich dann selbst um die Verzeichnisse kümmern (wenn es kann) oder zum Anlegen der Verzeichnisse auffordern, wie es erforderlich ist.

Wenn z. B. das Kochbuchrezept 'frobot' eine .css-Datei ausliefern will, dann sollte die Datei etwa nach pub/css/frobot.css oder pub/frobot/frobot.css geschrieben werden. Die Verzeichnisse und Dateien sollten in dem Fall vom Besitzer des Accounts erzeugt werden und ihm gehören, da das Kochbuchrezept keine der Dateien erzeugen oder ändern muss, wenn es aufgeführt wird.

Als alternatives Beispiel dient das Cookbook:MimeTeX-Rezept, dass in der Lage sein möchte, zwischengespeicherte Bilder für die mathematischen Formeln zu erzeugen und diese dem Webbrowser verfügbar zu machen. Deshalb nutzt MimeTex ein pub/cache/-Verzeichnis, das erzeugt werden sollte in der Art, wie auch die Verzeichnisse wiki.d/ und uploads/ erzeugt wurden (d. h. in Abhängigkeit von der PHP- und Webserver-Konfiguration). Nochmal: Cookbook:MimeTeX löst das, indem es mkdirp("pub/cache") aufruft und dieser Funktion das Erzeugen des Verzeichnisses oder die Benachrichtigung des Administrators, dass das Verzeichnis angelegt werden muss, überlässt.

Siehe auch


Übersetzung von PmWiki.FilePermissions Originalseite auf PmWikiDe.FilePermissions - Rückverweise
Zuletzt geändert:
PmWikiDe.FilePermissions am 10.07.2012
PmWiki.FilePermissions am 10.09.2011