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
- Datei-Editor deaktivieren und Installationen einschränken
- Webserver-Konfiguration für WordPress: Nginx und Apache
- Anzeichen einer kompromittierten WordPress-Site