Die meistverbreitete FEHLKONFIGURATION von WordPress wird normalerweise vorgenommen, um Updates von WordPress oder Plugins automatisch vornehmen zu können. Hierzu muss der Webserver Schreibrechte auf einige Verzeichnisse unter dem Ordner wp-content erhalten. Sollte nun eine Schwachstelle in WordPress oder im Webserver gefunden werden, durch die man als unbefugter Angreifer Dateien in ein Verzeichnis schreiben kann (gab es bereits mehrfach), kann so die Kontrolle über die gesamte WordPress Installation übernommen werden. Damit hätte der Angreifer die Möglichkeit z.B. Spam oder Urheberrechtlich geschütztes Material über die Domain zu verbreiten. Wo wird sich dann wohl die Staatsanwaltschaft melden?

Schritt 1: absichern der Dateistruktur

Berechtigungen für Verzeichnisse setzen

find /pfad/zur/installation/ -type d -exec chmod 755 {} \;

Berechtigungen für Dateien setzen

find /pfad/zur/installation/ -type f -exec chmod 644 {} \;

Verzeichnissen und Dateien Besitzer und Gruppe zuweisen

chown -R benutzer:www-data /pfad/zur/installation/
chown -R www-data:www-data /pfad/zur/installation/wp-content/uploads/

Damit sind die Berechtigungen so gesetzt, dass der Besitzer der Verzeichnisse und der Dateien schreiben darf, die Gruppe und alle anderen aber nur lesend zugreifen können. Der Besitzer sollte in diesem Fall nicht der Webserver sein, sondern ein normaler Benutzer. Zum Beispiel der Benutzer, der auch per (S)FTP die Dateien hoch lädt. In meinem Fall wird der Webserver mit dem Benutzer www-data ausgeführt, der auch der Gruppe www-data angehört. Das ist bei vielen Installationen Standard.

Eine Besonderheit bildet hier das Unterverzeichnis wp-content/uploads. In dieses Verzeichnis muss vom Webserver geschrieben werden können, damit man Bilder für Artikel usw. hoch laden kann. Man muss nun sicher stellen, dass in diesem Verzeichnis und in den Unterverzeichnissen durch den Webserver keine Scriptdateien ausgeführt werden können. Darum kümmern wir uns im nächsten Abschnitt.

Schritt 2: absichern des Uploads-Verzeichnises

Ich gehe davon aus, dass der Apache Webserver zur Anwendung kommt. Für andere Webserver gilt diese Konfiguration nicht. Nutzt dann bitte analog die Konfigurationsoptionen eures Webservers.

Wir editieren nun die Konfigurationsdatei, die für die Auslieferung unserer WordPress Seite verantwortlich ist.

vi /etc/apache2/sites-available/eure-konfigurationsdatei

Es wird hier wahrscheinlich schon einen Abschnitt </Directory> geben. Findet den abschließenden Tag </Directory>. Fügt darunter folgendes ein:

<Directory /var/www/blog/wp-content/uploads>
    # Uploads von .htaccess Dateien ignorieren. Wichtig!
    AllowOverride None

    SetHandler none
    SetHandler default-handler

    Options -ExecCGI
    php_flag engine off
    RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
    <Files *>
            AllowOverride None

            SetHandler none
            SetHandler default-handler

            Options -ExecCGI
            php_flag engine off
            RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
    </Files>
</Directory>