Randomizer (Randomisierer)
Zum
Randomisieren, beispielsweise für randomisierte Studien, z. B. zur Bandbreitennutzung im
Internet, zum Test von Logfile-Analysatoren und für Honypots habe ich das C-Programm
randomize gemacht:
randomize.c
Es ist speziell für IPv4-Nummern ("IP-Adressen") in beliebigen Text-Dateien gemacht. Beispielsweise
für Log-Dateien vom Apache Webserver, dem Linux-Kernel und vom Proxy Squid.
Man kann es auch ändern oder erweitern für MAC-Adressen und andere Nummern.
Es funktioniert unter Linux und sollte auch unter BSD und anderen
unixoiden Betriebssystemen problemlos laufen.
Unter MS-Win sollte es mit Cygwin problemlos laufen.
Die Projekt-Seite dazu ist hier:
https://sourceforge.net/projects/randomize
randomize ist entwickelt im Sinn der Unix-Philosophie, das Computerprogramme
nur eine Aufgabe aber dafür gut erledigen sollten: Es verändert weder
die letzte Zugriffszeit noch die letzte Änderungszeit der bearbeiteten Datei
und auch die Größe und die inode bleiben ungeändert.
Es werden nur die ursprünglichen IP-Nummern mit anderen zufälligen und
gleich langen überschrieben und deshalb sind die ursprünglichen auch mit undelete-Tools nicht zu
rekonstruieren; eine Derandomisierung ist anschließend generell nicht möglich.
Da ich in Bayern lebe, steht randomize selbstverständlich unter einer
Beerware License, die im Header steht ;-)
randomize bewirkt keine 100 %-ige Anonymisierung (d. h. keine vollständige
Randomisierung): Die Länge der IP-Nr. bleibt unverändert, so wie auch der
IP-Adress-Block (d. h. 10.*.*.*, 192.168.*.*, usw.) und auch andere Daten wie
Datum/Zeit (sonst wären die randomisierten Dateien auch sinnlos).
Allerdings ist die Randomisierung für Unbefungte nicht leicht erkennbar und
die IP-Adress-Blöcke sind groß.
Der Hauptzweck ist ja, das mit randomize Logfiles ohne Datenschutz-Bedenken
gespeichert werden können, ohne das die darin gespeicherten IP-Nummern
leicht mißbraucht werden können.
Neben dem Randomisieren eignet randomize sich auch zum
(nicht ganz 100 %-igen) Anonymisieren von User-Daten.
Benötigt wird dies beispielsweise bei Web-Servern, deren Logfiles
IP-Nummern enthalten und die nicht sofort gelöscht werden, denn
in Deutschland dürfen personenbezogene Daten, die im Zusammenhang mit der
Nutzung eines Internetportals übertragen wurden, nicht über das
Ende des jeweiligen Nutzungsvorgangs hinaus gespeichert werden:
http://www.golem.de/0710/55076.html.
Es drohen sogar Haft oder Ordnungsgeld beim Speichern von unveränderten
IP-Adressen:
http://www.theinquirer.de/2008/02/13/iplogging_amtsgericht_droht_zypries_mit_250000_oder_haft.html.
Neben dem oben beschriebenen Randomisieren durch Überschreiben gibt es auch das
Randomisieren durch Vertauschen.
Beispielsweise gibt es diverse Programme wie
Randomize Lines, die die Zeilen von Dateien vertauschen,
indem sie eine Datei zeilenweise einlesen, die Zeilennummern vertauschen und
die Zeilen in der (vertauschten) neuen Reihenfolge ausgeben.
Es gibt ähnlich Software wie randomize zum unvollständigen und leicht
erkennbaren Anonymisieren, die bei der Datei die Zeitstempel und die
Dateigröße ändert, sowie die
letzten beiden Bytes der IP-Nummer deutlich erkennbar löscht, indem sie auf
0 gesetzt werden:
http://schnipsel.dianacht.de/wp-content/anon.txt.
Die Seite dazu findet man hier:
http://schnipsel.dianacht.de/2007/01/30/pseudonymisierung/.
Zum Randomisieren von anderem als IPv4-Adressen gibt es entsprechend andere Programme,
beispielsweise
My DB Randomizer
zum Randomisieren von MySQL-Datenbanken.
Zum Randomisieren von lokalen Logfiles gibt es auch sysfog:
http://www.acm.uiuc.edu/sigmil/talks/syslog/syslog.html
Es eignet sich um auch in nicht-lokale Logfiles und ohne Root-Rechte fiktive Daten von beliebigen
(fiktiven) Prozessen in Logfiles zu schreiben.
Zum Randomisieren des Inhalts von Dateien, bei denen nur die CRC32-Prüfsumme und die Größe ungeändert benötigt wird, eignet sich
CRC Faker.
Für randomisierte Texte gibt es weitere Programme; beispielsweise
Echelon's Trigger Words Generator
für randomisierte Emails mit Stichwörtern von Echelon.
Und Hardware-Randomizer findet man in vielen ICs wie beispielsweise im
LTC2209.
Erwähnenswert sind auch
Randomize Lines
und
shuffle
die zeilenweise randomisieren, also Zeilen vertauschen.
Erwähnenswert sind auch
Address space layout randomization
und der GNU MAC Changer, zum Randomisieren von
MAC-Adressen:
http://www.alobbs.com/macchanger/
Es gibt MAC Changer auch für WLAN-Router:
http://www.hendlsofen.de/WRT54GL/eng/WRT54GL_macchanger.html
und sogar für MS-Windows:
MACSpoof
und
fmac.
Siehe auch
MAC-Adresse unter Linux/Windows ändern.
Mit MAC Changern erspart man sich die nicht gerade komfortable Verwendung von ifconfig
unter Linux bzw. ändern der HW Adresse (=MAC) bei den Netzwerkkarten-Eigenschaften unter
MS-Windows.
Zumindest unter Linux benötigt man kein zusätzliches Programm; es reicht
schon ein kurzes Skript wie z. B.:
#!/bin/sh
# MAC change script: first argument: network device (e. g. eth0)
# set -x for verbose mode
set -x
# store the default gateway; SuSE looses the gateway during a ifconfig down/up of the default device
DEFAULT_GW=$(route | grep default | awk '{ print $2}')
ifconfig $1 down
ifconfig $1 promisc
MAC=00:\
$(dd if=/dev/urandom bs=1 count=1 2>/dev/null | xxd | awk '{ print $2}'):\
$(dd if=/dev/urandom bs=1 count=1 2>/dev/null | xxd | awk '{ print $2}'):\
$(dd if=/dev/urandom bs=1 count=1 2>/dev/null | xxd | awk '{ print $2}'):\
$(dd if=/dev/urandom bs=1 count=1 2>/dev/null | xxd | awk '{ print $2}')
ifconfig $1 hw ether $MAC up
if [ -z "$(route | grep default | awk '{ print $2}')" ] ; then
route add default gw $DEFAULT_GW
fi
Im Prinzip kann man das auch in ein Boot-Skript eintragen, z. B.
in /etc/init.d/boot.local (SuSE) oder /etc/rc.local (Debian),
aber zumindest unter SuSE funktioniert es so nicht, weil die
Netzwerkkarten-Konfiguration unter SuSE über die MAC-Adressen UND die
PCI-Bus-Adressen gesteuert wird.
Unter Debian kann man es z. B. als
/etc/network/if-pre-up.d/macchanger.sh speichern; das
Device, z. B. eth0, wird dem Skript vom NetworkManager als
Parameter $IFACE übergeben; im obigen Skript ist also das $1 durch $IFACE zu
ersetzen. Alternativ kann man die Funktion pre-up in
/etc/network/interfaces verwenden.
Unter SuSE kann man es als
/etc/sysconfig/network/ip-up.d/macchanger.sh speichern; das Device wird dem
Skript dort als Parameter $1 übergeben.
Bei embedded-Geräten wie WLAN-Routern ist das Ändern der MAC-Adr. nicht so
leicht, denn beispielsweise bei hauptsächlich für WLAN-Router
bestimmten embedded Linux-Distribution
DD-WRT
hat man, ohne mehr oder minder aufwendiges und zusätzliches Installieren,
kein xdd, od, cksum, openssl, die Shell kennt die Variable $RANDOM nicht und
das Speichern von Dateien, die ein Reboot überstehen, ist nicht möglich
oder umständlich.
Aber auch für DD-WRT gibt es ein passendes Skript zum Randomisieren der
MAC-Adr., das man z. B. über das Web-Interface per Copy+Paste als
Start-Skript eintragen kann (basierend auf
http://www.dd-wrt.com/wiki/index.php/Useful_Scripts#Auto_Random_MAC_Address,
angepasst für Version v24):
#!/bin/sh
set -x
UT=$(sed "s#\..*##" /proc/uptime)
if [ $UT -gt 60 ] ;
then
echo "nothing to do"
else
MAC=`(date; cat /proc/interrupts) | md5sum | sed -r 's/^(.{10}).*$/\1/; s/([0-9a-f]{2})/\1:/g; s/:$//;'`
echo "00:${MAC}"
stopservice wan
ifconfig eth1 down
ifconfig eth1 promisc
ifconfig eth1 hw ether 00:${MAC}
nvram set il0macaddr=00:${MAC}
nvram set def_hwaddr=00:${MAC}
nvram set def_whwaddr=00:${MAC}
nvram set wl0_hwaddr=00:${MAC}
nvram set wan_hwaddr=00:${MAC}
ifconfig eth1 hw ether 00:${MAC}
nvram commit
startservice wan
nvram set wan_hwaddr=00:${MAC}
ifconfig eth1 hw ether 00:${MAC} up
fi
Statt sed kann man auch awk mit den awk-Funktionen srand() und rand() verwenden.
Die MAC-Adresse zu Randomisieren ist sinnvoll, denn a) ist die Netzwerkkarte
damit ein "bewegtes Ziel" und damit schwerer anzugreifen, b) besteht ohne
Randomisierung ein Mißbrauchspotential, z. B. durch Kopieren der
MAC-Adresse um so beispielsweise andere (falsche) Netzwerkverbindungen vortäuschen
und c) wird eine MAC-Adresse vom Hersteller nur einmal vergeben und enthält
auch den Hersteller, ist also so einzigartig
wie eine Seriennummer und enthält sogar noch mehr Informationen
die man aber nur im Garantie-/Gewährleistungsfall und auch nur
gegenüber dem Händler oder Hersteller benötigt.
Wie leicht eine MAC mißbraucht werden kann, ist beispielsweise im 2600
Magazine, Summer 2008, Page 6-7 nachzulesen.
Das gleiche Problem gibts es auch mit anderen Hardware-Adressen wie
beispielsweise der IMEI (International Mobile
Equipment Identity) eines Handys, für die es IMEI Changer gibt.
Daher ist es empfehlenswert zumindest alle außerhalb der eigenen Wohnung
sichtbaren Hardware-Adressen zu randomisieren, also beispielsweise alle MACs im WLAN und die
MACs der Netzwerkkarten, an der ein DSL-Modem verwendet wird, weil das
DSL-Modem auch die MAC zum Provider überträgt:
http://de.wikipedia.org/wiki/PPP_over_Ethernet#PPPoE_Discovery_.28PPPoED.29.
Logrotate
Man kann randomize auch mit Logrotate, mit dem die Logfiles unter Unix/Linux/BSD
... üblicherweise verwaltet werden, verwenden:
Beispielsweise kann man mit der Option daily die Logfile-Rotation täglich
durchführen, mit der Option notifempty nur nicht-leere Logfiles
bearbeiten, mit der Option delaycompress die zuletzt rotierte Version
unkomprimiert lassen und mit der Option postrotate das randomize darauf
anwenden.
Erst im nächsten Rotationszyklus wird das randomisierte Logfile dann
komprimiert.
Zum stündlichen randomisieren muß randomize stündlich aufgerufen werden,
beispielsweise mit folgender Zeile in /etc/crontab:
42 * * * * root nice -19 find /var/log -type f -size +6c -not \( -name "*.bz2" -o -name "*.zip" \) -exec randomize {} \;
Hierdurch werden nur die Logdateien behandelt, die mindestens 7 Byte enthalten
und nicht von logrotate schon komprimiert wurden.
Das Nicht-Komprimieren bei der ersten Rotation von logrotate ist dann aber trotzdem
noch erforderlich, weil sonst nicht sichergestellt ist, das die Logfiles
komplett randomisiert wurden und einige Programme, z. B. apcupsd, zumindest einige ihrer
Logfiles überschreibend erstellen und so die Randomisierung vom aktuellen
Logfile komplett wieder rückgängig machen. Allerdings erspart man sich mit dem
stündlichen Aufruf den Aufruf mittels postrotate.
Deshalb hier ein Beispiel für /etc/logrotate.conf:
# see "man logrotate" for details
# rotate log files daily
daily
# Don't rotate empty logfiles.
notifempty
# keep 365 backlogs
rotate 365
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
compress
# don't compress after first rotation
delaycompress
# uncomment these to switch compression to use gzip or another
# compression scheme
compresscmd /usr/bin/bzip2
uncompresscmd /usr/bin/bunzip2
# former versions had to have the compressext set accordingly
#compressext .bz2
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here
#/var/log/wtmp {
# monthly
# create 0664 root utmp
# rotate 1
#}
# system-specific logs may be also be configured here.
Public-Key-Verschlüsselung als Alternative
Um Datenmißbrauch vorzubeugen gibt es neben dem Randomisieren (und
Löschen bzw. nicht Erzeugen) noch die Public-Key-Verschlüsselung der
Logfiles: Zum
automatischen Verschlüsseln (d. h. ohne Passwort-Eingabe) wird nur der
public Key benötigt und danach
sind die Daten nur dem Besitzer vom private Key und der Passphrase
zugänglich.
Durch diese asymmetrische Kryptografie ist man sehr gut abgesichert gegen
einen Diebstahl des PC und auch Malware wie Trojaner hat nur während der
kurzen Zeit der Entschlüsselung der betreffenden Datei eine kleine Chance die Daten auszulesen.
Deshalb hier ein Beispiel (für Linux) zum automatisierten verschlüsselten
Loggen der dynamischen IP-Nr. (und was ifconfig sonst ausgibt),
also quasi stark verschlüsselte Vorratsdatenspeicherung, die nur für den
Besitzer vom private Key und der Passphrase lesbar ist:
#!/bin/bash
#
# Store the ip configuration after a new dynamic IP safe:
# encrypt the ifconfig output and move to a filename with the timestamp in the name.
#
# To log every ip change this script (iflogpg) should be put in the if-up directory,
# which is /etc/ppp/ip-up/ under SuSE and (maybe) /etc/network/if-up.d/ under Debian.
# uncomment the next three lines and the last for debugging
#{
#set -x
#echo $PATH > /tmp/uid.txt
KEY="A289A7FD"
#TMPFILE="/var/tmp/if.txt"
TMPFILE="/var/tmp/.$$.$RANDOM.if.txt"
LOGDIR="/root/log/if"
/bin/mkdir -p "${LOGDIR}"
/sbin/ifconfig > "${TMPFILE}"
# uncomment the next line for randomization
#randomize ${TMPFILE}
APPENDIX=`/usr/bin/stat --format='%y' "${TMPFILE}" | /usr/bin/cut -b 1-19`
/usr/bin/gpg --batch --no-tty --homedir "/root/.gnupg" --yes --always-trust --encrypt --bzip2-compress-level 9 -r "$KEY" "${TMPFILE}"
#/bin/mv "${TMPFILE}.gpg" "${LOGDIR}/text.gpg*${APPENDIX}"
/bin/mv "${TMPFILE}.gpg" "${LOGDIR}/text.gpg*${APPENDIX}.$$.$RANDOM."
# rmm "${TMPFILE}"
/usr/bin/shred -f -x --remove "${TMPFILE}"
#} 2>&1 | tee -a /tmp/logfile.txt
Und damit nicht jeder Zeitpunkt eines IP-Nummer-Wechsels erkennbar ist, kann
man zusätzliche Einträge zu zufälligen Zeitpunkten vornehmen,
z. B. mit einer Zeile in der /etc/crontab:
0 0 * * * root sleep $[ $[ $[ `expr \`date +%s\` + $RANDOM` ] + $RANDOM * 32768 ] % 86400 ]; /etc/ppp/ip-up/iflogpg
Anhang: Begriffsklärungen
Anonymisierung
Die Anonymisierung ist das Entfernen personenbezogener Daten um die
Identität einer Person geheim zu halten. Dadurch können die
Daten nicht mehr (sicher) einer Person zugeordnet werden.
Beispiele: Anonyme Geburt, Anonyme Bestattung.
Bei unvollständiger Anonymisierung ist die betreffende Person nicht
komnplett sondern nur faktisch oder formal anonym.
Pseudonymisierung
Die Pseudonymisierung ist das Verändern personenbezogener Daten durch eine
Zuordnungsvorschrift derart, dass die Einzelangaben über persönliche
oder sachliche Verhältnisse ohne Kenntnis oder Nutzung der
Zuordnungsvorschrift nicht mehr einer Person zugeordnet werden
können. Das Pseudonym wird deshalb auch als fingierter Name bezeichnet.
Die Zuordnungsfunktion ist umkehrbar eindeutig, aber sie kann eine
Einwegfunktion sein.
Beispiele: Vergabe eine Chiffre-Nummer für eine Chiffre-Anzeige in der
Tageszeitung, Verwenden eines Pseudonyms in einem Internet-Forum,
eindeutige Amts-Bezeichnungen wie z. B. "Bundeskanzler(in)".
Die triviale Pseudonymisierung ist die Identitätsfunktion, also die
identische Abbildung (d. h. Pseudonym = Realname).
Randomisierung
Randomisierung ist das zufällige (engl. random) Anordnen oder Auswählen.
Wie bei der Pseudonymisierung gibt es auch hier eine Zuordnungsfunktion, die
aber zufällig ist und daher weder eindeutig noch umkehrbar ist.
Beispiele: Skat-Karten mischen, die zufällige Zuteilung von Patienten zu
einer von n Behandlungs-Gruppen, Zahlen mit einem Würfel würfeln.
Der Unterschied besteht darin, das beim Anonymisieren die Zuordnung
ausgeschlossen ist, weil gar keine Zuordnungsdaten existieren, während beim
Pseudonymisieren eine eindeutig umkehrbare Zuordnungsfunktion vorhanden ist.
Das Randomisieren ist ein Mittelweg: Wie bei der Pseudonymisierung gibt es
noch Daten, aber durch die zufällige Zurordnung ist nachträglich eine
Zuordnung mehr oder minder unsicher (random); je nachdem wie stark die
Zuordungsfunktion randomisiert.
Beispiele: Nach dem Löschen der letzten beiden Bytes einer IPv4-Adresse
sind (i. Allg.) noch Provider und Herkunfts-Land erkennbar (deutlich unvollständige
Anonymsierung) und beim Ersetzen einer IPv4-Adresse durch eine gleich lange,
aber sonst völlig zufällige, ist noch deren Länge erkennbar (nicht
vollständige Randomisierung).