Wie beschrieben, die IP der Benutzer nicht zu loggen finde ich sinnvoll. Es gibt da zwei Möglichkeiten: Entweder die IP wird einfach gar nicht geloggt, oder man entfernt die letzte Nummer, sodass die IP nicht mehr einer Person zugeordnet werden kann. In beiden Fällen hast du als Seitenbetreiber deine Pflicht getan.
Apache
Bei Apache würde ich die IP ganz aus dem Access-Log entfernen. Dafür muss nur das Format der Logeinträge angepasst werden. Editiere dafür die /etc/apache2/apache2.conf und entferne das %h
aus den Logformats-Zeilen:
LogFormat "%v:%p %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%l %u %t \"%r\" %>s %O" common
Nginx
Nginx ist mächtig, aber viele Dinge finde ich komplizierter und schlechter dokumentiert als beim altehrwürdigen Apache. Diese Änderung war glücklicherweise nicht ganz so kompliziert. Editiert wird die /etc/nginx/nginx.conf. Dort ist ein http-Abschnitt, in dem die Logdatei gesetzt ist:
access_log /var/log/nginx/access.log
Dies ändern wir zu:
log_format combinednoip '$remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log combinednoip;
Wir erstellen also erst ein neues Logformat, in dem die Variable $remote_addr
fehlt, und weisen dann die Logdatei an das neue Format zu verwenden.
In Zukunft könnte ipscrub eine schönere Variante sein. Das Modul hasht die IP mit regelmäßig wechselnden Salts. Aber da nicht erklärt wird wie die Installation funktioniert und es noch nicht in den Quellen ist, war dieses Modul für mich noch keine Option.
Serendipity
Für Serendipity gibt es ein Plugin, das die IP anonymisiert. Es ist das hier schon erwähnte Datenschutzplugin. Einfach im Backend installieren, dann in der Konfiguration die Option aktivieren.
Ruby/Sinatra
Sinatra loggt nicht selbst. Aber Sinatra setzt auf rack auf, und rack loggt fröhlich mit IP-Adresse nach stdout und stderr. In meinem Fall ist diese Ausgabe mein Log, da sie von supervisord in eine Logdatei gespeichert wird. Aber rack ist lustig: Dieses Abfrage-Log (request log) ist nicht konfigurierbar. Eine Klasse namens CommonLogger kümmert sich darum und hat das Format der Logzeile als Konstante hartgecodet. Also müssen wir hier Monkeypatchen: Wir überschreiben zur Laufzeit des Programms was die Funktion log
macht. Ich packte dafür in die config.ru:
module Rack class CommonLogger def log(env, status, header, began_at) # make rack stop spitting out client ips length = extract_content_length(header) anonIp = env["REMOTE_ADDR"]&.gsub(/\.\d*$|[\da-f]*:[\da-f]*$/, '.000') anonForwardIp = env["HTTP_X_FORWARDED_FOR"]&.gsub(/\.\d*$|[\da-f]*:[\da-f]*$/, '.000') msg = FORMAT % [ anonForwardIp || anonIp || "-", anonIp || "-", Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"), env[REQUEST_METHOD], env[PATH_INFO], env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", env[HTTP_VERSION], status.to_s[0..3], length, 0] logger = @logger || env[RACK_ERRORS] if logger.respond_to?(:write) logger.write(msg) else logger << msg end end end end
Der Code verliert auch den letzten Abschnitt, weil das Substrahieren der Timestamps nicht funktionierte. Für mich ist das kein Verlust. Wichtig ist, wie anonIp
und anonForwardIp
gesetzt werden. Der dabei verwendete Regex-Ausdruck funktioniert mit ipv4 und ipv6 und stammt von stackoverflow.
So konfiguriert ist bei diesen Webprogrammen die IP aus dem Access-Log verbannt. Damit ist eine der wenigen sinnvollen Forderungen unserer wahnsinnig gewordenen Datenschützerterroristen umgesetzt.
Netz - Rettung - Recht am : Wellenreiten 05/2018
Vorschau anzeigen