Mal wieder: Piwik und anonymisierte IPs

von

Mittlerweile hat sich ja in Deutschland herumgesprochen, dass hierzulande die Speicherung von IP-Adressen und deren Weiterverarbeitung durchaus problematisch sein könnte. Besonders kritisch ist die Übermittlung der Nutzerdaten an Dritte… vor allem, wenn diese Dritten im außereuropäischen Ausland sitzen. Als Alternative zum beliebten Google Analytics habe ich hier deshalb vor einiger Zeit die Open-Source-Lösung Piwik empfohlen. Da diese aber auch die IP speichert, habe ich zusätzlich einen Hack, der genau das verhindert, vorgestellt. Mittlerweile habe ich ein paar neue Erkenntnisse sammeln können, die ich euch natürlich nicht vorenthalten möchte.

In den Kommentaren zum Piwik-Hack hat Martin Gamnitzer zurecht darauf hingewiesen, dass diese frühe Anonymisierung der IP diverse Weiterverarbeitungen (z.B. durch das GeoIP-Plugin) verhindert. In seinem Blog stellt er deswegen einen alternativen Weg zur Entfernung der IP vor. Er löscht sie erst, bevor sie in die Datenbank geschrieben wird, und kann sie so zunächst für alle nötigen Bearbeitungsschritte verwenden. Um die Bastelei im Code zu verhindern, hat er auch ein passendes Plugin erstellt. Wer die IP also erstmal benötigt, der sollte sich dort unbedingt umsehen.

Aber vorsicht: Solltet ihr z.B. für die lokale Zuordnung der IP auf externe Dienste zurückgreifen, dann wäre dies aufgrund der Weitergabe an Dritte wieder höchst problematisch.

Vielleicht gibt es aber auch da eine Lösung. Kürzlich bin ich im law blog auf die Folien eines sehr interessanten Vortrags mit dem Titel “Allzu sorglose Weitergabe von IP-Adressen?” von Joerg Heidrich (Heise Zeitschriften Verlag) und Dr. Christoph Wegener (Horst Görtz Institut für IT-Sicherheit) auf dem 17. DFN Workshop (letzter Eintrag) gestoßen.

Interessant sind dabei die Informationen auf Folie 21:

Durch “Nullen” des/der letzten Oktetts einer IP-Adresse werden
die IP-Adressen entsprechend anonymisiert

Als Vorteile dieser Vorgehensweise nennen die Autoren folgendes:

- Bei ausreichender Nullung Keinerlei Personenbezug mehr herstellbar

- Beim Geo-IP-Verfahren bringt die Nullung des letzten Oktetts keine wesentlichen Nachteile (vgl. Kühn, DuD 2009, 747ff)

Nun bleibt natürlich die Frage, was man als “ausreichende Nullung” versteht. Spätestens seit Panopticlick (Erläterung bei BasicThinking) wissen wir, dass ein Benutzer auch ohne IP nachverfolgt werden kann. Ohne rechtliche Absicherung, d.h. ohne eine klare Rechtssprechung, kann ich hier (insbesondere als juristischer Laie) nur Vermutungen anstellen.

Für eine dauerhafte Speicherung ist die Löschung des letzten Oktetts sicherlich zu wenig. Wir reden hier von 28 = 256 möglichen Variationen… zumindest kleine Webseiten können auf dieser Basis einen User sicherlich gut identifizieren, größere müssten eben den Fingerprint zu Hilfe nehmen. Natürlich ist bei so einer Verfremdung die Rückverfolgung der IP auf den Anschlussinhaber theoretisch fast unmöglich, aber das ist für den normalen Webmaster auch die Rückverfolgung der kompletten IP. Dummerweise reicht diese “theoretische Unmöglichkeit” aber anscheinend nicht aus, zumal ein Tracking und die Kombination z.B. mit Kommentaren unter Zuhilfenahme des “Browser-Fingerabdrucks” tatsächlich möglich wäre.

