Zum Hauptinhalt springen

Korrekte Dateiberechtigungen begrenzen, was kompromittierter Code auf dem Server anrichten kann. Falsche Dateirechte sind ein Klassiker: Mit 777 kann jeder Prozess auf dem Server Dateien verändern. Zu enge Rechte wiederum brechen Updates und Uploads. Das Ziel: Der Webserver darf nur dort schreiben, wo es nötig ist.

Grundwerte

Objekt Rechte
Verzeichnisse 755 (oder 750)
Dateien 644 (oder 640)
wp-config.php 400 oder 440 (ggf. 600/640, wenn der Hoster es verlangt)
.htaccess 644, bei manueller Pflege 444
wp-content/uploads beschreibbar für den PHP-Benutzer
find /var/www/example -type d -exec chmod 755 {} +
find /var/www/example -type f -exec chmod 644 {} +
chmod 440 /var/www/example/wp-config.php

Eigentümer-Modelle

Modell A: Ein Benutzer für alles (typisch bei Shared und Managed Hosting): Dateien gehören dem Site-Benutzer, PHP läuft als derselbe Benutzer. Praktisch, weil Updates im Backend funktionieren, aber jeder PHP-Code kann alle Dateien ändern, auch Malware.

Modell B: Getrennte Benutzer (gehärtet): Dateien gehören einem Deploy-Benutzer, PHP läuft als anderer Benutzer mit nur Leserechten, Schreibrechte nur für uploads/ und ggf. Cache-Verzeichnisse.

chown -R deploy:www-data /var/www/example
find /var/www/example -type d -exec chmod 750 {} +
find /var/www/example -type f -exec chmod 640 {} +
chown -R www-data:www-data /var/www/example/wp-content/uploads

In Modell B müssen Updates per WP-CLI (als Deploy-Benutzer) oder per Git/Composer erfolgen, und in der wp-config.php sollte DISALLOW_FILE_MODS gesetzt werden. Malware, die über eine Plugin-Lücke ausgeführt wird, kann dann keine PHP-Dateien mehr manipulieren, ein enormer Gewinn.

PHP-Ausführung in Uploads verhindern

Da uploads/ beschreibbar sein muss, darf dort keinesfalls PHP ausgeführt werden. Konfiguration siehe Webserver-Konfiguration für WordPress.

FS_METHOD

Wenn WordPress beim Update nach FTP-Zugangsdaten fragt, passen Eigentümer und PHP-Benutzer nicht zusammen. define( 'FS_METHOD', 'direct' ); erzwingt direkten Dateizugriff, löst aber das Rechteproblem nicht, wenn PHP keine Schreibrechte hat. Die bewusste Entscheidung für Modell A oder B ist wichtiger als die Konstante.

Prüfen

# Welt-beschreibbare Dateien finden
find /var/www/example -perm -o+w -not -type l
# PHP-Dateien in Uploads finden (sollte leer sein)
find /var/www/example/wp-content/uploads -name '*.php'

Weiterführende Artikel

Quellen und Dokumentation