[Froxlor] Webserver Logs anonymisieren

Froxlor ist eine in PHP geschriebene und unter der GPL veröffentlichte Servermanagementanwendung, die das Betreiben von Hostingservern vereinfacht. Einmal eingerichtet lassen sich Hostings (vordergründig Webhosting und Mailhosting, Details s. auf der Homepage von Froxlor) bequem per Webinterface anlegen und verwalten.

Was die Wahl des Serverbetriebssystems angeht, hat man die Wahl zwischen diversen Linuxdistributionen. Am besten unterstützt werden Debian und seine Derivate. Aber auch Centos und Arch Linux stehen zur Auswahl. Außerdem hat man die Wahl, welche Serversoftware eingesetzt werden soll. Beim Webserver beispielsweise zwischen Apache, nginx und Lighttpd.

Logs anonymisieren

Wie man die Logs anonymisieren kann hängt von der eingesetzten Webserversoftware ab. Ich möchte hier die Möglichkeiten bei Einsatz des Apache und des nginx erklären.

Apache

Beim Apache ist es relativ simpel. Der Server unterstützt von Haus aus das Umleiten des Logfiles an ein Script. Diese Eigenschaft macht man sich zunutze, um die IP Adressen der Besucher zu anonymisieren. Entsprechende Scripte gibt es im Internet, ich bediene mich des Pythonscripts Anonip. Dieses Script speichert man z.B. unter /opt/anonip.py ab. Anschließend teilt man Froxlor mit, dass es die Logdateien an Anonip weiterleiten soll. Diese Einstellung findet man unter Einstellungen -> Webserver Einstellungen. Dort das Häkchen für die Umleitung setzen und im Feld darüber den Pfad zu Anonip und die Parameter mitgeben (s. Screenshot)

Anonymisierungseinstellungen für Apache

Bei den Parametern aus dem Beispiel werden bei IPv4 Adressen die letzten 8 Bits (=das vierte Oktett) und bei IPv6 die letzten 64 Bits maskiert. Der Output Parameter sorgt dafür, dass die Logs auch am in Froxlor definierten Ort gespeichert werden. Das führt zu folgenden beispielhaften Ergebnissen:

192.0.2.123 wird zu 192.0.2.0
2001:0db8:aaaa:bbbb::1234:5678 wird zu 2001:0db8:aaaa:bbbb::

nginx

nginx unterstützt das Umleiten der Logs an ein Script nicht, das Häkchen ist bei Auswahl von nginx nicht verfügbar. Allerdings bietet Froxlor die Möglichkeit, das Log-Format direkt anzugeben. Um nginx das Anonymisieren beizubringen, braucht man auch hier ein bisschen Programmierlogik. Folgendes Script muss unter /etc/nginx/conf.d/anonymize-log.conf abgelegt werden. Der Dateiname ist übrigens frei wählbar, muss aber mit .conf enden, da nginx standardmäßig alle *.conf Dateien im Verzeichnis /etc/nginx/conf.d/ beim Starten einbindet.

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;
    "~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
    "~(?P<ip>[^:]+:[^:]+):" ::;
}

map $ip_anonym1$ip_anonym2 $ip_anonymized {
    default 0.0.0.0;
    "~(?P<ip>.*)" $ip;
}

Dieses Skript stammt von blag.nullteilerfrei.de. Lediglich die letzten drei Zeilen wurden entfernt, da man das definieren des Logformats Froxlor überlässt.

Unter Einstellungen => Webserver Einstellungen ist das Access Log Format folgendermaßen anzugeben:

Anonymisierungseinstellungen für nginx

$ip_anonymized - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\"

Dadurch wird das originale Logformat von nginx beibehalten, die IPs jedoch verschleiert. Wichtig ist, dass die doppelten Anführungszeichen mit einem Backslash escaped werden, da Froxlor das Format selbst in Anführungszeichen setzt. Ohne die Escapezeichen würde nginx meckern. Im Gegensatz zum Apache-Beispiel verschleiert diese Version bei IPv6 Adressen die letzten 96 Bits. Möchte man das ändern, muss die .conf-Datei nach den eigenen Wünschen angepasst werden.

Aus 2001:0db8:aaaa:bbbb::1234:5678 wird hier 2001:0db8:. IPv4 Adressen werden wie oben im letzten Oktett verschleiert.