Würden wir die letzten beiden Oktette nullen, dann würde sich die Wahrscheinlichkeit der Wiedererkennung deutlich verändern: 216 = 65536 Möglichkeiten. Mit dem Browser-Fingerprint immer noch nachvollziehbar, aber das wäre (zumindest bei recht geringer Besucherzahl) wohl auch ein Großteil der Besucher bei komplett genullter IP.

Mein Gedanke wäre es nun, die IP in zwei Schritten zu anonymisieren:

  1. Zum frühen Zeitpunkt meiner bisherigen Piwik-IP-Nullung (IP = 0.0.0.0) wird nur das letzte Oktett auf 0 gesetzt (also die letzte Position der IP). Dadurch kann die IP laut des obigen Zitates noch für GeoIP verwendet werden. Nutze ich für die Lokalisierung einen Dienst, so erhält dieser nur die verfremdete IP… also nicht den “Browser-Fingerprint” des Nutzers. Anonymität wäre also weitgehend gegeben.
  2. Zur Speicherung der IP anonymisiere ich nun auch das vorletzte Oktett. Somit verringere ich die Möglichkeit der theoretischen Zuordnung des Besuchers massiv, aber gleichzeitig verringere ich auch die Anzahl der fehlerhaft als “Unique” erkannten Besucher im Vergleich zum vollständigen “Nullen”.

Wer bis hierhin gelesen hat, der möchte sicher auch wissen, wie dies möglich ist. Beginnen wir bei der Nullung des letzten Oktetts:

  1. Öffne im Piwik-Verzeichnis die Datei
    1
    /core/Tracker/Visit.php
  2. Suche dort nach
    'location_ip' => $userInfo['location_ip'],
  3. Ersetze diese Zeile durch
    'location_ip' =>
    	ip2long(preg_replace('/(\d+)\.(\d+)\.(\d+)\.(\d+)/i', '$1.$2.$3.0', $userInfo['location_ip'])),

Nun müssen wir natürlich auch Martins Code anpassen:

  1. Öffne im Piwik-Verzeichnis die Datei
    1
    /core/Tracker/Visit.php
  2. Dort suchst Du nach
    Piwik_Tracker::getDatabase()->query( "INSERT INTO [...] ");
    
  3. Direkt vor dieser Zeile baust Du folgenden Code ein:
    $ipHelper = $this->visitorInfo['location_ip'];
    $this->visitorInfo['location_ip'] = 
    	ip2long(preg_replace('/(\d+)\.(\d+)\.(\d+)\.0/i', '$1.$2.0.0', long2ip($ipHelper)));
    
  4. Und direkt danach wieder diesen Code:
    $this->visitorInfo['location_ip'] = $ipHelper;

Damit haben wir folgendes erreicht:

  1. Piwik arbeitet intern mit einer IP, die im letzten Oktett genullt ist.
  2. Piwik speichert eine IP, die in den letzten beiden Oktetts genullt ist.

Ist das rechtlich ausreichend? Ehrlich gesagt habe ich keine Ahnung. Nach den oben zitierten Folien könnte es wohl passen, aber bis wir eine eindeutige Rechtssprechung haben, ist wohl nichts wirklich sicher.

Jedenfalls spiele ich den Ball jetzt an Martin zurück... in der Hoffnung, dass er die Zeit und Lust hat, dies in ein Plugin zu packen. Mir fehlt gerade leider beides ;)

Kommentare & Trackbacks

» Kommentar schreiben   » Trackback-URL

Markus [www]

Sollte die IP wirklich irgendwann in letzter Instanz mal als personenbezogen angesehen werden, ist eine Speicherung ohne vorheriger Einwilligung nicht erlaubt, zumindest nach bisheriger (mir bekannter) Rechtssprechung. Ich denke dann ist auch eine zeitweilige Speicherung nicht erlaubt. Ist jetzt allerdings natürlich nur mein Gedanke, lass mich gern eines anderen belehren.

André Bräkling [www]

Es handelt sich in Martins Lösung ja nicht um eine zeitweilige Speicherung. Stattdessen wird die IP einfach für den Verarbeitungsprozess erhalten und dann zur Speicherung anonymisiert.

Martin [www]

