Bei Apache auf einem Ubuntu Server wird in der Standardeinstellung von jedem Besucher die vollständige IP Adresse in den Logfiles gespeichert und erst nach einem Jahr gelöscht.
Wenn man IP Adressen speichert befindet man sich nach wie vor in einer rechtlichen Grauzone (BGH bestätigt: Webserver-Logfiles nicht nach § 100 Abs. 1 TKG erlaubt) Aber schon aus Rücksicht vor der Privatsphäre der eigenen Besucher sollten deren IP Adressen nicht komplett gespeichert werden. Außerdem gilt wie immer: Je weniger sensible Daten man vorhält desto weniger können einem auch abhanden kommen.
Man kann nun die Logfiles komplett deaktivieren, die IP Adressen von Apache entfernen lassen oder mithilfe eines Skripts die IP Adressen zu anonymisieren. Apache selbst biete nur die Möglichkeit eine IP Adresse komplett durch Nullen zu ersetzen. Die Möglichkeit die Adresse nur zu anonymisieren indem ein Teil der IP Adresse durch Nullen ersetzt wird gibt es nicht.

Diese Möglichkeit bietet ein Skript der Swiss Privacy Foundation, welches hier heruntergeladen werden kann: Anonip ist ein Tool zur Anonymisierung von IP-Adressen in Logdateien

Im Gegensatz zu vielen anderen Methoden die ich im Internet gefunden habe, funktioniert diese Skript sowohl mit IPv4 als auch mit IPv6 Adressen.

Das Skript kann an beliebiger Stelle auf dem Webserver gespeichert werden. Anschließend muss nur in der Virtual Host Datei von Apache der Eintrag für die Logfiles angepasst werden, so dass alle Daten die in das Logfile geschriebene werden sollen vorher durch das Anonymisierungsskript gepiped werden.

Häufig findet sich in der Config des Virtual Hosts ein Eintrag wie:

CustomLog ${APACHE_LOG_DIR}/access.log combined

Das Skript bietet viele Konfigurationsmöglichkeiten, die auf der Homepage des Projekts nachzulesen sind.
Eine Möglichkeit wäre die oben erwähnten Zeile durch folgende zu ersetzen:

CustomLog "|/pfad/zum/anon-skript.py --ipv4mask 8 --ipv6mask 64 --output /var/log/apache2/techgrube.log" combined

Dadurch schreibt Apache nicht direkt in das Logfile, sondern die Daten werden zuerst an das Anonymisierungsskript weitergeleitet und erst nach der anonymisierung der IP-Adresse im Logfile gespeichert.
Hier wird bei einer IPv4 Adresse der letzte Block immer durch eine Null ersetzt, also 209.173.53.167 wird zu 209.173.53.0.
Eine IPv6 Adresse wie 2001:a650:e370:1497:12a3:d4b7:e1c9:9b67 wird zu 2001:a650:e370:1497::

Werden die Zeilen durch folgenden Eintrag ersetzt wird je ein weiterer Block anonymisiert:

CustomLog "|/pfad/zum/anon-skript.py --ipv4mask 16 --ipv6mask 80 --output /var/log/apache2/techgrub.log" combined

Aus 209.173.53.167 wird also 209.173.0.0. Eine IPv6 Adresse wie 2001:a650:e370:1497:12a3:d4b7:e1c9:9b67 wird zu 2001:a650:e370::

Wer der Ansicht ist auf das speichern der kompletten IP Adresse der Webseitenbesucher verzichten zu können findet mit diesem Skript eine bequeme Methode zum anonymisieren der Logfiles.

Das Skript bietet außerdem auch die Möglichkeit Logfiles nachträglich zu anonymisieren. So kann z.B. zur Nutzung von Fail2Ban zuerst die komplette IP Adresse gespeichert werden, dann aber einmal täglich oder z.B. vor einem Logrotate das Logfile anonymisiert werden mit

cat /pfad/zu/orig_log | /pfad/zu/anonip.py [OPTIONEN] --output /pfad/zu/log

Dieser Artikel ist lizensiert unter einer Creative Commons Namensnennung 4.0 International Lizenz.

