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 (d. h. Orthogonalität): Es verändert weder die Erzeugungszeit, die letzte Zugriffszeit noch die letzte Änderungszeit der bearbeiteten Datei und auch die Größe sowie die Inode bleiben ungeändert!
Wer will, kann man diese Metadaten ändern mit Tools wie touch und cp.
Vom Programm 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 praktisch unmöglich.
Das randomize ist daher u. U. eine Alternative zu Log-Cleanern, zum Bereinigen von Log-Dateien.

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 in einer Datei vertauschen.
Gleiches bewirkt unsort, das es sowohl als
Debian-Paket als auch für MacOS X gibt.
Siehe auch Bash FAQ http://wooledge.org:8000/BashFAQ/026.

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 auch 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 sowohl für LAN wie auch für WLAN 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 (if necessary); SuSE looses the gateway
# during a ifconfig down/up of the default device
DEFAULT_GW=$(route | grep default | awk '{ print $2}')
ran=$(head /dev/urandom | md5sum)
MAC=00:0$[$RANDOM%6]:${ran:0:2}:${ran:3:2}:${ran:5:2}:${ran:7:2}
ifconfig $1 down
ifconfig $1 promisc
ifconfig $1 hw ether $MAC
ifconfig $1 up
if [ -z "$(route | grep default | awk '{ print $2}')" ] ; then
    route add default gw $DEFAULT_GW
fi

Hierbei ist das zweite Byte (von links) auf maximal 5 beschränkt, denn die drei ersten Bytes sind der Organizationally Unique Identifier (abgek. OUI), zu der man die offizielle Liste unter http://anonsvn.wireshark.org/wireshark/trunk/manuf findet. Mit der Limitierung auf maximal 5 ist sichergestellt das immer eine offizielle OUI verwendet wird und die Randomisierung praktisch nicht erkennbar ist. Zudem hat man hiermit fast immer eine andere OUI als die der WLAN-Karte sichergestellt, weil die aktuellen WLAN-Karten fast immer höhere Bytes verwenden; beispielsweise 0x0C für Ralink.

Mit dem GNU MAC Changer geht die MAC-Randomisierung einfacher und daher kürzer:

ifconfig wlan0 down
macchanger -r wlan0
ifconfig wlan0 up

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 einfach nicht, weil die Netzwerkkarten-Konfiguration unter SuSE über die MAC-Adressen UND die PCI-Bus-Adressen gesteuert wird. Unter SuSE muss zumindest das betreffende Skript nebenläufig (z. B. durch starten mit angehängtem "&") und einer Verzögerung eingebaut werden, damit es nach dem Enden der Boot-Skripte startet.
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" -o -name "*.gz" \) -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 Datendiebstahl auch wenn der PC komplett gestohlen wird.
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
#
# iflogpg: 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/ppp/ip-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/.$$.$RANDOM.if.txt"

LOGDIR="/root/log/if"

/bin/mkdir -p "${LOGDIR}"

/sbin/ifconfig > "${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}.$$.$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

Man kann auf die Option --always-trust im Skript verzichten, indem man stattdessen den konkreten Key das Vertrauens auch als vertrauenswürdig setzt:

> gpg --edit-key A289A7FD
gpg> trust
gpg> 5
gpg> j
gpg> q

