Archiv für den Monat: April 2018

DSGVO/GDPR: Speichern von IP-Adressen durch PHP-Anwendungen und in Server-Logdateien verhindern

Ein wichtiger Hinweis im Voraus: Allein durch die hier dargestellten Methoden hat man nicht automatisch alle Vorgaben der DSGVO erfüllt – dazu gehört deutlich mehr! Ich möchte hier nur ein paar Tipps geben, wie gewisse Teilprobleme ohne viel Aufwand gelöst werden können.

Da in knapp einem Monat die neue Datenschutz-Grundverordnung (DSGVO) bzw. General Data Protection Regulation (GDPR) zur Anwendung kommt, muss sich so manch ein Webmaster Gedanken darüber machen (idealerweise bereits gemacht haben), wie er seinen PHP-Anwendungen (WordPress, CMS, Forum, Wiki, …) beibringt, nicht mehr die IP-Adressen der Besucher zu speichern. Die DSGVO definiert IP-Adressen nämlich explizit als personenbezogen. Sofern man sich nicht glaubhaft auf ein berechtigtes Interesse berufen kann, sollte man diese Adressen somit lieber nicht unnötigerweise speichern. Je weniger man speichert, desto weniger Angst muss man vor eventuellen Bußgeldern haben und desto weniger Schaden kann bei einem Datendiebstahl entstehen.

Nun kann man entweder für jede seiner Anwendungen ein Plug-in suchen oder selber schreiben, oder man versucht es gleich mit einem radikaleren Ansatz. Zumindest für PHP-Anwendungen gibt es eine sehr einfache und „idiotensichere“ Lösung, und zwar die php.ini-Variable auto_prepend_file. Wenn man hier eine PHP-Datei einträgt, dann wird diese am Anfang jedes ausgeführten PHP-Skripts geladen, so als ob sie mit require() eingebunden worden wäre. Und genau das können wir nutzen, um die Variable $_SERVER["REMOTE_ADDR"], in der PHP die IP-Adresse des Besuchers ablegt, zu verändern, bevor die PHP-Anwendung sie zu Gesicht bekommt. Also schreiben wir in unsere php.ini oder eine spezielle Datei im conf.d-Verzeichnis:

auto_prepend_file = /pfad/zur/anonymize_ip.php

Die Datei anonymize_ip.php enthält den Code, der die IP-Adresse anonymisiert, indem das letzte Oktett auf 0 gesetzt wird (mein Server unterstützt noch kein IPv6, also behandle ich erst einmal nur IPv4-Adressen – wer IPv6 unterstützt, der sollte den Code anpassen und einen deutlich größeren Teil der Adresse auf 0 setzen):

<?php

if (isset($_SERVER["REMOTE_ADDR"]))
{
    $ip = $_SERVER["REMOTE_ADDR"];
    $_SERVER["ORIGINAL_REMOTE_ADDR"] = $ip;
    $octets = explode(".", $ip);
    if (count($octets) == 4)
    {
        $octets[3] = "0";
        $_SERVER["REMOTE_ADDR"] = implode(".", $octets);
    }
}

?>

Auf diese Weise muss man die PHP-Anwendung nicht anpassen. Sie bekommt von vornherein nur eine gekürzte IP-Adresse zu Gesicht, die dann nicht mehr personenbezogen ist. Man muss also nicht mühsam alle Stellen suchen, an denen die Anwendung die IP-Adresse benutzt. Den Trick mit dem Kürzen der IP-Adresse benutzt übrigens auch Google Analytics, um die Datenschützer zufriedenzustellen. Probleme mit den PHP-Anwendungen sind dabei eigentlich nicht zu erwarten, denn die gekürzten IP-Adressen sind immer noch gültig, und es ist sowieso nicht unüblich, dass mehrere Besucher unter derselben IP-Adresse unterwegs sind (Universitäten, Firmen, …). Und falls man in gewissen Fällen doch mal die komplette IP-Adresse benötigt, dann kann man immer noch über $_SERVER["ORIGINAL_REMOTE_ADDR"] auf sie zugreifen.

Doch was ist mit den Server-Logdateien? In der Standardkonfiguration loggen Webserver wie Apache jede Anfrage in einer Logdatei. Das sieht dann beispielsweise so aus:

89.245.114.71 - - [27/Apr/2018:16:49:53 +0200] "GET /impressum-datenschutz/ HTTP/1.1" 200 10408 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"

Auch hier wird die IP-Adresse gespeichert (im Beispiel meine eigene, also darf ich das), und das ist möglicherweise problematisch. Hier gibt es mehrere Lösungen:

  • Die meisten Webserver (wenigstens Apache und nginx) erlauben die Änderung des Logformats. Möchte man keine IP-Adressen loggen, dann ist das kein Problem – man lässt das entsprechende Feld einfach weg.
  • Möchte man nicht komplett auf IP-Adressen verzichten, sondern sie in gekürzter Form (so wie oben beschrieben) loggen, dann geht das auch – zumindest mit Apache. Man kann nämlich Piped Logs benutzen. Anstatt in eine Datei zu loggen, wird ein separater Prozess gestartet, der die Logzeilen über seine Standardeingabe erhält. Nun muss man nur ein kleines Tool schreiben, das Zeile für Zeile liest, die IP-Adressen kürzt und das Ergebnis in eine Logdatei schreibt.
  • Bei den Server-Logdateien stehen die Chancen gut, dass man sich auf ein berechtigtes Interesse berufen kann, um die IP-Adressen zumindest für eine begrenzte Zeit in ungekürzter Form zu speichern, denn sie bieten mehr oder weniger die einzige Möglichkeit, Angriffe nachvollziehen und gegen sie vorgehen zu können. Man könnte sich also ein kleines Programm schreiben, das über einen Cronjob jeden Tag über die Logdateien läuft und bei allen Einträgen, die älter sind als z. B. eine Woche, die IP-Adressen kürzt. In Verbindung mit Logrotation ist das besonders einfach.

Ich hoffe, dieser Artikel konnte bei dem einen oder anderen die DSGVO-Kopfschmerzen zumindest ein bisschen lindern.