9 Comments

  1. Bei IPv6 macht die Verwendung einer so kleinen Maske wie in dem Beispiel (–ipv6mask 64) wenig Sinn, da vom Provider normalerweise mindestens ein /64 zugewiesen wird. Damit ist dann zwar vielleicht nicht mehr erkennbar, welcher User eines DSL-Anschlusses auf die Webseite zugegriffen hat (wobei das meist sowieso wegen Verwendung der Privacy-Extension bei IPv6 unmöglich ist), aber doch, dass es sich um einen bestimmten Anschluss handelt. Ich würde tippen, –ipv6mask 80 sollte normalerweise ausreichen.

    • Niko

      Ja, das ist ein guter Einwand. Besonders weil die Zugriffe auf diesen Artikel (wahrscheinlich aus DSGVO-Gründen) gerade explodieren. In diesem Zusammenhang kann das relevant werden. Als ich den Artikel 2015 geschrieben habe, hat sich dafür noch keiner interessiert.

  2. Das DSGVO hat auch mich hier her geführt… 😉 Weil Fail2Ban erwähnt wird: Das speichert ja die IP-Adressen „temporär“ in iptables zum filtern. Wie sieht es rechtlich damit aus? Sind zwar potentielle Angreifer/Störenfriede, aber dennoch gilt wohl auch für die der Datenschutz…? :O

    • Niko

      Ich bin ja auch kein Anwalt und kann das nicht sicher beurteilen. Ich denke aber dass das temporäre speichern von IP-Adressen in einer Firewallregel problemlos mit einem berechtigten Interesse am sicheren Betrieb des Webservers rechtfertigen lässt. Wie immer wird man halt einen Hinweis in der Datenschutzerklärung brauchen. Wahrscheinlich ist aber auch hier das Logfile wieder problematischer, wo evtl. die IP-Adresse dauerhaft landet.

  3. Hallo,
    ich glaube der Code des zweiten Beispiels stimmt nicht, müsste es für das zweite anonymisierte Ergebnis nicht heißen: „[…] –ipv4mask 16 –ipv6mask 80 […]“?

    • Niko

      Ja, du hast absolut Recht. Habe es korrigiert, vielen Dank.

  4. Habe mal eine blöde Frage dazu:
    weshalb sieht man in den Screenshots im Netz unter „Apache Webserver Logfiles“ immer nur interne IP-Adressen?
    Wenn jemand auf einen Server zugreift, schlägt dieser doch mit einer öffentlichen IP auf…

    Besten Dank! 🙂

    Harald

    • Niko

      Bin mir nicht ganz sicher was du meinst. Meinst du die IP vom Localhost wie 127.0.0.1? Da fallen mir spontan zwei Möglichkeiten ein.
      1. Ein anderer lokaler Dienst (z.B. Munin) ruft Daten vom Webserver ab und hinterlässt tatsächlich die Localhost IP.
      2. Anstatt die IP-Adresse verkürzt zu speichern, wie in diesem Beitrag beschrieben, werden einfach alle IP-Adressen in den Logfiles durch 127.0.0.1 ersetzt.
      Oder sind private IP-Adressen wie 192.168.178.1 auf den Screenshots?
      Dann wird wahrscheinlich eine Testumgebung im eigenen Netzwerk genutzt und mit anderen Computern aus dem selben Netzwerk zugegriffen.
      Gruß
      Niko

  5. Habt ihr auch ein Beispiel für ein Regex?
    Unsere Errorlogs haben die IP nicht zu alleresert stehen, sondern in der 4. Spalte von Eckigen Klammern umfasst und mit Kommentar und Port versehen.
    Beispiel:
    [Mon Jul 18 17:54:15.281165 2022] [ssl:info] [pid 32202] [client 11.22.33.44:11388] Weiterer text…

    cat error.log | egrep -o ‚[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}‘
    Funktioniert und ich bekomme die IP’s zurück.

    anonip.py –input error.log -4 8 –regex [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} -d
    Liefert für jede Logzeile ein „DEBUG:__main__:Regex did not match!“ zurück.

    Auch ein einfassen in einfache oder doppelte Anführungszeichen hat nichts geholfen, genau so wenig wie ein r’\b…\b‘.
    Mir fehlt hier die Syntax, was der –regex eigentlich erwartet.

    Hat hier jemand eine Idee?