Meine Website ist ganz ordentlich gegen unerwünschte Besucher abgedichtet. Ich achte auf die Standard-Tipps für eine Website, die auf WordPress läuft. Trotzdem habe ich alle paar Monate Besuch von Bot-Netzen, mit mehreren Login-Versuchen pro Minute. Meist dauert das einen halben bis ganzen Tag, am Ende sind es mehrere tausend vergebliche Logins. Den letzten größeren Versuch der Bots habe ich mir aus der Warte des Daten-Spezialisten angesehen und eine Zeitraffer-Ansicht mit cartoDB erstellt. Über die Benachrichtigung-Mails eines Sicherheits-Plugins mit Uhrzeit und IP-Adresse konnte ich grobe Ortsangaben und Koordinaten jedes abgewehrten Login-Versuches erstellen. Die Karte zeigt in 20 Sekunden, wie sich die Versuche zwischen 9 Uhr und 17 Uhr mitteleuropäsicher Zeit auf der Welt verteilten.
Personen, die eine fremde Website übernehmen wollen, bedienen sich dabei eines Netzes aus gekaperten Rechnern. Deren Besitzer wissen meist gar nicht, was ihr Rechner da im Hintergrund tut. Wie die Karte zeigt, kommen die Angriffe keineswegs zu einem bestimmten Zeitpunkt aus der gleichen Gegend. Das bedeutet meiner Interpretation nach, dass gekaperte Rechner aus der ganzen Welt Einlass bei mir begehren. Dabei arbeiten sieim Wesentlichen Passwort-Kombinationen aus vorgegebenen Listen ab. Bei mir kommen sie damit nicht weit, weil ich mit dem Plugin „Limit Login Attempts“ nach dem zweiten falschen Anmeldeversuch die zugehörige IP-Adresse blockiere.
Die schnelle Analyse der benutzten Login-Namen zeigt: Die Bots versuchen es vor allem mit Standard-Logins wie „Admin“ oder „Test“. Aus der Website-URL folgerten die Bots dann noch, dass ich mich möglicherweise mit michael-hoerz einlogge – was ich allerdings nicht mache. Allen, die WordPress für ihre Seite benutzen, würde ich dringend empfehlen, ihren Benutzernamen zu ändern, falls dieser „admin“ lauten sollte!
Die zweite Karte zeigt, wie sich die Angriffe absolut verteilen – dabei kann man sehen, dass sich die Ort der Angriffsversuche doch recht stark in Europa, und häufen sich tendenziell in Mittel- und Osteuropa. Meine erste Erklärung dafür wäre: Ärmere Länder bedeuten ältere und damit weniger sichere Rechner.
Die IP-Adressen, Uhrzeit und versuchter Login-Name habe ich aus den Benachrichtigungs-Mails extrahiert, die ich automatisch zugeschickt bekomme. An einem Tag wie dem untersuchten kein Spaß, aber anders bekommt man diese Daten nicht ohne weiteres. Zum Geocodieren habe ich die API von freegeoip.net verwendet, die kostenlos ist und anhand der IP-Adresse Land, Stadt sowie Längen- und Breitengrad zurückgibt. Das hätte ich sicher mit einem schönen Shell-Skript machen können, ich wollte aber ausprobieren, ob ich eine Variante finde, die ich an nicht-programmierende Journalisten weitergeben kann. Gibt es – und zwar über die Import-XML-Funktion von Google Tables. Eine Abfrage bei freegeoip für die IP-Adresse 93.67.53.32 gibt unformatiertes XML zurück.
In meiner Google-Docs-Tabelle habe ich aus allen IP-Adressen mit einer kleinen Formel URLs für die Abfrage erstellt. Das ist ziemlich simpel, mit
="https://freegeoip.net/xml/"&A2
A2 steht hier für die Zelle, in der die IP-Adresse steht. Mit „&“ verknüpfe ich die URL mit dem Wert anderen Zelle, in der die IP steht. Im Ergebnis habe ich dann eine abfragefertige URL. Im zweiten Schritt brauche ich die IMPORTXML-Funktion, die sich auf das eingebettete Abfrageergebnis bei freegeoip.net bezieht. Sie ruft die URL auf, und fügt in die Zelle einen bestimmten Wert ein, zum Beispiel den für. Die Formel dafür ist ebenfalls recht einfach.
=IMPORTXML(B2, "//Latitude")
Damit sage ich der Google-Tabelle, sie möge bei der URL, die ich vorher in Feld B2 erstellt habe, den Wert für diesen Parameter abfragen. Als Ergebnis steht genau der gewünschte Wert in der Zelle. Ich habe das für alle gewünschten Werte gemacht und für Ort, Land, Längen- und Breitengrad jeweils eine Spalte angelegt und meine Werte erhalten.
Wenn ich nun wie in diesem Fall 4000 IP-Adressen und damit 16.000 Abfragen habe, kommt die Google-Tabelle an ihre Grenzen, wenn ich anfange, die Auffüll-Funktion mit Runterziehen oder Doppelklicken zu nutzen. Bei kleineren Abfragen (100-500) dagegen klappt das schnell. Um am Ende nicht die Formeln, sondern die eigentlichen Werte zu haben, kann man entweder die Spalten kopieren und an derselben Stelle (oder in einer neuen Spalte) „nur Inhalte“ einfügen, oder das ganze gleich als CSV exportieren. Dann bleiben die Formeln ebenfalls auf der Strecke.
(Wenn man wie ich cartoDB verwendet, kann man sich das Geocodieren theoretisch auch schenken, wie ich beim Hochladen feststellte. Allerdings fehlen dann Ort und Land – in der aktuellen Kartendarstellung macht das keinen Unterschied, aber in anderen Darstellungen lässt sich jeder Punkt anklicken und z.B. der Ort in einem Info-Fenster anzeigen.)
Pingback: Datenjournalismus im Oktober 2014 | Datenjournalist