Im Piwik-Trac gibt es schon einge Zeit ein Ticket, um die Anonymisierung in den Core zu übernehmen. Dort wird diskutiert, dass das Löschen oder Kürzen der IP-Adresse zu einer fehlerhaften Erfassung von Nutzern kommt, die keine Cookies erlauben. Sie werden in jeder Session als neue (anstatt wiederkehrende) Nutzer erkannt. Der Lösungsansatz besteht darin, die IP durch einen Hash-Code zu ersetzen. Das setzt aber voraus, dass die Datenbank angepasst wird, da location_ip zur Zeit nur “bigint” ist.

Aber was heißt, dass die Löschung des letzten Oktetts keine “wesentlichen Nachteile” bringt? Dazu muss ich noch etwas recherchieren.
Aber es scheint die optimale Lösung zu sein, zu Beginn die IP-Adresse zur Weiterverarbeitung zu kürzen, aber in der Datenbank den Hash der vollständigen IP-Adresse zu speichern.

Ich werde das in den nächsten Tagen auf jeden Fall mal testen und dann sicherlich auch eine erweiterte Version meines Plugins basteln.

Jeffrey [www]

Ich benutze bei mir im Blog selber Piwik und bin damit an sich sehr zufrieden.

Bei uns in Liechtenstein ist das Thema IP-Speicherung Ja/Nein noch nicht so stark verbreitet. Ich werde mich aber in nächster Zeit trotzdem mal mit dem Thema befassen.

Das von Martin angesprochene Ticket bezüglich IP-Adresse => Hash hört sich auch recht interessant an. Wäre eigentlich die Beste Lösung und die Umwandlung des einen Datenbank-Feldes wäre bestimmt auch nicht so eine grosse Sache, so wie ich das sehe.

André Bräkling [www]

Natürlich… auch das teilweise “Nullen” führt, wie auch im Artikel erwähnt, dazu, dass die Ermittlung von Unique-Visitors und der Absprünge ungenau wird. Dennoch sollte die Fehlerrate beim Nullen der letzten beiden Abschnitte schonmal geringer sein.

Ein Hash war damals auch mein erster Gedanke, bevor ich mich dann doch für die Lösung mit 0.0.0.0 entschieden hatte. Denn dazu ist, wie Martin bereits erwähnt hat, ein größerer Eingriff notwendig.

Außerdem muss bei Verwendung eines Hashs zusätzlich sichergestellt sein, dass der Hash unabhängig von den anderen Daten gespeichert wird. Sonst könnte man z.B. unter Berücksichtigung des Hosts die Menge der möglichen IPs stark einschränken und so durch Trial & Error die tatsächliche IP doch wieder ermitteln.

Martin [www]

Ich habe gerade eine neue Version meines Plugins veröffentlicht und auch einige Erläuterungen dazugepackt. Feedback ist erwünscht.

Till

Ich habe in meinem ge-/erbrochenen :-) Englisch mal versucht die Frage aufzuwerfen, warum man für einen Hash die Datenstruktur verändern muss und nicht einfach das bestehende IP-Feld dafür nutzen kann:
http://dev.piwik.org/trac/ticket/692#comment:15
Kurz: Der Hash einer IP kann durchaus wieder eine IP sein. Das Risiko der Kollisionen kann man meines Erachtens voll und ganz in Kauf nehmen.
Oder mache ich da irgendwo einen Denkfehler?

Martin [www]

@Till: Wo siehst Du denn den Sinn des Hashens, insbesondere in Hinblick auf die zu erwartenden Kollisionen?
Davon abgesehen wäre es kein Problem, in der “install”-Funktion eines Plugins mittels “MODIFY” die Spalte location_ip von “bigint unsigned” auf “varchar(32)” zu ändern und danach die bestehenden IPs mittels MD5 zu hashen.

André Bräkling [www]

1. Stimmt, man kann nicht nur den IP-Bereich über die anderen Daten einschränken und sie per Bruteforce ermitteln, sondern auch (wie Martin beschreibt) natürlich nach wie vor zuordnen, sollte man von einer vorhandenen IP auf den Nutzer schließen wollen. Also müsste der Hash a) unabhängig von den anderen Daten gespeichert werden und b) mit zusätzlichen Daten angereichert sein, die eine spätere Ermittlung anhand einer bekannten IP verhindert.

