WordPress ist das meistgenutzte und somit beliebteste Content Management System (CMS) für die Erstellung von Websites. Da ist es ähnlich wie bei Windows: Bei einem erfolgreichen Angriff ist das Potenzial und der Nutzen für den Angreifer groß. Aus diesem Grund sollten bestimmte Bereiche und Dateien abgesichert werden. In diesem Guide sollen einige wichtige Schritte beschrieben werden, damit deine WordPress Installation abgesichert ist.
Eines vorweg. Sichere dir vorher deine .htaccess Datei und mach ein Backup davon!
Wenn du Änderungen an der .htaccess Datei durchgeführt und diese hochgeladen hast, dann mach einen Refresh deines Browsers. Auf diese Weise kannst du testen, ob deine Website weiterhin funktioniert. Solltest du eine MultiSite Installation betreiben, so ist es möglich, dass nicht alle Einstellungen darauf funktionieren und greifen.
Die nachfolgenden Code Teile am besten an das Ende deiner .htaccess Datei packen.
Zugriff von außen auf die .htaccess und .htpasswd Datei verbieten
Die .htaccess Datei ist eine Steuerungsdatei, welche vor fremden Zugriffen gut geschützt werden sollte. Mit dem folgenden Codeschnipsel wird der Zugriff von außen auf diese Datei geblockt. Dies gilt auch für die .htpasswd, welche als Passwortdatei für den Zugriff auf den Adminbereich fungiert.#Zugriff auf .htaccess und .htpasswd verbieten, falls diese verwendet werden
<FilesMatch "(\.htaccess|\.htpasswd)">
Order deny,allow
Deny from all
</FilesMatch>
Zugriff auf include-ordner verbieten
Auf bestimmte Dateien und Bereiche sollte nur von WordPress oder dir als FTP-User zugegriffen werden können und niemals von außen. Denn sonst könnte der Angreifer einiges damit anstellen und dir und deiner Seite nur schaden, indem er z. B. Schadcode implementiert. Das wollen wir nicht. Deshalb kannst du den unten stehenden Code eintragen, sodass der Zugriff auf include Dateien unterbunden wird.# Den Zugriff auf den Include-Ordner verbieten
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
Hinweis: Bei MultiSite Installationen wird der Code vermutlich nicht funktionieren.
Bild-Hotlinking unterbinden
Bild-Hotlinking ist, wenn andere Personen die Bilder von deiner Seite nicht herunterladen, sondern diese einfach bei sich so einbinden, dass diese von deinem Server aus geladen werden. Das kann unter Umständen die Ladezeit deiner Seite verlangsamen, weil der Server stärker beansprucht wird. Damit das eben nicht passiert, sollte folgender Code integriert werden. Für "deinedomain" bitte die Domain deiner Website eintragen.<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)? deinedomain.com(/.*)?$ [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F]
</IfModule>
Noch ein kleiner Hinweis: Wenn du z. B. Feedburner oder einen anderen externen Feedanbieter benutzt, kann es sein, dass in dem Feed keine Bilder zu sehen sind.
Browser Caching aktivieren
Die Ladezeit einer Website ist sehr wichtig, denn niemand wartet gerne länger, als er das tatsächlich muss. Daher ist eigentlich jeder bemüht, seine Website möglichst schnell zu machen. Mit nur einigen Handgriffen kann schon sehr viel erreicht werden. Der untenstehende Code führt dazu, dass die Dateien im Browser gecached werden. Statische Dateien, welche sich nur selten ändern - wie CSS oder JavaScript Dateien oder bestimmte Bilder -können ruhig länger gecached werden. So werden sie nur beim ersten Besuch heruntergeladen und sind dann so lange in dem Cache des Browsers, bis der User seinen Cache leert oder eben die Zeit des Cachings verstrichen ist.EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##
Für die PageSpeed Analyse gibt es ausreichend SEO Tools, sodass du siehst, wie schnell deine Seite lädt und wo es eben hakt. Eines davon ist z. B. gtmetrix.
Mehr Informationen bezüglich. WordPress Ladezeit Tuning gibt es hier: "WordPress PageSpeed Optimierung".
XML-RPC Schnittstelle abschalten
Wenn du deine Website nicht mit externen Programmen verwaltest und somit also keine neuen Artikel darüber veröffentlichst oder Kommentare bearbeitest, dann wirst du die XML-RPC Schnittstelle nicht benötigen. Deshalb kannst du sie auch abschalten. Auch schon deshalb, weil sie gerne mal für DDoS Attacken verwendet wird, um deine Website lahm zu legen. Folgender Code schafft erst einmal Abhilfe und schaltet die XML-RPC Schnittstelle ab:# XML-RPC Schnittstelle komplett abschalten
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Der oben aufgeführte Code ist also dazu da, dass die XML-RPC Schnittstelle komplett abgeschaltet wird. Damit sind auch keine Trackbacks möglich. Solltest du Trackbacks und die Verwaltung von Kommentaren etc. über eine externe Software machen, wie z. B. WordPress-Blogs, Poster, Windows Live Writer oder WordPress for iOS bzw. WordPress for Android, dann kannst du den folgenden Code anstatt des obigen verwenden:
Damit kannst du mit den oben aufgeführten Diensten deine Seite weiterhin bearbeiten.
<IfModule mod_setenvif.c>
<Files xmlrpc.php>BrowserMatch "Poster" allowed
BrowserMatch "WordPress" allowed
BrowserMatch "Windows Live Writer" allowed
BrowserMatch "wp-iphone" allowed
BrowserMatch "wp-android" allowed
Order Deny,Allow
Deny from All
Allow from env=allowed
</Files>
</IfModule>
Folgender zusätzlicher Tipp: Lass nur die Zeile drin oder füge diese hinzu, welche den Zugriff mit deinem verwendeten Programm zulässt, alle anderen sollten rausgeschmissen werden.
Weitere Sicherheitseinstellungen
Die oben genannten Tipps und Codeteile waren schon ganz hilfreich und haben das eine oder andere bereits absichern können. Aber es gibt noch einige weitere Sicherheitseinstellungen, welche in den weiteren Kapiteln aufgeführt sind.PHP-Fehlermeldungen unterdrücken
PHP Fehlermeldungen sind für den Besucher oft nichtssagend. Für einen Angreifer können diese Informationen allerdings wichtig sein, um die Schwachstellen aufzufinden und auszunutzen. Mit einem kleinen Eintrag in der .htaccess Datei werden diese abgeschaltet:php_flag display_errors Off
Zugriff auf wichtige WordPress Dateien unterbinden
WordPress hat noch einige weitere wichtige Dateien neben der .htaccess und .htpasswd Datei. Mit den weiteren unten aufgeführten Codezeilen wird deine Website vor Hackern geschützt, die URL Exploits ausnutzen möchten. Außerdem soll die Datei mit den Einstellungen zur Datenbank und dem Passwort etc. sowie die ReadMe Dateien geschützt werden.# ----------------------------------------------------------
# Zugriff auf wichtige WordPress Dateien unterbinden
# ----------------------------------------------------------
# Zugriff auf die install.php verbieten
<files install.php>
Order allow,deny
Deny from all
</files>
# Zugriff auf die wp-config.php verbieten
<files wp-config.php>
Order allow,deny
Deny from all
</files>
# Zugriff auf die readme.html verbieten
<files readme.html>
Order Allow,Deny
Deny from all
Satisfy all
</Files>
#liesmich.html für deutsche Version absichern
<Files liesmich.html>
Order Allow,Deny
Deny from all
Satisfy all
</Files>
# Zugriff auf das Error-Log verbieten
<files error_log>
Order allow,deny
Deny from all
</files>
#URL based exploits nicht zulassen
RedirectMatch 403 \[
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#doppelte slashes in allen URLs verbieten
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^/\ ]+/)*)/+([^\ ]*)
RewriteRule ^ /%1%3 [L,R=301]
</IfModule>