{"id":1647,"date":"2016-11-08T12:10:26","date_gmt":"2016-11-08T11:10:26","guid":{"rendered":"http:\/\/www.daniel-ritter.de\/blog\/?p=1647"},"modified":"2024-05-13T01:10:22","modified_gmt":"2024-05-12T23:10:22","slug":"ip-adressen-in-apache-logfiles-anonymisieren-mit-pipedlogs","status":"publish","type":"post","link":"https:\/\/www.daniel-ritter.de\/blog\/ip-adressen-in-apache-logfiles-anonymisieren-mit-pipedlogs\/","title":{"rendered":"IP-Adressen in Apache Logfiles anonymisieren mit PipedLogs"},"content":{"rendered":"<p>Ich hatte gestern eine Aufgabe, f\u00fcr die ich zun\u00e4chst keine einfache L\u00f6sung gesehen habe: Ich wollte in den Apache-Logfiles die IP-Adressen anonymisieren. Also aus den geloggten IP-Adressen Teile entfernen um noch ein rudiment\u00e4res Logging der einzelnen Besucher zu haben, aber nicht mehr ihre kompletten IPs mitzuschreiben.<\/p>\n<p>So sollte aus einer 212.122.113.145 eine ***.***.*13.145 werden.<br \/>\nDies sollte &#8211; um m\u00f6glichst grosse Sicherheit zu garantieren &#8211; nicht nachtr\u00e4glich geschehen, sondern live im Logvorgang des Apache.<br \/>\nEs sollten also niemals die kompletten IPs auf der Platte landen<\/p>\n<p>Nach etwas Recherche bin ich auf eine mir bis dahin unbekannte Apache-Funktionalit\u00e4t gestossen: PipedLogs.<\/p>\n<p>PipedLogs erm\u00f6glichen es in der Apachekonfiguration f\u00fcr einen VirtualHost nicht einen Logfile anzugeben sondern ein Skript festzulegen, das bei jedem Logvorgang gestartet wird und als Standardeingabe die Logzeile vom Apache erh\u00e4lt.<\/p>\n<p>In der Config vom entsprechenden VirtualHost sieht das Ganze so aus:<\/p>\n<pre>\r\nLogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common\r\nCustomLog \"|\/root\/scripts\/anonymize_apache\" common\r\n<\/pre>\n<p>Jeder Logentry wird somit durchgereicht an das Script \/root\/scripts\/anonymize_apache<\/p>\n<p>Der Rest ist nur noch eine Kleinigkeit mit der BASH:<\/p>\n<pre>\r\n#!\/bin\/bash\r\n\r\n#\/root\/scripts\/anonymize_apache\r\n\r\n# Von Standardeingabe lesen\r\nread logline\r\n\r\n# Mit sed die gew\u00fcnschten Teile der IP wegschnippseln\r\nanon=$(echo $logline | sed -r 's\/^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]\/***.***.*\/g'  )\r\n\r\n# Das Ergebnis anonymisiert ins Logfile zur\u00fcckschreiben \r\necho $anon  >> \/var\/log\/apache2\/myvirtualhost.anon.log\r\n\r\n<\/pre>\n<p>Edit: Habe nach dem Verfassen des Artikels ein Skript gefunden, das mehr Funktionalit\u00e4t bietet als mein Dreizeiler:<br \/>\n<A HREF=\"https:\/\/www.privacyfoundation.ch\/de\/service\/anonip.html\">https:\/\/www.privacyfoundation.ch\/de\/service\/anonip.html<\/A><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich hatte gestern eine Aufgabe, f\u00fcr die ich zun\u00e4chst keine einfache L\u00f6sung gesehen habe: Ich wollte in den Apache-Logfiles die IP-Adressen anonymisieren. Also aus den geloggten IP-Adressen Teile entfernen um noch ein rudiment\u00e4res 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[227],"tags":[],"class_list":["post-1647","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/comments?post=1647"}],"version-history":[{"count":4,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1647\/revisions"}],"predecessor-version":[{"id":1651,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1647\/revisions\/1651"}],"wp:attachment":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/media?parent=1647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/categories?post=1647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/tags?post=1647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}