Apache logfiles IP anonymisieren

Heute möchte ich Euch ein Script vorstellen um IP Adressen in Apache logfiles zu anonymisieren. Ich habe es Mitte 2018 zur Einführung der DSGVO auf Kundenanfrage hin geschrieben, und es ist seitdem produktiv im Einsatz.

Name

Script name: anonymize_log_ip.sh
Author: Anton Daudrich
Company: ADMIN INTELLIGENCE GmbH
Version: v1.0
Release date: 2018-06-13 

Hilfe

*********************************
anonymize_log_ip
*********************************
 Script for anonymizing IPs in logfiles

 Usage: anonymize_log_ip.sh -f {logfile} -age {days} (-e {exclude})

 arguments:
  -f --file       {logfile}
                  (default: /var/log/apache2/*.log*)

  -age            {days} to keep IPs in logfiles
                  (default: 7)
                  Note: set to 0 to disable age check

 optional arguments:
  -e              {string} exclude one or more strings from search
                  Note: use -e before each string

  -h --help       shows this help message
  -V --version    prints version and release info
  --debug         verbose debug infos on console

***********************************************************************
Thank you for using this script!

Changelog

v1.0 2018-06-13 initial release

Paketabhängigkeiten / Voraussetzungen

gzip gunzip bc grep find sed 

Dokumentation

Arbeitsweise

  • Das Script sucht mit find die angegebenen logfiles, und checkt ihr Alter mit stat -c %Y
  • Falls die Logfiles komprimiert sind, entpackt das Script sie mit gunzip.
  • Mit sed werden alle IP-Adressen mit xxx.xxx.xxx ersetzt.
  • Falls das Logfile komprimiert war, wird es nachher wieder mit gzip komprimiert.
  • Dieses Script beeinflusst die Funktionalität von logrotate nicht, und wird zusätzlich dazu eingesetzt, z.B. als cronjob

Scriptausgabe wird protokolliert nach LOG="/tmp/${PROGNAME}.log"
Fehler werden protokolliert nach ERR_LOG="/tmp/${PROGNAME}.error.log" mit Timestamp timestamp_log=$(date "+%F %T")
(kann im Quellcode angepasst werden)

Kommandozeilenparameter

-f {filename}

logfile name (default: /var/log/apache2/*.log*)
Dieser Parameter wird an find übergeben, und benutzt dieselbe Syntax für Wildcards bzw regex. Siehe man find.

--age {number}

Alter in Tagen, nachdem die Logfiles anonymisiert werden. (default: 7)
Wert 0 benutzen, um den age-Check zu deaktivieren und alle Logfiles zu anonymisieren.

-e {exclude_string}

Einen bestimmten String (logfile name, folder, etc) von der Suche ausschließen.
Auche mehrere -e Parameter möglich.

Exit Codes

Nagios-kompatible exit codes: 0=OK;1=WARNING;2=CRITICAL;3=UNKNOWN
default exit code: 3=UNKNOWN

  • Bei erfolgreichem Durchlauf wird das Script immer mit exit_code=0 beendet, unabhängig davon ob Logfiles anonymisiert wurden oder nicht.
  • Falls das Script keine Logfiles mit den angegebenen Parametern findet, ist der exit_code=1
  • Wenn das Script vorzeitig beendet oder abgebrochen wird, oder interne Fehler entstehen, ist der default_exit_code=3

Perfdata

Dieses Script generiert keine Perfdaten.

Beispielausgabe

LOG="/tmp/anonymize_log_ip.log"
    
2018-06-13 16:18:26 START anonymize_log_ip.sh
2018-06-13 16:18:26 search for logfiles: /admin-box/tmp/*.log*
2018-06-13 16:18:26 anonymizing IPs in files older than 7 days:
2018-06-13 16:18:26 processed file: /admin-box/tmp/access.log.10.gz
2018-06-13 16:18:26 processed file: /admin-box/tmp/access.log.11.gz
2018-06-13 16:18:26 processed file: /admin-box/tmp/access.log.12.gz
2018-06-13 16:18:27 processed file: /admin-box/tmp/access.log.9.gz
2018-06-13 16:18:27 processed file: /admin-box/tmp/error.log.10.gz
2018-06-13 16:18:27 processed file: /admin-box/tmp/error.log.11.gz
2018-06-13 16:18:27 processed file: /admin-box/tmp/error.log.12.gz
2018-06-13 16:18:28 processed file: /admin-box/tmp/error.log.9.gz
2018-06-13 16:18:28 processed file: /admin-box/tmp/other_vhosts_access.log.10.gz
2018-06-13 16:18:28 processed file: /admin-box/tmp/other_vhosts_access.log.11.gz
2018-06-13 16:18:29 processed file: /admin-box/tmp/other_vhosts_access.log.12.gz
2018-06-13 16:18:31 processed file: /admin-box/tmp/other_vhosts_access.log.9.gz
2018-06-13 16:18:31 END anonymize_log_ip.sh with exit_code 0

Anwendungsbeispiele

Um DSGVO-Anforderungen zu erfüllen, hat uns ein Kunde gebeten dieses Script zu entwickeln. Man hätte es alternativ auch in der prerotate-Anweisung im logrotate lösen können, jedoch wollte der Kunde die rotation weiterhin auf daily belassen, aber erst nach 7 Tagen die IPs anonymisieren.

Download

#############################
### Copyright and License ###
#############################
#
# Copyright (C) 2018 Anton Daudrich
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program.
# If not, see http://www.gnu.org/licenses/.
#
#############################

Ähnliche Themen:

Wie Ihr einen Apache Webserver gegen 404 Angriffe absichern könnt, erfahrt Ihr in diesem Blogeintrag.

Anton Daudrich

IT Entwicklungsleiter bei ADMIN INTELLIGENCE GmbH
Icinga2 Consultant, Linux Professional
Anton Daudrich