2. Was mich nur wundert: Wenn Piwik tatsächlich einen Hash über die Konfiguration des Nutzers inkl. IP verwendet, um wiederkehrende Besucher zu ermitteln… wozu ist dann überhaupt eine abschließende Speicherung der IP notwendig? Dieser Konfigurationshash ist doch dann vollkommen ausreichend, damit erledigt sich auch 1. von alleine.

3. Wie arbeitet eigentlich das GeoIP-Plugin? Liefert es eine eigene Datenbank mit? Irgendwo müsste ja die lokale Zuordnung herkommen.

4. Von einem MODIFY aus einem Plugin heraus würde ich abraten, ebenso von einer manuellen Änderung des Typs. Zwar kann varchar problemlos auch einen bigint aufnehmen, so dass keine Kompatibilitätsprobleme auftreten sollten. Jedoch könnten weitere Plugins auf die IP zugreifen und einen Integer erwarten. Klar, alles Spekulation und eh in Bezug auf Plugins, die die IP im nachhinein verarbeiten würden (was wir ja nicht wollen), solche Änderungen würde ich aber mit Blick auf die Konsistenz lieber seitens der Entwickler selbst sehen. Vielleicht bin ich aber nur durch die vergangene Softwaretechnik-Vorlesung etwas übersensibel ;)

Martin [www]

@André

zu 1. & 2. Sehe ich auch so. Deswegen sehe ich auch den Sinn eines Hashes nicht und hätte auch kein Problem damit, statt der gekürzten IP eine Null zu speichern.

zu 3. Das GeoIP-Plugin bringe keine Datenbank mit, sondern nutzt die Datenbank von Maxmind. Wie im Ticket beschrieben wird die Datenbank lokal installiert. Ein Zugriff auf einen externen Service erfolgt also nicht.

zu 4. Da stimme ich völlig zu. Ein derartiger Eingriff via Plugin ist ausgesprochen unsauber. Besser wäre es vielleicht, den Hash in einer separaten Spalte zu speichern und die Original-IP zu löschen. Natürlich wären auch dann wieder solche Plugins arm dran, die später noch auf die IP zugreifen wollen. Aber wie gesagt, das ist eine Erwägung ohne (offensichtlichen) praktischen Nutzen.

Till

Ihr habt Recht (insbesondere 1. habe ich nicht bedacht).

Martin [www]

Das Konzept meines NoIP-Plugins ist offensichtlich angenommen worden und wird als Plugin in der Version 0.55 von Piwik vorhanden sein. Mit dem Unterschied, dass man per Konfigurationsparameter die Anzahl der zu löschenden Oktette einstellen kann.

Wer will, kann es sich schon mal aus dem SVN holen.

André Bräkling [www]

Dann mal herzlichen Glückwunsch :) Und danke für die Mühe! Werde das auch direkt nochmal in einen Beitrag schreiben.

NoIpPlugin v 0.2 | Martin Gamnitzer

[...] UPDATE 2010-02-28: Das Plugin wird in einer erweiterten Form in der nächsten Piwik-Version (0.55) vorhanden sein. Neu hinzugekommen ist die Möglichkeit, in der Konfiguration die Anzahl der zu löschenden Oktette einzustellen. Wer will, kann es sich schon vorher aus dem Piwik-SVN holen. Bis zum Erscheinen der Version 0.55 wird das NoIpPlugin hier aber noch verfügbar bleiben.Ich bedanke mich für alle Anregungen und Diskussionen, insbesondere bei André Bräkling. [...]

Linktipps: Datenschutz, Analytics, Wordpress, PHP und Komprimierung › infoblog.li

[...] beschrieben wird, wie man die IP-Speicherung unter Piwik deaktivieren kann. Nun hat André einen weiteren Artikel zu diesem Thema geschrieben, in dem das ganze Thema nochmals etwas detaillierter betrachtet wird, [...]

Comments are closed.

 
© 2003-2013 André Bräkling - Icons by Zlwo.com, BlogPerfume.com and famfamfam.com.