IP-Adressen in Apache2 und Nginx anonymisieren
Die DSGVO wird am 25.05.2018 umgesetzt und nicht nur aus diesem Grund sollten wir die IP-Adressen unserer Webseitenbesucher schützen.
Aktueller Zustand der Logfiles (volle Länge):
1 2 | 173.173.123.123 - - [21/May/2018:10:41:49 +0200] ... 2001:0db8:85a3:08d3:1319:8a2e:0370:7347 - - [21/May/2018:10:41:50 +0200] ... |
Zustand nach der Anonymisierung IPv4 (16 Bit Länge) und IPv6 (32 Bit Länge):
1 2 | 173.173.0.0 - - [21/May/2018:10:41:49 +0200] ... 2001:2dd2:: - - [21/May/2018:10:41:50 +0200] ... |
Punkt 1: Vorwort zu mod_log_ipmask
Die performanteste Lösung ist ein in C geschriebenes Apache2 Modul zu verwenden. Hinzu kommt, dass das Modul direkt für den gesamten Apache2 vHost Bestand gilt.
Varianten in denen das CustomLog jedes vHosts durch ein Script „gepipet“ werden gibt es viele im Netz, diese waren mir persönlich aber zu mühselig.
Ich habe das originale mod_log_ipmask Github Repository geforked und die gepatchte IPv4 und IPv6 Version im adminforge Github hinterlegt.
Punkt 2: Herunterladen
Wir laden das Modul als root
herunter.
1 | wget https://raw.githubusercontent.com/adminforge/mod_log_ipmask/master/mod_log_ipmask.c |
In den Zeilen 43 und 44 bestimmen wir die Länge der IP-Adressen. Voreingestellt sind für IPv4 -> 16 Bit und IPv6 -> 32 Bit. Wie oben im Beispiel.
1 2 | 43 #define DEFAULT_FILTER_BITS_V4 16 44 #define DEFAULT_FILTER_BITS_V6 32 |
Punkt 3: Installieren
Um das Modul installieren zu können benötigen wir zuerst das apache2-dev
Paket. Unter Debian installieren wir es wie folgt.
1 | apt install apache2-dev |
Mit diesem Befehl wird das Modul kompiliert und gleich in den richtigen Ordner kopiert.
1 | apxs -i -a -c mod_log_ipmask.c |
Punkt 4: Apache2 neustarten und Logfiles prüfen
Wir starten den Webserver neu.
1 | systemctl restart apache2 |
Und überprüfen das Logfile. Dies sollte ab sofort nur noch gekürzte IPv4- und IPv6-Adressen protokollieren.
1 2 | 173.173.0.0 - - [21/May/2018:10:41:49 +0200] ... 2001:2dd2:: - - [21/May/2018:10:41:50 +0200] ... |
Punkt 1: Konfiguration anlegen
Wir erstellen eine neue Datei /etc/nginx/conf.d/anonymized.conf
und fügen unser IP-Mapping ein. Dies nimmt die oben beschriebene Kürzung für IPv4 -> 16 Bit und IPv6 -> 32 Bit vor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | map $remote_addr $ip_anonym1 { default 0.0.0; "~(?P<ip>(\d+)\.(\d+))\.(\d+)\.\d+" $ip; "~(?P<ip>[^:]+:[^:]+):" $ip; } map $remote_addr $ip_anonym2 { default .0.0; "~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0.0; "~(?P<ip>[^:]+:[^:]+):" ::; } map $ip_anonym1$ip_anonym2 $ip_anonymized { default 0.0.0.0; "~(?P<ip>.*)" $ip; } log_format anonymized '$ip_anonymized - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; |
Punkt 2: Nginx vHosts anpassen
In unseren gesamten vHosts können wir nun die access_log
Zeile auf anonymized
umstellen.
1 2 3 | [..] access_log /var/log/nginx/domain.de.access.log anonymized; [..] |
Punkt 3: Nginx neustarten und Logfiles prüfen
Wir starten den Webserver neu.
1 | systemctl restart nginx.service |
Und überprüfen das Logfile. Dies sollte ab sofort nur noch gekürzte IPv4- und IPv6-Adressen protokollieren.
1 2 | 173.173.0.0 - - [21/May/2018:10:41:49 +0200] ... 2001:2dd2:: - - [21/May/2018:10:41:50 +0200] ... |