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