X-Trace

Die IP-Adresse des Posters befindet sich auch im X-Trace. Es kam der Wunsch auf diese unkenntlich zu machen. Auf der anderen Seite sollte im Zweifelsfall schon die Ursprungsadresse nachzuvollziehen sein.

Als Kompromiss zwischen einer wirklichen Verschlüsselung und einer Unkenntlichmachung kann man einfach die Zahlen ersetzen.

/!\ Es sollte angemerkt werden, dass das Auslesen der IP aus dem Header kein großes Problem für jeden darstellt, der sich minimal mit Kryptografie auskennt.

Dies geschieht in der filter_nnrp.pl in der Sektion "sub filter_post" in bin/filter.

Zuerst sollte man sich eine Sicherheitskopie anlegen und natürlich als Benutzer news arbeiten, damit die Rechte nicht verloren gehen.

cd /usr/lib/news/bin/filter
cp filter_nnrp.pl filter_nnrp.pl.org
vi filter_nnrp.pl

Je nach System kann die filter_nnrp.pl unterschiedlich sein. Es sollte sich aber irgendwo in dem Perlscript eine Zeile

sub filter_post {

finden lassen.

Wenn nicht, dann muss man die Subfunktion anlegen. Ansonsten muss man sie anlegen. Bei einer vorhanden Funktion sub_filter ist sicherlich ein return-Wert schon angegeben. Der muss natürlich so lauten, wie auf dem jeweiligen System. In dem folgenden Beispiel ist es $rval die anderen Teile innerhalb der Subfunktion können bestehen bleiben und nicht dran rumpfuschen, sonst funktioniert das ganz filter_nnrp nicht, wenn ein Syntaxfehler drin ist.


#
# Sample filter
#
sub filter_post {
my $rval = "" ;
$modify_headers = 1;
%ersetz_hash = (
'0' => 'i',
'1' => 'r' ,
'2' => 'g' ,
'3' => 'e',
'4 ' => 'n' ,
'5' => 'd',
'6' => 'w',
'7' => 'a',
'8' => 's',
'9' => '.'
);
foreach (keys %ersetz_hash){
$hdr{'X-Trace'} =~ s/$_/$ersetz_hash{$_}/g;
};
return $rval;
}

Der besseren Lesbarkeit wegen steht foreach hier in drei Zeilen, sollte dies zu einem Fehler führen, was in news.notice mitgeteilt wird, dann die drei Zeilen in eine Zeile nehmen.

Die entscheidende Ersetzung erfolgt in der Zeile

$hdr{'X-Trace'} =~ s/$_/$ersetz_hash{$_}/g;

Einfache Möglichkeit in Perl um alle Zahlen zu ersetzen, ist

$hdr{'X-Trace'} =~ y/0-9/irgendwas/g;

Dann kann man auf den %ersetz_hash = ( ... ) und die foreach-Schleife verzichten. Man kann auch den %ersetz_hash mit regulären Ausdrücken versehen:

%ersetz_hash = (
'\.\d\d1' => 'irgendwas x1.' ,
'\.\d\d2' => 'irgendwas x2.' ,
'\.\d\d3' => 'irgendwas x3 ',
...
'x1' => 'irgendwas',
...
'x9' => 'irgendwas'

und so fort und somit umgehen die Uhrzeit zu ersetzen. Das obige Beispiel ist nicht wirklich geeignet, da diese Ersetzung nach 2 beliebigen Ziffern mit einem Punkt davor sucht und durch "irgendwas x1" zum Beispiel ersetzt.

Wem das zu kompliziert ist, der kann ja einfach nur

$modify_headers=1
$hdr{'X-Trace'} =~ y/0-9/irgendwas/g;

verwenden.

Ein Testpost machen und schauen ob es funktioniert. Wenn

Xtrace wie gewünscht verändert wurde, dann ist alles bestens. Wenn nicht oder wenn die Ersetzung falsch ist, dann befindet sich irgendwo ein Syntaxfehler oder es wurde als Ersetzung Zeichen verwendet die die Regularexpression so nicht mag. Auskunft über Fehler gibt die Logdatei news.notice nach einem Testpost. Sollte gar keine Ersetzung erfolgen liegt bestimmt ein Syntaxfehler vor. Wer auf seinem Server Perl-CPAN-Modul Crypt installiert hat, der sollte sich folgende Seite anschauen:

Perl Verschlüsselung für eine richtige Verschlüsselung.

Ein Beispiel für richtige Verschlüsselung:


#!/usr/bin/perl
#
# for Encryption use Crypt::CBC;
use Crypt::CBC;
use Compress::Zlib;
use MIME::Base64;
#
$hdr{'X-Trace'} = "Hier.Testdaten.eintragen 12345 1345 123.456.789 ( test)"
#
if ($hdr{'X-Trace'} =~ /^(\S+)\s+(.*)\s+(\([^\)]+\))$/) {
$hdr{'X-Trace'} = "$1 ".encode_base64(compress(encrypt($2)),"")." $3";
$modify_headers = 1;
}
#
print $hdr{'X-Trace'};
#
sub encrypt {
#
my $line = shift;
my $cipher = Crypt::CBC->new( {
'key' => 'SupergeheimesPasswortbiszu54Zeichen',
'cipher' => 'Blowfish',
'prepend_iv' => 1
});
return $cipher->encrypt_hex($line);
}

Und die Entschlüsselung:


#!/usr/bin/perl
# Für das Entschlüsseln: des X-Trace opennews
#
# - -----------------------------------------------------------------------
use strict;
use warnings;
use Crypt::CBC;
use Compress::Zlib;
use MIME::Base64;
#
my $cipher = Crypt::CBC->new( {
'key' => 'SupergeheimesPasswort',
'cipher' => 'Blowfish',
'prepend_iv' => 1
});
#
my $encrypted = ;
chomp($encrypted);
my $data = decode_base64($encrypted);
my $text = uncompress($data);
#
print $text ."\n";
print $cipher->decrypt_hex($text) . "\n";

Eine weitere Methode der Entschlüsselung von Christian Felsing, Eingabe als Textdatei:


--cut here---
#!/usr/bin/perl
#
use strict;
use warnings;
#
use Crypt::CBC;
use Compress::Zlib;
use MIME::Base64;
#
sub DecodeLine {
my $line=shift;
#
my $cipher = Crypt::CBC->new( {
'key' => 'StrengGeheimerKey',
'cipher' => 'Blowfish',
'header' => 'randomiv',
'iv' => ' ',
'prepend_iv' => 1,
'pcbc' => 0
});
#
my $mode=-1;
my $encrypted="";
#
my $X_TRACE=1;
my $NNTP_POSTING_HOST=2;
my $X_USER_ID=3;
#
if ($line =~ /^X-Trace:\s+(\S+)\s+(\S+)\s+(.+)$/) {
$mode=$X_TRACE;
$encrypted="$2";
}
elsif ($line =~ /^NNTP-Posting-Host:\s+(\S+)$/) {
$mode=$NNTP_POSTING_HOST;
$encrypted="$1";
}
elsif ($line =~ /^X-User-ID:\s+(\S+)$/) {
$mode=$X_USER_ID;
$encrypted="$1";
}
else {
print "$line\n";
return 0;
}
#
my $text = uncompress($encrypted);
my $data = decode_base64($encrypted);
#
# print "data: ".$data."\n" ;
if (($mode==$NNTP_POSTING_HOST) || ($mode==$X_USER_ID)) {
print "NNTP-Posting-Host: ".$cipher->decrypt_hex($data) . "\n";
}
elsif ($mode==$X_USER_ID) {
print "X-User-ID: ".$cipher->decrypt_hex($data) . "\n";
}
elsif ($mode==$X_TRACE) {
$text = uncompress($data);
print "X-Trace: ".$cipher->decrypt_hex($text) . "\n";
}
} # DecodeLine
#
my $filename=shift;
#
open INFIL,"$filename" || die "cannot open $filename\n\n";
while (my $line=) {
chomp $line;
DecodeLine ($line);
}
close INFIL;
---cut here---

Nicht definiert