Logs nachtraeglich anonymisieren unter Beibehaltung des Datums

4. April 2011


 

Das Problem: Webserver-Logfiles der letzten 6 Jahre mit IP-Adressen und ein schlechtes Gewissen. Die IP-Adressen müssen raus.
Weiterhin soll aber das Datum (mtime) der Logfiles erhalten bleiben, da andere Skripte davon abhängen. Und natürlich liegen die Logs gepackt (gzip) vor.

Im Folgenden das Skript um IP-Adressen in gzippten Dateien nachträglich unter Beibehaltung des Datums zu anonymisieren.

  • Timestamp merken im Format, welches touch akzeptiert.
  • Entpacken in ein temporäres Verzeichnis.
  • IP kürzen mit sed.
  • Timestamp wiederherstellen mit touch.
  • Packen und zurückschieben.

#!/bin/bash
# Anonymize Logfiles
# @author Frank Schubert
TMPDIR=/var/tmp/_anonymize
test -d $TMPDIR || mkdir $TMPDIR
# - file-timestamp merken (spaeter wiederherstellen)
# - entpacken in tempdir
# - anonymisieren
# - orig file timestamp wiederherstellen
# - packen und zurückschieben
# naechstes Element nach Umbruch, statt Leerzeichen
IFS=$'n'
for param in "$@"; do
# lese timestamp der aktuellen datei + merken
TIMESTAMP=$(date --reference=$param +"%Y%m%d%H%M.%S")
cp $param $TMPDIR
gunzip $TMPDIR/$(basename $param)
# dateiname der entpackten datei; ohne ".gz"
unzipped_filename=$TMPDIR/$(basename $param .gz)
if [ -e $unzipped_filename ]; then
# ip nullen
sed --in-place -e 's/([0-9]{1,3}.[0-9]{1,3}).[0-9]{1,3}.[0-9]{1,3}/1.0.0/g' $unzipped_filename
# timestamp wiederherstellen
touch -t $TIMESTAMP $unzipped_filename
gzip $unzipped_filename
mv ${unzipped_filename}.gz $param
fi
done

Nachtrag Um Logs, die gzippt in verschiedenen Ordnern liegen vom Skript bearbeiten zu lassen hilft *find*:

find . -name "*.gz" -print0 |xargs -n100 -0 ~/anonymize.sh