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).