Ich hatte gestern eine Aufgabe, für die ich zunächst keine einfache Lösung gesehen habe: Ich wollte in den Apache-Logfiles die IP-Adressen anonymisieren. Also aus den geloggten IP-Adressen Teile entfernen um noch ein rudimentäres Logging der einzelnen Besucher zu haben, aber nicht mehr ihre kompletten IPs mitzuschreiben.
So sollte aus einer 212.122.113.145 eine ***.***.*13.145 werden.
Dies sollte – um möglichst grosse Sicherheit zu garantieren – nicht nachträglich geschehen, sondern live im Logvorgang des Apache.
Es sollten also niemals die kompletten IPs auf der Platte landen
Nach etwas Recherche bin ich auf eine mir bis dahin unbekannte Apache-Funktionalität gestossen: PipedLogs.
PipedLogs ermöglichen es in der Apachekonfiguration für einen VirtualHost nicht einen Logfile anzugeben sondern ein Skript festzulegen, das bei jedem Logvorgang gestartet wird und als Standardeingabe die Logzeile vom Apache erhält.
In der Config vom entsprechenden VirtualHost sieht das Ganze so aus:
LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog "|/root/scripts/anonymize_apache" common
Jeder Logentry wird somit durchgereicht an das Script /root/scripts/anonymize_apache
Der Rest ist nur noch eine Kleinigkeit mit der BASH:
#!/bin/bash #/root/scripts/anonymize_apache # Von Standardeingabe lesen read logline # Mit sed die gewünschten Teile der IP wegschnippseln anon=$(echo $logline | sed -r 's/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]/***.***.*/g' ) # Das Ergebnis anonymisiert ins Logfile zurückschreiben echo $anon >> /var/log/apache2/myvirtualhost.anon.log
Edit: Habe nach dem Verfassen des Artikels ein Skript gefunden, das mehr Funktionalität bietet als mein Dreizeiler:
https://www.privacyfoundation.ch/de/service/anonip.html