WordPress: wichtige Sicherheitsmaßnahmen

Wer WordPress nutzt, wird sich schon Gedanken darüber gemacht haben, wie man die Sicherheit des Systems erhöhen kann. WordPress hat ein eigenes Security Team, welches die Software stetig auf Schwachstellen hin überprüft, daher gilt der Core auch als recht sicher. Allerdings gibt es auch hier ständig neue potentielle Sicherheitslücken, wie beispielsweise die neue Rest-API. Größter Angriffsvektor für Hacker bleiben jedoch nach wie vor schlampig programmierte WordPress-Plugins. Wer die Full Disclosure-Mailingliste abonniert hat, wird wissen, was ich meine: Dort tauchen ziemlich regelmäßig Schwachstellen in WordPress-Plugins auf. Wie kann man sich nun aber effektiv schützen, auch wenn man auf bestimmte Plugins angewiesen ist? Dieser Post soll eine lose Sammlung effizienter Maßnahmen sein, die die Sicherheit des Systems verbessern.

Keine Ausführungsrechte für das DocumentRoot

Letztens hat mir jemand eine WordPress-Instanz über ein anfälliges WordPress-Plugin gehackt, eine PHP-Shell hingelegt und darüber NodeJS heruntergeladen. Anschließend wurden verschiedene Hacks auf weitere Seiten aufgeführt. Wie kann man das verhindern? Unter Linux gibt es die Möglichkeit, beim Mounten von Filesystemen die Option noexec zu setzen. Diese gewirkt, dass grundsätzlich ausführbare Dateien (wie Binaries oder Skripte) nicht ausgeführt werden können. Die Option kann man einfach in der /etc/fstab mitgeben. Voraussetzung ist natürlich, dass das DocumentRoot auf einem eigenen Filesystem liegt, beispielsweise auf einem LVM-Volume. Ist das nicht so, kann man sich mit einem kleinen Trick behelfen. Im Beispiel ist /var/www/html das DocumentRoot:

$ mount -o bind /var/www/html /var/www/html
$ mount -o remount,noexec /var/www/html

Der erste Befehl mountet das Verzeichnis auf sich selbst als sogenannten Bind-Mount. Der zweite Befehl setzt für den Mount die Option noexec und verhindert damit das Ausführen von Dateien. Folgendermaßen kann das getestet werden:

$ cat <<EOF > /var/www/html/test.sh > #!/bin/bash > echo "Hello World" > EOF $ chmod 755 /var/www/html/test.sh $ /var/www/html/test.sh bash: /var/www/html/test.sh: Keine Berechtigung weiterlesen

WordPress: Automatischen Anker (ID-Attribut) für Überschriften einfügen

Auf Webseiten mit viel Inhalt, wie beispielsweise Wiki-Seiten oder Dokumentationen, gibt es die Möglichkeit Anker an bestimmten Stellen zu setzen, die man mit Links referenzieren kann. Das ist einerseits mit benamten Link-Tags möglich, andererseits mit IDs. weiterlesen

WordPress: Aktuelle Version via Skript installieren

Ich muss immer mal wieder ein WordPress-System installieren, deshalb dachte ich mir, ich lege das Zip-Archiv, welches ich sonst jedes mal downloaden müsste, irgendwo ab. Problem dabei: WordPress wird ständig geupdated, weswegen dieses Archiv auch immer aktuell gehalten werden müsste. weiterlesen

WordPress: Rich Snippet Tester bringt „missing required field updated“

Ich habe kürzlich meinen Blog mit entsprechenden Autor-Informationen ausgestattet, um in den Google-Suchergebnissen mit Bild und Namen aufzutauchen. Wer weiß, vielleicht spielt das ja irgendwann mal irgendeine Rolle^^ Man kann nie wissen.

Fakt ist, dass ich, um zu testen ob es funktioniert, das sogenannte „Test-Tool für strukturierte Daten“ ausprobiert habe (engl. rich snippet test). Soweit war da auch alles ok, nur ein Feld hat gefehlt und zwar „updated“. Ein kurzes Googleln brachte die Erkenntnis, dass Google ein Feld erwartet in dem steht, wann der entsprechende Beitrag das letzte mal geändert wurde. Möchte man einfach nur diesen ärgerlichen Fehler beseitigen, kann man einfach die Erstellungszeit mit als Zeit auszeichnen, an der zuletzt upgedated wurde. Wie das funktioniert wird hier beschrieben. Aber ich dachte mir: Das muss auch schöner gehen!

Zuerst muss man herausfinden, an welcher Stelle die Meta-Informationen der Beiträge generiert werden. Im oben verlinkten Artikel ist das in der functions.php der Fall. Beim Theme twentyfourteen ist das aber nicht so. Deshalb hab ich nach einer Zeichenkette gesucht, die ich kannte:

$ cd /pfad/zum/theme/
$ grep -rl "&lt;span class="entry-date"&gt;" *
image.php
inc/template-tags.php
inc/widgets.php

Die Suche ergab 3 Dateien; die erste und die letzte kann man aber ausschließen. Also muss man in der Datei inc/template-tags.php suchen:

&lt;?php // Set up and print post meta information. printf( '&lt;span class="entry-date"&gt; &lt;a href="%1$s" rel="bookmark"&gt;&lt;time class="entry-date" datetime="%2$s"&gt;%3$s&lt;/time&gt;&lt;/a&gt; &lt;/span&gt; &lt;span class="byline"&gt; &lt;span class="author vcard"&gt;&lt;a class="url fn n" href="%4$s" rel="author"&gt;%5$s&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;', esc_url( get_permalink() ), esc_attr( get_the_date( 'c' ) ), esc_html( get_the_date() ), esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), get_the_author() ); ?&gt; weiterlesen

WordPress: Nützliche Plugins

In letzter Zeit habe ich einige WordPress-Instanzen aus den verschiedensten Gründen aufgesetzt. Dabei kommt mir immer die Frage: Wie hieß noch gleich das eine Plugin, mit welchem du dieses bestimmte „Problem“ gelöst hast? Deshalb möchte ich hier eine kleine Liste mit Plugins starten, die für verschiedene Anwendungsfälle, die immer wieder auftreten, geeignet sind. weiterlesen