http://www.heise.de/newsticker/meldung/103440
http://www.golem.de/0802/57686.html
Vom Prinzip ist das ganze ja richtig, nur das ganze hätte man sich sparen können, gäbe es keine VDS. Leider protokolliert quasi jede Standard-Anwendung (Apache, Mediawiki, phpBB, punBB, Wordpress, ...) die IP-Adressen der Nutzer, weshalb man die nun eigentlich patchen müsste um sich rechtlich abzusichern. Einige Patches gibt es hier, jedoch filtern diese die IP komplett bzw. setzen sie auf 0.0.0.0
Um Angriffe nachzuvollziehen reicht das nicht, besser ist ein Hashwert der IP. Für mein Mediawiki habe ich einen Patch geschrieben und Apache leitet Logfiles durch ein Perl-Skript, welches die IP-Adressen ersetzt. Beide verwenden die ersten 4 Zeichen von MD5 als Hash. Mehr Zeichen dürfen es nicht sein, da sonst die Funktion umkehrbar wäre, was ja nicht möglich sein darf.
Ich veröffentliche den Kram hier da ich ja hier sicher nicht der einzige bin der hier ein MediaWiki bzw. einen Apache betreibt. Es ist ja nicht nötig das noch jemand ein paar Stunden damit vergeudet...insbesondere hatten schon ein paar Leute danach gefragt. Wir können derartige Patches ja hier sammeln.
MediaWiki 1.11.0
Dieser Patch ersetzt IP-Adressen überall durch Strings wie "guest-E462". Außerdem werden Benutzernamen die mit "guest-" beginnen verboten, damit es nicht zu Kollisionen kommt.
includes/ProxyTools.php
- Code: Alles auswählen
72,78c72
< //$ipchain = array( IP::canonicalize( $_SERVER['REMOTE_ADDR'] ) );
<
< // IP-hashing
< $iparray = array( IP::canonicalize( $_SERVER['REMOTE_ADDR'] ) );
< $hash = substr(md5($iparray[0]),0,4);
< $username = 'guest-'.strtoupper($hash);
< $ipchain = array($username);
---
> $ipchain = array( IP::canonicalize( $_SERVER['REMOTE_ADDR'] ) );
includes/User.php
- Code: Alles auswählen
459,463c459
< !in_array( $name, $wgReservedUsernames ) &&
<
< // username may not start with "guest-", because this
< // is used for IP-hashing
< substr_compare("guest-", $name, 0, 6, true) != 0;
---
> !in_array( $name, $wgReservedUsernames );
Apache 2
Apache besitzt bereits eine eingebaute Funktion um die Logfiles durch eigene Skript zu leiten. Das unten folgende Skript z.B. nach /usr/bin/iphash kopieren und dann in der Apache-Konfigdatei wie folgt einbinden:
- Code: Alles auswählen
ErrorLog "|/usr/bin/iphash /var/log/httpd/error_log"
IP-Adressen werden durch Hash-Werte ersetzt, z.B. "[IP-HASH-4e04]". Die IP 127.0.0.1 (localhost) wird nicht ersetzt, weitere Ausnahmen für IP-Adressen oder Hashwerte können definiert werden. Der Output-Buffer wird alle 15 Sekunden geleert.
(Habt Nachsicht...ist mein erstes Perl-Skript, thx@HE für die Geduld mit mir
- Code: Alles auswählen
#! /usr/bin/perl -w
# Replace IP addresses in Apache logfiles by MD5 hashes.
# Author: Martin Weusten
# -------------------------------------------
use Digest::MD5;
use IO::Handle;
# -------------------------------------------
# IP addresses that should not be replaced
$blocked_ip[0] = '127.0.0.1';
# hash values that should not be replaced
# (!!) if you want to use this, uncomment lines 70-75 below (!!)
# $blocked_hash[0] = '[IP-HASH-f528]'; # just example
# flush buffer every $flushtime seconds
$flushtime = 15;
# -------------------------------------------
# flush buffer on exit
$SIG{INT} = $SIG{TERM} =
sub {
close($OUT);
exit;
};
# flush buffer every $flushtime seconds
$SIG{ALRM} =
sub {
$OUT->flush();
alarm $flushtime;
};
alarm $flushtime;
# -------------------------------------------
open($OUT,'>>'.$ARGV[0]);
# scan STDIN for IP-Addresses
while (<STDIN>) {
s/(^|\s)((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))($|\s|])/HASH()/ge
} continue {
print $OUT $_;
}
close($OUT);
# -------------------------------------------
sub HASH {
# check if all numbers are between 0 and 255
if ($3>255 || $4>255 || $5>255 || $6>255) {
return $1.$2.$7
}
# check if this IP should not be replaced
$ip = $2;
foreach my $block (@blocked_ip) {
if ($ip eq $block) {
return $1.$2.$7
}
}
# compute hash
$hash = "[IP-HASH-".substr(Digest::MD5::md5_hex($ip), 0, 4)."]";
# # check if this hash should not be replaced
# foreach my $block (@blocked_hash) {
# if ($hash eq $block) {
# return $1.$2.$7
# }
# }
# ok, replace it
return $1.$hash.$7
}