Vorher ist der Key natürlich zu Installieren/Importieren, z. B. von einem Key-Server über
gpg --search-keys <Name>
und über das damit aufgerufene Menü, oder durch Einlesen des Keys über
gpg --import <key.1>



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.
Und moderne Beispiele sind
anonyme Bewerbungen mit anonymem Lebenslauf sowie die anonyme Entlassung, z. B. mit den Worten "Ich weiss zwar nicht, wer Sie sind und was Sie gemacht haben, aber gefeuert sind Sie trotzdem" im Film Up in the Air.
Bei unvollständiger Anonymisierung ist die betreffende Person nicht komplett sondern nur faktisch oder formal anonym.
Die Anonymisierung ist für einige Gesellschafts-Gruppen sogar vorgeschrieben.
Beispiele sind das Kopftuch , die Niqab und die Burka aber auch Uniformen ohne Namensschild anonymisieren.
Es gibt auch Organisationen, die Anonymisierung vorschreiben, beispielsweise Geheimdienste.
Ein Recht auf Anonymität findet sich in vielen Gesetzen: Das Allgemeine Persönlichkeitsrecht beinhaltet unter anderem ein Recht auf Anonymität und dieses Recht ist disponibel, d. h. jeder kann selbst darüber entscheiden, ob er seinen Klarnamen nennen möchte oder nicht. Dies gilt auch für das Grundrecht auf informationelle Selbstbestimmung, und weitere Fundstellen sind das Teledienstedatenschutzgesetz (§6) und ähnliche andere: http://www.heise.de/newsticker/foren/S-Zur-Rechtslage-laut-Hamburger-Datenschutzbeauftragtem-bereits-2002/forum-203597/msg-20396876/read/. Ebenso finden sich in vielen ganz anderen Gestzen ähnliche Vorschriften wie beispielsweise in der StPO die Zeugenschutzvorschriften.
Allerdings kann man Anonymität auch übertreiben, wie dieses Beispiel zeigt: http://www.heise.de/newsticker/foren/S-Gedaechtnisprotokoll-einer-Sitzung-der-anonymen-Arbeitnehmer/forum-183771/msg-18939016/read/.

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 eindeutig, meist 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) und Papst, Verwandten-Bezeichnungen wie Mutter und Vater.
Die triviale Pseudonymisierung ist die Identitätsfunktion, also die identische Abbildung (d. h. Pseudonym = Realname).
Die (eindeutige) Umkehrbarkeit ist hier allerdings nicht im mathematischen Sinn (Injektivität bzw. Bijektivität) gemeint, denn die Zuordnungsvorschrift bezieht sich meist nicht auf einen konkreten Menschen, sondern nur dessen Namen, den es tausend-oder Millionenfach geben kann, oder anderem nicht Eindeutigen. Selbst wenn die Zuordnung genauer ist, z. B. durch Fotos, genetischen Fingerabdruck etc., ist sie u. A. durch eineiige Mehrlinge nur relativ eindeutig, also nicht im mathematischen Sinn eindeutig.

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 nicht umkehrbar und generell auch nicht eindeutig ist. Durch den Zufall ist die Zuordnung vorher nicht bekannt, nachher nicht rekonstruierbar und ein Wiederholen liefert fast immer andere Ergebnisse.
Beispiele: Skat-Karten mischen, die zufällige Zuteilung von m Patienten zu einer von n Behandlungs-Gruppen durch Werfen von Würfeln oder Münzen.
Der Unterschied zur Anonymisierung besteht darin, das beim Anonymisieren die Zuordnung ausgeschlossen ist, weil gar keine Zuordnungsdaten existieren, während beim Pseudonymisieren eine meist umkehrbare Zuordnungsfunktion vorhanden ist. Das Randomisieren ist ein Mittelweg: Wie bei der Pseudonymisierung gibt es noch Daten, aber durch die zufällige Zurordnung oder Auswahl ist nachträglich eine Zuordnung zufällig (engl. random) und deshalb mehr oder minder unsicher, je nachdem wie stark die Zuordungsfunktion randomisiert.
Beispiele: Nach dem Löschen der letzten beiden Bytes einer IPv4-Adresse sind generell noch Provider und Herkunfts-Land erkennbar (unvollständige Anonymsierung) und beim Ersetzen einer IPv4-Adresse durch eine gleich lange, aber sonst zufällige, ist noch deren Länge erkennbar (nicht ganz vollständige Randomisierung).
Randomisierung kann auch ein zufälliges Belegen bedeuten. Dies ist beispielsweise beim Randomisieren von Festplatten nach dem Encrypted Root Filesystem Howto der Fall und auch beim oben beschriebenen randomize.c, wo jeweils vorhandene Werte durch zufällige überschrieben werden. Hierbei wird aus der Menge der möglichen Zahlen jeweils eine von einem Zufallszahlengenerator ausgewählt und diese Zufallszahl geschrieben.
Das zufällig bedeutet beim Randomisieren meist echt zufällig, also weder vorhersagbar noch berechenbar. Es kann aber auch pseudo-zufällig sein, ist in dem Fall aber zumindest nicht rekonstruierbar, weil es sonst nur eine Pseudonymisierung wäre.

Sitemap