Vortrag von Torsten Landsiedel beim WPCamp 2012 in Berlin
"Sicherheit ist kein Zustand, der erreicht werden kann, sondern eine Einstellung."
Es gibt unzählige Artikel zum Thema Sicherheit und WordPress im Netz mit vielen nützlichen, manchmal auch unnützen, Vorschlägen, wie man sein Blog absichern kann. In der Session zu der diese Slides gehören wollte ich die wichtigsten Sicherheitsmaßnahmen vorstellen und die Teilnehmer für das Thema Sicherheit sensibilisieren.
- Einführung in das Thema Sicherheit und WordPress für Anfänger
- Auffrischung des Themas Sicherheit für Fortgeschrittene
- Vorstellung von Plugins zur Verbesserung der Sicherheit
Nähere Infos unbedingt in dem Blogeintrag zu den Slides auf meinem Blog nachlesen:
http://torstenlandsiedel.de/blog/
2. Was ist Sicherheit?
„Sicherheit ist ein relativer Zustand der Gefahrenfreiheit,
der stets nur für einen bestimmten Zeitraum,
eine bestimmte Umgebung
oder unter bestimmten Bedingungen
gegeben ist.“
6. Wieso ich?
➔ Meine Webseite ist doch unwichtig!
➔ Wer hat denn Interesse an meinen Daten?
➔ Ich habe doch kaum Besucher!
➔ Ich habe doch ein „Sicherheits-Plugin“ installiert!
8. Es kann jeden treffen ...
➔ Reuters-Blog gehackt, nutzte veraltete WordPress-Version (Heise.de)
➔ Admartinator gehackt
➔ AMD-Blog defaced, dann offline
➔ Upload Magazin gehackt
➔ etc. etc. ...
9. Sicherheit erreichen
➔ Updaten, Updaten, Updaten!
– WordPress-Core, Themes und Plugins aktuell halten
– Benachrichtigung per Plugin (Mail on Update)
– Oder gleich Infinite WP oder Manage WP (o.ä.)
10. Gute Passwörter
➔ Möglichst lang (>10 Zeichen)
➔ Mehrere Wörter hintereinander
– Hutsahneregalhuepfburg
➔ Satz mit Regeln
– Dieser Satz ist ein super Passwort, dass ich mir gerade ausdenke!
– „DSi1sPdimga!“
➔ Nicht aufschreiben, nicht teilen, regelmäßig ändern
(Stichwort: Zahnbürste!)
➔ KeePass nutzen
13. Der Weg muss sicher sein!
➔ Betriebssystem aktuell? Alle Sicherheitsupdates eingespielt?
➔ Virenscanner aktiv und aktuell?
➔ Wenn möglich SFTP statt FTP
– http://de.wikipedia.org/wiki/Secure_File_Transfer_Protocol
➔ Alternativ FTP over TLS
– http://de.wikipedia.org/wiki/FTP_über_TLS
14. Aufräumen! + Ordnung!
➔ Unbenutzte Themes und Plugins löschen!
– Nein, deaktivieren reicht nicht …
➔ Plugins und Themes nur aus vertrauenswürdigen Quellen
beziehen!
➔ Verzeichnisse anzeigen verhindern
– Options All -Indexes (in .htaccess)
– Oder in jedem Ordner eine leere index.php
15. Security-Basics
➔ Sicherheitsschlüssel in der wp-config.php setzen
– http://codex.wordpress.org/Editing_wp-config.php#Security_Keys
➔ Sollte das Blog gehackt werden, unbedingt diese Schlüssel erneuern!
Damit werden die Cookies verschlüsselt und die bleiben sonst valide!
17. Security through obscurity
➔ „Sicherheit durch Verschleierung“
➔ Sinnvoll nur als Ergänzung!
➔ Präfix ändern
➔ $table_prefix = 'wp_deinpräfix_';
➔ Bei der Installation durch Änderung in wp-config.php
➔ Ansonsten durch Plugins
➔ Verhindert einfache SQL-Injections
18. Wichtige Ordner verschieben
➔ wp-config.php (sofern möglich) in den Ordner über
dem öffentlichen Ordner verschieben
– WordPress sucht automatisch auch dort!
➔ wp-content-Ordner verschieben
– define( 'WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/blog/wp-content' );
– define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');
– define( 'WP_PLUGIN_DIR', $_SERVER['DOCUMENT_ROOT'] . '/blog/wp-content/plugins' );
– define( 'WP_PLUGIN_URL', 'http://example/blog/wp-content/plugins');
19. „admin“ als Username
➔ Früher Standard, daher häufig Angriffsziel
➔ User-ID=1=Admin → OMG!
➔ Admin umbenennen:
➔ UPDATE wp_users SET user_login = 'Your New Username' WHERE user_login = 'Admin';
➔ (Wer nicht phpMyAdmin o.ä. nutzen möchte/kann, der nutzt das Search & Replace-Plugin von
FrankBültge: http://wordpress.org/extend/plugins/search-and-replace/ )
➔ Und immer an das Präfix denken!
20. Ist das (un)sicher?
➔ Ist der neue Username dann geheim? Eher nicht ...
– Permalinkproblem:
● /?author=1 → /author/admin
– the_author_posts_link
● Link zur Autoren-Übersichtsseite bei Multiautoren-Blogs
– comment_class
● Autor kommentiert in eigenem Blog
– Login-Fehlermeldung
22. „admin“ als Username
➔ User-ID per MySQL ändern:
➔ UPDATE 'wp_users' SET 'ID' = '1234' WHERE 'wp_users'.'ID' = 1;
➔ UPDATE 'wp_usermeta' SET 'user_id' = '1234' WHERE 'wp_usermeta'.'user_id' = 1;
➔ UPDATE 'wp_posts' SET 'post_author' = '1234' WHERE 'wp_posts'.'post_author' = 1;
➔ UPDATE 'wp_links' SET 'link_owner' = '1234' WHERE 'wp_links'.'link_owner' = 1;
➔ UPDATE `wp_comments` SET `user_id` = '1234' WHERE `wp_comments`.`user_id` = 1;
➔ (Wer nicht phpMyAdmin o.ä. nutzen möchte/kann, der nutzt das Search & Replace-Plugin von
FrankBültge: http://wordpress.org/extend/plugins/search-and-replace/ )
➔ Und immer an das Präfix denken!
26. Brute-Force-Attacken
➔ Was hilft? → Gute Passwörter!
➔ Oder ein Plugin: Limit Login Attempts
➔ Grenzen kennen!
– Distributed Brute Force
27. Kill PHP execution
➔ Im Ordner „/uploads/“ per htaccess die Ausführung von PHP
verhindern:
<FilesMatch *.php>
Order Deny, Allow
Deny from All
</Files>
(http://wp.smashingmagazine.com/2012/10/09/four-malware-infections-wordpress/)
28. wp-config.php schützen
➔ Bei PHP-Problemen darf niemals diese Datei öffentlich werden,
daher schützen!
<FilesMatch "(wp-config.php|liesmich.html|readme.html)">
order deny,allow
deny from all
</FilesMatch>
➔ Zusatzfunktion: Versionsnummer verstecken
29. Versionsnummer verstecken
➔ Generator-Eintrag aus Head entfernen:
– <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />
– remove_action('wp_head', 'wp_generator');
➔ Aber was ist mit den Feeds?
– add_filter('the_generator', create_function('', 'return "";'));
➔ wp_enqueue_script()-Problem
– Wenn keine Version angegeben wird WP-Version angehängt!
30. Versionsnummer verstecken
// remove wp version param from any enqueued scripts
// http://docs.appthemes.com/tutorials/removing-wordpress-version-number/
function at_remove_wp_ver_css_js( $src ) {
if(strpos($src,'ver='))
$src= remove_query_arg('ver',$src);
return$src;
}
add_filter('style_loader_src','at_remove_wp_ver_css_js',9999);
add_filter('script_loader_src','at_remove_wp_ver_css_js',9999);
31. SSL-Verschlüsselung
➔ Ab etwa 60 EUR / Jahr – SSL-Zertifikat
– define('FORCE_SSL_LOGIN', true);
– define('FORCE_SSL_ADMIN', true);
➔ Shared SSL-Lösung nur für den Login
– Redirect 301 /ssl
https://sslsites.de/example.de/wp-login.php
– ???
32. Zugriffsrechte
➔ Immer nur soviel Rechte einräumen wie nötig
➔ Trennung Administration & Nutzung (Windows)
– Editor/Redakteur zum Arbeiten
– Admin extra sichern
➔ Was nicht da ist, kann nicht missbraucht werden
(Editor ausblenden)
– define('DISALLOW_FILE_EDIT',true);
➔ Dateirechte (Verzeichnisse: 755, Dateien: 644)
33. Zwei mal abschließen …
➔ htaccess-Passwort-Sicherung des Logins
(nur wp-login.php!)
– Initiative WordPress-Sicherheit
– Zugang nur bestimmten IPs oder IP-Bereichen erlauben/verbieten
➔ Adminkonto extra absichern
– Google Authenticator oder Duo Two-Factor Authentication
➔ Blacklist
– http://perishablepress.com/5g-blacklist-2012/
34. Kinder & Brunnen
➔ Backups!
– FTP & MySQL-Datenbank
– SQL-Backup per Plugin: WP DB Backup
– Oder direkt in die Dropbox
– Bei vielen Datenbanken: MySQL-Dumper
– Nicht auf dem Server speichern (nicht öffentlich, nicht online)
➔ Richtig reagieren
– http://codex.wordpress.org/FAQ_My_site_was_hacked
35. Monitoring
➔ Vorteil: Schnellere Reaktionszeit
➔ Alle Änderungen werden per Mail gemeldet
– WordPress File Monitor Plus
➔ Nachteil: Serverbelastung
36. Theme & Plugin-Devs
➔ Vertraue NIEMALS einer Usereingabe!
● Maskieren (escapen) je nach Kontext gegen Cross Site
Scripting (XSS):
– esc_attr, esc_html, esc_js, esc_url, esc_url_raw, esc_textarea
37. Theme & Plugin-Devs
➔ Schutz vor SQL-Injection
➔ esc_sql
➔ $wpdb->prepare() / insert() / update() / select()
➔ Und immer an $wpdb->prefix denken!
➔ Weiterführende Links:
➔ http://codex.wordpress.org/Data_Validation
➔ http://remicorson.com/sanitizing-strings-and-data-validation-in-wordpress/
43. Danke!
Vielen Dank an die XING-WordPress-Gruppe!
Vielen Dank an das WordPress-Meetup Hamburg!
44. Fragen?
➔ Zeit ist knapp, daher gerne auch später auf dem Camp
oder online:
➔ http://torstenlandsiedel.de/kontakt/
➔ https://twitter.com/zodiac1978/