Dateirechte: warum eigentlich?

Regelmäßig findet man zum Thema Wordpress Sicherheit Tips zu Dateirechten. Aber was hat es eigentlich damit auf sich? Was ist dieses chmod 664 und 775? Dieser Post soll dies aufklären. Zielgruppe sind hierbei Wordpress-Admins, die ein wenig Erfahrung mit Wordpress haben, schon einmal ein Wordpress-Security-Tutorial gelesen haben, jedoch noch nie etwas mit Linux-Dateirechten zu tun hatten.

Achtung! Korrekt gesetzte Dateirechte verhindern das Auto-Update. Zudem benötigt man die FTP-Daten bei einem Update. Dateirechte richten sich also nur an Admins, die sich auch wirklich um ihre Installation kümmern, z.B. im Unternehmen oder bei wichtigen privaten Blogs - denn Updates selbst einspielen ist dann Pflichtprogramm!

[UPDATE]Wie man Dateirechte je nach Hoster einstellt findet Ihr in einem weiteren Artikel.[/UPDATE]

Wordpress im Normalbetrieb

Um zu verstehen warum Dateirechte so wichtig sind, muss man verstehen, wie ein Aufruf einer Wordpress-Seite eigentlich funktioniert.

Aufruf einer Wordpress-Seite.

Aufruf einer Wordpress-Seite.

Das Grundprinzip ist wie folgt: Der Nutzer ruft den Webserver mit PHP auf, PHP liest die index.php, dort steht drin, was PHP noch alles lesen und verarbeiten soll. PHP-Dateien werden (normalerweise) ausschließlich gelesen, in die Datenbank schreibt man auch öfter mal etwas - z.B. einen Kommentar. Wenn PHP alles abgearbeitet hat sendet es die fertig generierte Website an den Nutzer zurück.

Aufruf der Wordpress-Adminoberfläche.

Aufruf der Wordpress-Adminoberfläche.

Genauso funktioniert auch der Adminbereich. Der Nutzer ruft PHP auf, dieses liest die index.php in wp-admin und danach viele weitere Daten. Geschrieben werden dabei außerhalb des Upload-Ordners keinerlei Dateien. Und im Upload-Ordner sind keine PHP-Dateien, sondern Bilder, PDFs und all das andere, was wir in unser Blog einbinden wollen. Wir lernen also: PHP-Dateien braucht man nicht schreiben können. Es reicht, sie lesen zu können. Mit einer Ausnahme: dem Update-Vorgang.

Update von Wordpress ohne Dateirechte

Update von Wordpress ohne Dateirechte

Das Update von Themes, Plugins und Core (also dem Wordpress Hauptsystem) erfordert Schreibrechte. Klar - die alte Version des Themes / Plugins / Cores soll ja gegen die neue ausgetauscht werden, d.h. die neue Datei muss geschrieben werden.

Angriff auf Wordpress: Missbrauch der Schreibrechte

Solange es keine Angreifer gibt, ist die Lösung oben perfekt weil absolut simpel und direkt. Das Problem ist - ein Angreifer kann dies für seine Zwecke missbrauchen.

Angriff auf eine Wordpress-Seite ohne Dateirechte.

Angriff auf eine Wordpress-Seite ohne Dateirechte.

Für PHP besteht zunächst kein Unterschied, ob der Nutzer eingeloggt ist oder nicht. PHP führt die PHP-Datei, die man aufruft, aus. Wenn diese eine Sicherheitslücke hat, mit der man Dateien auf den Server schreiben kann, tut PHP das. Dagegen kann PHP nichts machen. PHP weiß nichts davon, dass das ein böser Angreifer ist - woher auch? Dass der Angreifer keine Rechte dazu hat - das sagt die PHP-Datei. Und die PHP-Datei hat nun einmal eine Sicherheitslücke, so dass die PHP-Datei keine Hilfe mehr ist.

Die Lösung: Keine Schreibrechte auf PHP-Dateien

