WordPress absichern – WP Security & Backup, DSGVO sowie einiges zu Themes und Plugins
Ich bin kein WordPress-Freak, kein Web-Developer – jedoch genug IT-Experte um das Sicherheits 1*1 verstehen. Der nachfolgende Text ist also von einem ‘normalen’ WP-Admin & Blogger für genau so welche die es werden wollen gedacht. Es geht nachfolgend:
- um Grundsätzliches
- Admin & Authorenrollen zu trennen
- Aus meiner Sicht minimal sinnvolle Plugins
- Sicherheit: All in One WP Security
- Backup: Updraft Plus
- Weitere sinnvolle Plugins?
- Tips zur wp-config.php
- DSGVO – Allgemeines und sinnvolle WP-Plugins
Update: Nun auch noch was in Bezug auf Plugins & Co. für die DSGVO hinzugefügt…
Inhaltsverzeichnis für den Schnellzugriff
Grundsätzliches zur Sicherheit in WP
Die weite Verbreitung, viele Plugins & Themes nachen WordPress (WP) für viele Anwender (und Hacker) interessant – jedoch stellt jedes Plugin (und die eventuell enthaltenen Fehler und Hintertüren) ein Sicherheitsrisiko dar – genau wie ggf. nachlässig programmierte oder gewartete Themes. Wer meinen kürzlich erschienenen Blogpost zu Firefox gelesen hat wird sich erinnern – denn da gilt gleiches.
Ein weiterer Punkt beim Betrieb einer WP-Installation sind die verwendete Version von PHP, dem WebServer, der Datenbank und dem unterliegenden Betriebssystem – auch hier müssen (neben einer aktuellen WP-Version) immer die neusten Bugfixes eingespielt werden. Am besten überlässt man das einem Web-Hoster, der automatisch dafür sorgt. So ist dieses Blog z.B. mit einem einfachen PowerWeb Paket bei Strato gehostet – das klappt ab 4€/Monat inkl. einer Domain und HTTPS Zertifikat -> das letztere ist sehr wichtig, damit die Login-Daten richtig verschlüsselt werden!
Zusammenfassend:
- So wenig Plugins wie möglich installieren.
- Diese sollten dann auch (vom Anbieter) regelmäßig gepflegt werden und
- eine große Installationsbasis haben.
- Nicht verwendete Plugins löschen.
- Das verwendete Theme sollte kein Exot und auch aktuell sein.
- Nur das genutzte Theme installiert lassen.
- WP immer aktuell halten.
- Ganz wichtig: Auch die Plugins (weiter unten mehr dazu).
- Denn sofort dach dem veröffentlichen einer neuen Version ist allen (bösen Buben) klar, wie sie die Fehler ggf. ausnutzen können!
- Am besten ein WP-Hostingpaket nutzen
- So das man sich nicht um die Updates von MySQL, Server und PHP kümmern muss.
- Unbedingt SSL (‘https’) aktivieren!
Vorab: Administrator- und Autorenrollen trennen!
Wenn WP installiert wird braucht es einen Administrator. Dieser sollte auf keinen Fall ‘admin’, ‘wordpress’, ‘administrator’ o.ä. benannt werden. Denn dies sind die Standard-Login Namen mit denen versucht wird Passwort-Attacken zu machen (ja, das ist wirklich ein Problem!).
Ganz wichtig: Weil der Name des Autors eines Blogposts in der URL steht sollte mit dem richtigen ‘Admin’-Account auch nie ein Blogpost verfasst werden. Der Admin-Account sollte nur für die Wartung, zum Einrichten von Benutzern, der Installation von Plugins, etc. dienen. Nur mit einem zweiten Account der (nur) die Rechte eines ‘Autors’ hat – sollten dann Blogposts verfasst werden.
All in One WP Security – Cooles Plugin mit Top Funktionen
Ein meiner Ansicht nach sehr gutes Sicherheits-Plugin ist WP Security mit (zu Recht) ca. 3,2 Millionen Downloads. Dieses Plugin bietet u.a. folgende Funktionen an:
- Einfacher Login-Schutz (‘Login-Logdown’ unter User-Login)
- Bei mehrfacher Passwort-Fehleingabe (z.B. 3) wird eine IP-Adresse x Minuten für weitere Versuche gesperrt.
- Dieses verhindert ‘Brute-Force’ Passwort-Attacken auf User-Logins.
- Top: Cookie-Basierender Login-Schutz (‘Cookie Based Brute Force Prevention’ unter Brute Force)
- Normal kann sich ein Nutzer unter der Adresse https://blogname.domain/wp-login.php einloggen – das nutzen auch die Angreifer aus.
- Mit diesem Schutz kann man nun eine eigene URL festlegen (z.B. https://blogname.domain/?blahblubber=1). Unter dieser URL wird dann ein Session-Cookie im Browser abgelegt – und nur wenn dieses vorhanden ist, kann auf die normale wp-login.php zugegriffen werden.
Werden diese beiden Funktionen kombiniert – u.a. für Blogs mit nur einem bzw. sehr wenigen Autoren – dann sollten faktisch alle Passwort-Attacken ins leere laufen.
Weitere Wichtige Funktionen beziehen sich auf die Zugriff im Datensystem und auf dem Web-Server. In diesem Kontext fand ich folgende Funktuionen (unter ‘Filesystem Security’) sehr wichtig:
- Datei-Berechtigungen (‘File Permissions’)
- Stattet Datei- und Verzeichnisse auf dem Server mit möglichst restriktiven Rechten aus.
- Zugriff auf Standard-Dateien (‘WP File access’)
- Verhindert Zugriff auf einige Standard-Dateien von WP-Installationen (über die ggf,. einige Details wie Versionsinformationen zu erfahren sind).
Diese Einstellungen empfinde ich als sehr wichtig – weil es sein kann, das verschiedene Plugins die Dateirechte ggf. in einen unsicheren Zustand modifizieren. Mit WP-Security lässt sich hier sehr einfach prüfen ob soweit noch alles o.k. ist.
Im nächsten Schritt bietet WP-Security dann unter ‘Firewall’ noch weitere wichtige Möglichkeiten einen Missbrauch des Blogs zu vermeiden:
- Basic Firewall Settings
- Schützt die .htaccess und wp-config Datei (Sicherheitsrelevante Einstellungen)
- Begrenzt Uploads auf 10 MB, etc.
- Deaktivierung der XML-RPC Schnittstelle und Zugriff auf das Debug-Logfile
- Gerade die XML-RPC Schnittstelle halte ich für eine große potentielle Angriffslücke. Ein einfaches Blog wird diese Schnittstelle denn auch nicht benötigen.
- Zugriff auf Verzeichnisse und andere Angriffe (XSS, Proxy, Track & Trace)
- können dann unter ‘Aditional Firewall Rules’ aktiviert werden
- 404 Erkennung und Lockout
- Viele Angreifer versuchen mit dem Zugriff auf bestimmte (geratenen) URLs zu prüfen ob bestimmte (verwundbare) Plugins installiert sind.
- Mit dieser Einstellung werden potentielle Angreifer-IP Adressen (temporär) gesperrt – wenn diese mehr als 3 Seiten aufrufen (wollen) die es gar nicht gibt.
- Prevent Hotlinks
- Wer nicht mag das Bilder von der eigenen Seite irgendwo direkt verlinkt bzw. eingebettet werden (kostet Server-Ressourcen) – der aktiviert diese Option.
Um den anonymen Zugriff auf Nutzerdaten zu verhindern, sollte dann auch noch unter ‘Miscellaneous’ (Verschiedenes) der Zugriff auf die ‘Users Enumeration’ beschränkt werden.
Eine letzte wichtige Einstellung wäre dann noch den Datenbank-Prefix (‘wp_’) von WordPress zu ändern. Dies verhindert, das bestimmte Attacken (u.a. SQL-Injection) gegen WP durchgeführt werden können. WP-Security bietet auch hier eine automatische Funktion um dies durchführen zu können (unter ‘Database Security’). Für diese Änderung ist es jedoch sinnvoll die gesamte WP-Installation vorab zu sichern – falls etwas schief gehen sollte. Natürlich sollte man auch in der Lage sein die Sicherung wieder zurück zu spielen 🙂
Backup der WP-Installation (mit Datenbank, & Co.)
Ganz wichtig: Immer schön Backups machen! Im Falle das die eigenen WP-Seite doch gehackt wird, der Provider die Daten verliert, die Datenbank einen Fehler hat, ein WP- oder Plugin Update danebengeht, etc. pp.
Bei meinem Provider Strato gibt es je nach Paket eine manuelle oder automatische Option die gesamte WP-Installation zu backuppen – und aus einem Backup wieder her zu stellen. Zusätzlich können sich hier jedoch auch Plugins wie UpdraftPlus anbieten. In Updraft Plus kann man angeben wie oft man die Sicherung ausführen möchte, wie viele Sicherungen aufgehoben werden sollen – und wo man die Sicherungen ggf. speichern möchte (lokaler Server, externer Web-Space, DropBox, etc. pp). Wer nur lokal sichert muss jedoch die Backups ab und zu noch lokal auf seinem Rechner (oder anderweitig) sichern – also mit SSH (z.B. WinSCP) auf dem Server einloggen un die Dateien dann manuell kopieren (die Dateien liegen dann unter /wp-verzeichnis/wp-content/updraft).
Wichtig beim Backuppen ist auch – (irgendwann) rauszufinden bzw. zu lesen wie man eine Sicherung wieder zurückspielt und hier insbesondere die Datenbank wieder herstellt. Meistens stellen dafür die Provider (z.B. Strato) verschiedene Tools bereit – in denen man nur ‘Backup’ oder ‘Wiederherstellung’ clicken muss. Möchte man hingegen Backups von Updraft wiederherstellen, dann braucht man nur den Button ‘Wiederherstellen’ zu wählen und muss das zu wiederherstellende Backup wählen. Letzteres funktioniert natürlich nur, wenn die WP-Installation noch läuft -> ansonsten braucht man Zugriff auf die Datenbank (z.B. per Web-Oberfläche) und Zugriff auf die Installationsverzeichnisse des WebServers (z.B. via SCP bzw. FTP) um die Dateien ‘per Hand’ zurückzuspielen.
Weitere sinnvolle Plugins?
Hier noch eine kurze Auflistung weiterer sinnvoller Plugins für übliche Aufgaben und Probleme.
- Autoptimize
- Autoptimize beschleunigt die Website durch Optimierung von JS, CSS, Bildern (inkl. Lazy-Load), HTML und Google Fonts, Asynchronisierung von JS, Entfernen von Emoji-Cruft und mehr.
- H.C.: Sinnvoll – niemals Probleme damit gehabt, funktioniert einfach.
- Easy Table of Contents
- Fügt eine benutzerfreundliche Möglichkeit hinzu, aus dem Seiteninhalt automatisch ein Inhaltsverzeichnis zu erstellen und anzuzeigen.
- H.C.: Mega! Faktisch ohne Konfiguration sinnvolle Inhaltsverzeichnisse.
- Newsletter
- Newsletter ist ein cooles Plugin um damit eine eigene Abonnentenliste zu erstellen und Newsletter zu versenden.
- H.C.: Funktioniert.
- WP Statistics
- Dieses Plugin liefert komplette Informationen über die Abrufe der einzelnen Seiten, Suchbegriffe & Co. – ohne Cookies!
- H.C.: Ich habe viele Statistik-Plugins ausprobiert – dieses ist das einzige was gescheit funktioniert!
- WP-Optimize – Clean, Compress, Cache
- WP-Optimize macht die WP-Installation schnell und effizient. Es bereinigt die Datenbank, komprimiert Bilder und macht Seiten-Caching. Schnelle Websiten ziehen mehr Verkehr und Nutzer an.
- WP-Sweep (Alternative zu WP-Optimize)
- WP-Sweep ermöglicht es unbenutzte, verwaiste und doppelte Daten in WordPress zu bereinigen. Es bereinigt Revisionen, automatische Entwürfe, nicht genehmigte Kommentare, Spam-Kommentare, Kommentare im Papierkorb, verwaiste Beitrags-Metadaten, verwaiste Kommentar-Metadaten, verwaiste Benutzer-Metadaten, verwaiste Begriffsbezugsdaten, unbenutzte Begriffe, doppelte Beitrags-Metadaten, doppelte Kommentar-Metadaten, doppelte Benutzer-Metadaten und transiente Optionen. Es optimiert auch Datenbanktabellen.
Die letzten beiden Plugins sind wichtig, weil damit die Datenbank bereinigt und verkleinert werden kann. Das Hilft der Geschwindigkeit und ermöglicht es auch, z.B. bei Strato, die Datenbank noch ex- und importieren zu können, da phpMyAdmin die Größe der Datenbank-Export-Datei auf 64 MB begrenzt.
Das Neuanlegen bzw. wechseln von Datenbanken und der dazu nötige Ex/Import ist aus meiner Sicht bei Strato nötig, da ab und zu die MySQL-Datenbanken “langsam werden”. Warum auch immer. Mir hilft es dann im Admin-Bereich bei Strato eine neue MySQL-Datenbank anzulegen, die aktuelle WP-datenbank mit phpMyAdmin in ein ZIP-File zu exportieren und in die neue Datenbank zu importieren. Danach muss nur noch in der wp-config.php Namen & Co. für die Datenbank geändert werden. Ein zusätzlicher Vorteil ist, das alte Daten wirklich weg sind und die Datenbankgröße deutlichst schrumpft – speziell wenn vorab mit WP-Sweep unnötige Daten gelöscht werden.
Einige weitere Tips zur wp-config.php
In der wp-config.php sind noch einige wichtige Einstellungen vornehmbar. Diese Datei liegt in der WordPress Installation auf dem WebServer und kann z.B. mit WinScp (SSH/SCP-Client) modifiziert werden, wenn direkt auf die Installation auf dem Server zugegriffen wird. Alternativ kann auch mit dem WP- Security Plugin unter ‘Settings/wp-config.php File’ die Datei auf den PC geladen, dann geändert – und wieder zurückgespielt werden.
In der Datei können u.a. vier Dinge geändert werden. Zuerst gibt es dort einen Ausschnitt der so aussieht:
define('AUTH_KEY', 'z>3@vr=]I+$E]eWkYx5-yW4>CZdD*$Oh-GqMH^YTGk@9AK=^aa5R)-UhdD|g!IjJ'); define('SECURE_AUTH_KEY', 'N8B0E8!f?Hkk&.<yVg3}=u2^RavlE.7E-zm~M3@HVh<TY!uq!O:(+.[0Dy`_88!y'); define('LOGGED_IN_KEY', 'gY7EvVv@Hj+w_SWoJBl$Eij)9|+i+@^Zb{C[@cIGT e?x_y|j,N5u4y$xV)bL7Fa'); define('NONCE_KEY', 'foH5+owmJFnnB.9R>!|H6OE8B> dkfyd%BIA[gvjnAT.fwD:W+R&HiiO.pbdOayN'); define('AUTH_SALT', '=Z#8WS 9J/~<wxxg4B!bg%uA06mOzJYh|4HS1Pm#f{V-+*+%ARsQ.BSNTpt+eKV4'); define('SECURE_AUTH_SALT', '^u|xHs{$@cQ;NTflX%+j)!<-zf3.,{.{Nz^+Ccb~W 2cWaSv8N8&d|c,L-oxK%*('); define('LOGGED_IN_SALT', '-JxHs<E8%5Cdo5}]^/jldmyRE-Sd2RJix+28LfI,TGjo/dN_?.XC]:}822KpU ny'); define('NONCE_SALT', '|rur)B:JxDfK6+KZXc9-Fz/``Y@xveH+Jzxn+@vJ@9Tr#~~j?D~]r!vxt|H-Q)n{');
Dies sind die Grundwerte für die Generierung von Verschlüsselungen. Unter der URL: https://api.wordpress.org/secret-key/1.1/salt/ (einfach eingeben bzw. Clicken) kann man sich eigene Zufallswerte generieren lassen – und diese dann in die wp-config.php übernehmen (um die Standardwerte zu überschreiben).
Die zweite Sache ist die Einstellung zum automatischen Updaten der WP-Installation in der wp-config.php. Dort ist eine Zeile die folgend aussieht:
define( 'AUTOMATIC_UPDATER_DISABLED', true );
Wenn das “true” am Ende gegen ein “false” ausgetauscht wird – werden die automatischen Update aktiviert. Wenn man nicht möchte, das WP alles aktualisiert – also Plugins, Themes, die Grundinstallation und Sprachdateien, dann kann man das ganze einschränken in dem man z.B. nur kleinere Updates der WP-Installation zulässt – und den Rest dann selber immer noch ‘per Hand’ anstößt. Folgende Zeile muss dafür in die wp-config.php eingefügt werden:
define( 'WP_AUTO_UPDATE_CORE', minor );
Wer dann kein WP-Entwickler ist, der sollte das Editieren von Theme-Dateien & Co. in WP abstellen – insb. wenn auch andere Benutzer als man selber Adminrechte haben. Es verhindert jedoch auch das unbemerkte Verändern der WP-Installation – falls diese doch mal gehackt werden sollte:
define('DISALLOW_FILE_EDIT', true);
Mit einer letzten Einstellung kann man noch erwirken, das sich Admins nur über HTTPS einloggen können – soweit HTTPS für die eigene Domain verfügbar bzw. aktiviert ist:
define('FORCE_SSL_ADMIN', true);
Ich habe nicht gesucht ob diese Sachen auch durch Plugins vorgenommen werden können – sicherlich. Nur bin ich bei der Verwendung von Plugins sehr Sparsam!
Update: zur DSGVO – Allgemeines und sinnvolle WP-Plugins
Für die DSGVO-Compliance von WordPress habe ich hier [2] eine tolle Zusammenfassung gefunden. Es werden allgemeine Dinge nur kurz erklärt und dann die Datenschutzerklärung (inkl. Link auf Generatoren), Auftragsdatenverarbeitungs-Vereinbarung mit dem Hoster, eingebettete Youtube-Videos, Logfiles und Kommentar-IP Adressen, SSL-Verschlüsselung, Social-Media Plugins, Kontaktformulare, Kommentarfunktionen, Cookies, (Google-) Fonts sowie eine Liste an guten Plugins für die DSGVO-Compliance vorgestellt und besprochen.
Wer sich allgemein Informieren weil was die DSGVO für Unternehmen (und ggf. auch rein private Blogs & Co.) bedeutet, der lese mal hier [1]. Wichtiges für Blog-Betreiber & Co. zum 25.5.2018 sind für mich auf jeden Fall:
- HTTPS sollte es schon sein für alle Blogs & Seiten mit Kommentarfunktion und / oder Kontaktformular.
- Persönliche Daten dürf(t)en nicht mehr unverschlüsselt übertragen werden.
- Dazu unbedingt auch in den WP-Einstellungen die URL’s auf https:// umstellen.
- Eine Datenschutzerklärung (nach DSGVO) ist obligatorisch, der Link darauf sollte prominent platziert werden.
- Z.B. mit dem Datenschutz-Generator von RA Dr. Thomas Schwenke oder
- mit dem wohl umfangreicheren und (wohl) auch für Firmen nutzbaren Generator der ‘Deutschen Gesellschaft für Datenschutz’.
- wobei ich den letzteren Nutze.
- Ob die Erklärungen Wasserdicht sind? Das weiß keiner – besser als keine Erklärung dürften Sie auf jeden Fall sein.
- Alle Videos (z.B. Youtube) sollten Datenschutzkonform eingebettet sein, hier kann ich auch diesen Artikel empfehlen.
- Das Problem: Alleine schon das einbetten eines Videos erzeugt ggf. DSGVO-Relevante Zugriffe auf Google-Server bevor die Besucher die Datenschutzerklärung lesen können.
- Abhilfe schaffen z.B. Plugins wie WP YouTube Lyte, welche das Vorschaubild des Videos lokal auf den Webserver des WP-Blogs cachen, so das der Besucher es nicht von Youtube laden muss. Erst nachdem der User aktiv wird und explizit das Video abspielt, finden die Zugriffe auf YouTube statt.
- Der Kommentarbereich braucht eine Checkbox mit einer extra Zustimmung in Bezug auf die dann gespeicherten Daten
- Zudem müssen Löschanfragen von Benutzern ermöglicht und ausgeführt werden können.
- Hier ist das Plugin WP GDPR Compliance sehr hilfreich.
- IP-Adressen von Kommentatoren müssen nach einer gewissen Zeit gelöscht werden.
- Hier habe ich Remove Comment IPs als Plugin ausgemacht.
- Emojis sollten nicht von (s.)w.org nachgeladen werden – normalerweise werden Sie das.
- Über den Plugin Autoptimize kann das abgeschaltet werden (lokales Hosting).
- Google-Fonts sollten nicht genutzt bzw. deaktiviert werden.
- Auch hier hilft ein Click in den Einstellungen von Autoptimize.
- Eine Auftragsdatenverarbeitungsvereinbarung sollte zumindest mit dem Hoster abgeschlossen werden.
- Bei Strato geht das z.B. mit einem Click im Vertrags bzw. Kundenbereich.
Ganz elementar auf jeden Fall sind alle extern eingebundenen Scripte und Ressourcen, also alles was geladen wird bevor der Besucher überhaupt die Möglichkeit hat die Datenschutzerklärung zu lesen oder irgend etwas zu bestätigen. Darunter fallen ggf.:
- Tracking-Scripts oder Pixel via Google-Analytics (oder anderer 3rd-Party Dienstleister),
- Werbung von Servern dritter (z.B. nachgeladene Bilder),
- nachladen von Fonts via Google (z.B. fonts.google.de) oder
- JavaScript Libraries von Webservern dritter (wie z.B. Google),
- Gravatare, Profilbilde & Co.
- WP-Plugins wie z.B. Jetpack, etc.
All die Dinge sehe ich persönlich kritisch wie auch ein Artikel bei Webtimizer [2]. Dies, da hier schon Zugriffe der Besucher auf Servern von 3te ausgelöst werden (u.a. Erzeugung von Logfiles, IP-Adressen & Co.) bevor diese überhaupt Datenschutzerklärung lesen können. Ob das so relevant ist? Keine Ahnung – das wird sich sicher noch in einigen Prozessen vor den Gerichten geklärt werden. Jedoch möchte ich nicht direkt davon betroffen sein. Deswegen empfehle ich:
- Möglichst immer eine Vereinbarung zur Auftragsdatenverarbeitung abschließen,
- alles was lokal gehostet werden kann auch lokal hosten (JavaScript Libs wie jQuery & Bootstrap, Fonts, Bilder, etc. pp) und
- zumindest keinen externen Statistik-Dienst nutzen.
Interessant ist dann auch noch dieser Artikel von Datenschmutz zur DSGVO [3] – welcher auch noch Links auf andere Artikel im Bezug auf die DSGVO und WordPress enthält. Ein Artikel aus der iX (Heise Verlag) geht dann auch noch mal auf Worpress-Spezifische Einstellungen und die rechtliche Bewertung zur Handhabung von Kommentaren ein [4].
Das wars schon!
Mehr möchte ich hier gar nicht schreiben – denn ich denke mit den präsentierten Strategien:
- Wenige Plugins & Themes,
- einen WP-Hoster mit automatischen Updates (DB, Server, PHP),
- dem WP Security Plugin in Punkto:
- User-Login Optionen (Sperrung nach 3 Versuchen, Cookie Basierte Authentifikation)
- Dateisystem-Berechtigungen (Überprüfung)
- Firewall (Schutz der Verzeichnisse,der .htaccess & wp-config.php Dateien vor dem Auslesen)
- und ggf. einer Datenbank-Prefix Änderung,
- einem (automatischen) Backup (seitens des Hosters oder mit Plugins wie Updraft) und
- etwas Bedacht in Bezug auf die DSGVO
sollten die meisten einfachen WP-Blogger recht gut fahren.
Quellen / Links
- [1] Die DSGVO kommt: Sind Sie gut vorbereitet? Was sich 2018 im Datenschutz ändert. Und warum das für Sie wichtig ist., RA Sören Siebert, Dipl.-Juristin Bea Brünen, RA Lev Lexow , e-recht24.de, 14.5.2018
- [2] So bereitest Du WordPress auf die DSGVO vor, Sonja, Webtimizer, 13.5.2018
- [3] DSGVO Checkliste für Blogger: Wie setze ich die Datenschutz-Grundverordnung für mein Weblog um?, Datenschmutz.net, 2.5.2018
- [4] DSGVO-Checkliste: WordPress datenschutzkonform einsetzen, Ritchie Pettauer, ix, Heise Verlag, 22.08.2018
Neuste Kommentare