Derartige Sicherheitslücken kommen insbesondere in Plugins und Themes häufiger vor und sind zum Teil wirklich schwer zu sehen. Man wird also immer das Restrisiko haben, eine PHP-Datei mit einer solchen Sicherheitslücke irgendwo in seinem Wordpress zu haben. Also muss ein anderer Sicherheitsmechaniusmus her: Dateirechte. Dazu betrachten wir den einzigen Vorgang, wo Schreibrechte auf Dateien benötigt werden, noch einmal: das Update.

Update von Wordpress mit Dateirechten.

Update von Wordpress mit Dateirechten.

Den Dialog habt ihr sicherlich schon irgendwann einmal gesehen - Wordpress fragt dann beim Update die FTP-Zugangsdaten ab. Und vielleicht werden sich einige gefragt haben, warum sie diese dämlichen Zugangsdaten da eingeben müssen jedes mal. Das sei doch voll umständlich. Dazu zunächst die nächste Grafik, welche zeigt, was mit unserem Angreifer passiert, welcher auf ein Wordpress mit eingerichteten Dateirechten stößt:

Angriff auf eine Wordpress-Seite mit Dateirechten

Angriff auf eine Wordpress-Seite mit Dateirechten 1.

Die Sicherheitslücke ist noch da, aber dem Angreifer fehlen die Schreibrechte, um diese zu nutzen. Der einzige Weg, Schreibrechte zu erhalten, geht bei Nutzung von Dateirechten über den FTP-Server. Wenn der Angreifer das versucht passiert das folgende.

Angriff auf eine Wordpress-Seite mit Dateirechten über FTP.

Angriff auf eine Wordpress-Seite mit Dateirechten über FTP.

Der Angreifer hat keine Chance mehr, seinen Wordress-Virus zu plazieren. Ihm fehlen einfach Informationen, und er hat keine Chance, diese Informationen zu bekommen: er braucht die FTP-Zugangsdaten, um Dateien schreiben zu können. Diese Zugangsdaten sind aber nirgends auf der Wordpress-Installation - denn der Admin gibt sie zum Zeitpunkt des Updates einfach im Browser ein, das Update läuft dann über den FTP-Server. Nach dem Update werden die Zugangsdaten gelöscht, der Angreifer schaut in die Röhre.

Wie bekommt man Schreibschutz für PHP-Dateien?

Nun müsstest Du verstanden haben, warum man einen Schreibschutz will. Aber wie erreicht man das? Hier kommen diese chmod 775, 664 und Co ins Spiel. Chmod ist eigentlich ein Kommoandozeilen-Befehl. Wirklich wichtig sind die drei Zahlen, welche dann immer mitgeliefert werden. Was bedeuten diese? Ein ganz kurzer Ausflug in Unix / Linux Dateirechte wird nötig.

Dateirechte Ziffern.

Dateirechte Ziffern.

Nun wissen wir, welche Position was bedeutet. Ausserdem müssen wir wissen, was der Unterschied zwischen einer 4, einer 5 und einer 7 ist.

ZifferDateienOrdner
0keine Rechtekeine Rechte
1ausführenInhalt auflisten
2schreibenschreiben
3schreiben, ausführenschreiben, Inhalt auflisten
4lesenlesen
5lesen, ausführenlesen, Inhalt auflisten
6lesen, schreibenlesen, schreiben
7lesen, schreiben, ausführenlesen, schreiben, Inhalt auflisten
Wie Du siehst, haben die Zahlen bei Dateien und Ordnern unterschiedliche Bedeutungen. Relevant für Wordpress sind bei Dateien 4 und 6 (lesen bzw. lesen und schreiben), bei Ordnern 5 und 7 (lesen und Inhalt auflisten bzw. lesen, schreiben und Inhalt auflisten). So wichtig, wie das Auflisten von dem Inhalt eines Ordners ist, so wichtig ist es auch, den Dateien nicht das Recht zum Ausführen zu geben, denn ausführbare Dateien sind ein potentielles Sicherheitsrisiko.

Wie funktionieren Dateirechte?

Um letztlich zu verstehen, warum Dateirechte funktionieren, müssen wir noch verstehen, dass jede Datei auch einen Besitzer und eine Gruppe hat. Oftmals ist der Besitzer der FTP-Nutzer und die Gruppe der PHP-Nutzer.

Dateirechte Auswirkungen.

Dateirechte Auswirkungen.

Chmod 644 bedeutet also, dass die Datei vom Besitzer = FTP geschrieben werden darf (6!), von der Gruppe = PHP aber nur gelesen werden darf (4!). Ein potentieller Angreifer wird nur via PHP kommen können (siehe oben), also hat er keine Chance, eine Datei zu schreiben. Bei Ordnern wollen wir zusätzlich den Inhalt lesen können. Also 755 für einen Ordner. Auf einige wenige Stellen will der Nutzer natürlich trotzdem schreiben können. Dort setzt er dann eine Datei 664, das bedeutet, dass die Datei vom Besitzer = FTP geschrieben werden darf (6!) ebenso wie von der Gruppe = PHP (6!). Bei Ordnern analog 775.

Wo braucht Wordpress Schreibrechte?

Der Normalzustand für fast alle Dateien sollten keine Schreibrechte für PHP sein, also bei den meisten Hostern 644 für Dateien bzw. 755 für Ordner. An einige Orte muss der Nutzer aber trotzdem schreiben. In folgenden Ordnern bräuchte man also 664 für Dateien und 775 für Ordner:

  • /wp-content/uploads/
  • /wp-content/cache/ (bei Verwendung eines Caching-Plugins)
  • /wp-content/blogs.dir/ (bei Verwendung von älterem Wordpress Multisite)
  • ...

Einige Themes / Plugins benötigen noch weitere Ordner mit Schreibrechten. Aber Achtung: einige Themes oder Plugins wollen überall 664 / 775 oder gar 666 / 777. Wenn Das Voraussetzung für die Funktion des Themes / Plugins ist, ist das Theme / Plugin schlecht programmiert - ich rate sehr vom Einsatz ab!

Testen der Dateirechte-Einstellungen

Wie teste ich nun, ob alle Dateirechte stimmen? Ganz einfach - mit einem kleinen PHP Script, das du hier downloaden kannst. Das entzippst Du und lädst die chmod-test.php in das Basisverzeichnis deines WordPress, also dort, wo auch die wp-config.php liegt. Dann rufst du http://deine-wordpress-adresse.de/chmod-test.php auf - bei mir wäre das https://sectio-aurea.org/chmod-test.php. Das Script gibt dir dann Informationen, wie bei Dir die Dateirechte gesetzt sind und wo du etwas ändern kannst.

Disclaimer

Selbstverständlich helfen Dateirechte nicht gegen alle Angriffsarten. Gegen Angriffe auf die Datenbank sind sie ebenso machtlos wie gegen Kapern von FTP-Zugangsdaten. Aber viele Angriffe auf Wordpress gehen auf Dateien, sei es über Sicherheitslücken in Themes oder Plugins, sei es durch das Kapern eines Logins und dem Nutzen der Datei-Schreibfunktionen im Adminbereich. All diese dateibezogenen Angriffe hindert man mit Dateirechten. Die kann auch von keinem Sicherheitsplugin erledigt werden, ein Sicherheitsplugin arbeitet letztlich auch nur mit Rechten von PHP - und je mehr Rechte das Sicherheitsplugin bekommt, desto mehr Rechte hat dann auch der Angreifer.

Außerdem freue ich mich über konstruktive Kritik. Ich habe oft einen allzu technisch-professionellen Blick auf derartige Themen, so dass ich mich über Fragen und Verbesserungsvorschläge freue.

Als vorletzten Satz noch etwas an Menschen, die in Linux und Serverumgebungen zu Hause sind: ja, ich habe in dem Tutorial einige Dinge etwas verkürzt dargestellt und z.B. den Webserver komplett weggelassen. Aber das Tutorial ist so schon lang genug, und so habe ich all das weggelassen, was nicht unbedingt für das Verständnis nötig ist. Für technischere Artikel klickt einfach weiter, die habe ich auch im "Angebot".

Und zu allerletzt möchte ich mich bei der Open Icon Library und seinen Autoren für die tollen CC-0 Icons bedanken.