sa-learn per Email füttern

Huschi

Moderator
Wer SpamAssassin auf seinem Server installiert hat, kennt das:
Hin und wieder (am Anfang recht häufig) kommen doch noch Spams durch.
Wie bekommt man jetzt diese Email aus seinem Mozilla/Thunderbird/KMail (habe ich einen wichtigen Client vergessen? Nö!) in sa-learn rein?

Diese Frage will ich heute klären:
(Die folgende Idee ist nicht von mir, sondern habe ich zufällig im Internet gefunden. Ich habe lediglich das Perl-Script etwas gekürzt ohne das Copyright zu entfernen und eine brauchbare Installationsanleitung geschrieben.)

1.)
Es werden entsprechende Emailadressen gebraucht. Ich nenne sie mal spam@domain.tld und ham@domain.tld. Der Server muß so präperiert sein, daß er diese Emails annimmt und auf ein lokales Postfach legen will.

2.)
Wir brauchen das folgende Script unter /usr/local/bin/sa-wrap.pl (und zwar ausführbar als 755)
Code:
#!/usr/bin/perl -w
#
# sa-wrapper.pl
#
# SpamAssassin sa-learn wrapper (c) Alexandre Jousset, 2004
# modified for use with procmailrc from Sven Neukirchner <sven@konabi.de>
# This script is GPL'd
# Time-stamp: <17 January 2004, 15:56>
# v1.0

use strict;
use MIME::Parser;

my $DEBUG =1;
my $LOGFILE= '/var/log/sa-learn.log';
my $UNPACK_DIR = '/var/spool/unpack';
my $SA_LEARN = '/usr/bin/sa-learn';

my $parser = new MIME::Parser;
$parser->extract_nested_messages(0);
$parser->output_dir($UNPACK_DIR);

my $entity;
eval { $entity = $parser->parse(\*STDIN); };

if ($@) {
   die $@;
} else {
    if ($DEBUG) {
    	open(OUT, "|$SA_LEARN -D $ARGV[0] --single >$LOGFILE 2>&1")
                or die "Cannot pipe $SA_LEARN: $!";
    } else {
    	open(OUT, "|$SA_LEARN $ARGV[0] --single")
	        or die "Cannot pipe $SA_LEARN: $!";
    }
    recurs($entity);
}
$parser->filer->purge;

sub recurs {
    my $ent = shift;
    if ($ent->head->mime_type eq 'message/rfc822') {
	  $ent->bodyhandle->print(\*OUT);
	  return;
    }
    my @parts = $ent->parts;
    if (@parts) {
	  map { recurs($_) } @parts;
    }
}

3.)
Wir brauchen eine /etc/procmailrc (Domain-Namen ändern!) bzw. als Ergänzung dazu:
Code:
verbose=yes
LOGFILE=/var/log/procmail.log

:0
* ^To: spam@domain.tld
{
:0fw
| /usr/local/bin/sa-wrap.pl --spam
:0
/dev/null
}

:0
* ^To: ham@domain.tld
{
:0fw
| /usr/local/bin/sa-wrap.pl --ham
:0
/dev/null
}

4.)
Die Logfiles und das unpack-Verzeichnis muß man evtl. mit der Hand anlegen, da dem MTA evtl. die nötigen Rechte fehlen:
Code:
touch /var/log/procmail.log
chown root:mail /var/log/procmail.log
chmod 775 /var/log/procmail.log
touch /var/log/sa-learn.log
chown root:mail /var/log/sa-learn.log
chmod 775 /var/log/sa-learn.log
mkdir /var/spool/unpack
chown root:mail /var/spool/unpack
chmod 775 /var/spool/unpack

Fertig!

Nun könnt Ihr alle Spams und Hams als Anhang an die jeweilige Emailadresse schicken und der SA lernt!

Den Erfolg kann man dann in /var/log/sa-learn.log mit verfolgen.
Achtung: entweder Logrotate für die 2 Dateien einschalten, oder, wenn alles funzt einfach 'verbose', 'logfile' und 'debug' in den Dateien auskommentieren.

Fehlersuche:
In /var/log/procmail.log. Wenn dort nichts steht, dann sucht erstmal im maillog nach 'procmail'-Fehlern

huschi.
 
Last edited by a moderator:
Super - prima Idee !

bei mir funktionierte das ganze aber erst, nachdem ich gemerkt hatte, daß der vorgeschlagene Order in dem sich der Perl-Script befinden soll und die Pfad-Angabe in der procmailrc unterscheiden ... also
/usr/local/bin/sa-wrap.pl --spam
in die procmailrc reinschreiben wenn ihr Huschis Anleitung genau gefolgt seid.

Dann gingen die Mails erst durch den script wenn ich an stelle von :
* ^To: spam@domain.tld
einfach nur :
* spam@domain.tld

genommen hatte ... was das genau für'n Unterschied macht weiss ich
aber nicht ... auf alle Fälle gings so :-)


und - kann das sein, daß man anstelle von --ham vielleicht --nonspam
als Parameter angeben muss ?

_______________________________________

Vielleicht sollte man auch erwähnen, daß man vevor SA lernen kann auch
diese Datenbank wie's in der Anleitung steht installieren muss - ich habe da
nämlich ein wenig gebraucht bis ich drauf gekommen bin ...

so steht's in der Anleitung ... man muss dann noch ein paar Fragen beantworten, die allerdings kein großes Problem darstellen dürften.

perl -MCPAN -e shell
o conf prerequisites_policy ask
install DB_File
quit

____________________________________________


und noch was anderes :
weiss jemand wie dieses lernen genau funktioniert ... ?
Wenn ich mit sa-learn --dump das gelernte ausgeben lasse
erscheint ja auch mein Name, meine Domain, der Mailer usw ... klar,
das steht ja auch alles in der weitergeleiteten Mail.
Wenn ich nun oft Mails dahin leite lernt SA ja oft meine Mailadresse und
meine Domain usw ... erkennt mich das Teil dann irgendwann selbst als
Spammer ???


Gruß, Martin
 
Giltet dann das lernen nur für das Postfach oder für alle?
Wie kann ich die Datenbank bzw. wo löschen?

Wie funzt es mit Confixx (3)? :)
 
Entschuldigung, ich habe vergessen zu erwähnen, daß ich hier davon ausging, daß sa-learn bereits genutzt wird/wurde um den Bayes-Filter zu füttern.
Das Problem war ja bisher, daß man die Spam-Mails irgendwie sammeln mußte, irgendwann als Mail-Datei speichert, auf den Server kopiert und dann sa-learn zum Fressen vorwirft.

Zum aktivieren des Bayes-Filter muß man man in /etc/[mail/]spamassassin/local.cf z.B. folgende Zeilen ergänzen:
Code:
bayes_path /var/spool/spamassassin/bayes
bayes_file_mode 777
use_bayes 1
auto_learn 1
...und danach mit 'sa-learn --rebuild' initialisiert werden.


Bevor man nochmals DB_File installiert, sollte man überprüfen, ob die nicht schon vorhanden ist. (Sie gehört eigendlich zum std. Lieferumfang von Perl.)

Übrigends sind die Benutzerrechte der Verzeichnisse entsprechend dem eigenen System anzupassen.

Falls Du den Verdacht hast, daß die Mail nicht entpackt wird, sondern direkt verarbeitet, kannst Du noch solche Zeilen in die local.cf einfügen: (sollte aber unnötig sein)
Code:
bayes_ignore_header ReSent-Date
bayes_ignore_header ReSent-From
bayes_ignore_header ReSent-Message-ID
bayes_ignore_header ReSent-Subject
bayes_ignore_header ReSent-To
bayes_ignore_header Resent-Date
bayes_ignore_header Resent-From
bayes_ignore_header Resent-Message-ID
bayes_ignore_header Resent-Subject
bayes_ignore_header Resent-To


huschi.
 
Entweder habe ich Tomaten auf den Augen oder ich bin zu Müde :) heist das nun das es dann für alle Mail user giltet sprich Postfächer oder nur für das jeweilige?
 
society said:
Giltet dann das lernen nur für das Postfach oder für alle?
Es geht darum, nicht als Spam erkannte Emails an das spezielle (nur für diese Zwecke eingerichtete) Postfach zurück zuschicken, damit er es lernen kann.

Wie kann ich die Datenbank bzw. wo löschen?
sa-learn --rebuild

huschi.
 
society said:
Also für alle? :) *nerv*
Für alle, die dort Emails hinschicken... :confused:
Egal ob von gmx, web.de, t-online oder Deiner eigenen Domain...

Oder verstehe ich Deine Frage nicht richtig?

huschi.
 
Achso, ich meinte das erlernte...
den meine Confixx user haben im Mail verzeichnis z.b. /home/mail/web3p2/.spamassassin eigene bayes dateinen....
 
society said:
den meine Confixx user haben im Mail verzeichnis z.b. /home/mail/web3p2/.spamassassin eigene bayes dateinen....
Ahhh, das meinst Du. [Gröschen fällt krachend zu Boden]
Ich bin mir nicht ganz sicher, aber ich glaube die 'globale bayes' sollte für alle Postfächer gelten. Allerdings ist es nicht wirklich schwer den jeweils speziellen Spamfilter anzusprechen. Das kann man glaub ich sogar auch zentral automatisieren. Aber auf jedenfall durch eine eigene ~/.procmailrc.

huschi.
 
ACHTUNG - die ganze Sache hat auch einen Haken ...

ich habe gestern einige Spam-Mails (es waren insgesamt über 100)
an meine eingerichtete Mailadresse zum lernen geschickt, damit habe ich
meinen Vserver ins Teilkoma gelegt !!!
(Mailserver und SSH gingen nicht - Webserver schon)

Bei nur 2-3en beim Testen funktionierte das einwandfrei vorher !

Er ist bis heute früh nicht wieder zu sich gekommen, jetzt habe ich
einen Reboot angefordert ...

Fazit : ich werde den Script und die eMail Adresse wieder entfernen, sonst
kann ja jeder Witzbold da mal 100 Mails hin schicken um meinen Server
auszuschalten :-(

Gruß, Martin
 
Bei mir gehts auch nicht so wie es soll.... er erstellt immer in dem Postfach die Bayes Datei bei dem ich die emails verschicke.... und ignoriert die Globale Einstellung. Hat jemand ne Confixx Kompatible Lösung?
 
das glaube ich nicht, schau mal - das habe ich aus /var/log/messages :

die Spam - Mails habe ich alle über mein T-Online Mail-Konto verschickt,
falls SA den Absender auch als Spam lernt wäre das dann nicht so schlimm
gewesen, weil ich das so gut wie nie benutze :-)
und nach dem versenden an T-Online hat mein Mailer mir ja die anderen
Postfächer abgearbeitet ... um 19:43:26 kam dann anscheinend die Flut
vom Telekom-Server rüber und der Speicher wurde knapp ...
dann tat sich nichts mehr bis ich heute früh um 10 vor 7 den Reboot angefordert hatte.


PHP:
Dec  7 19:42:37 146190 popa3d[8323]: Authentication passed for web7p1 from 217.248.10.138
Dec  7 19:42:37 146190 popa3d[8323]: 1 message (1180 bytes) loaded
Dec  7 19:42:37 146190 popa3d[8323]: 1 (1180) deleted, 0 (0) left
Dec  7 19:42:50 146190 popa3d[12035]: Authentication passed for web8p1 from 217.248.10.138
Dec  7 19:42:50 146190 popa3d[12035]: 0 messages (0 bytes) loaded
Dec  7 19:42:50 146190 popa3d[12035]: 0 (0) deleted, 0 (0) left
Dec  7 19:42:50 146190 popa3d[12290]: Authentication passed for web7p2 from 217.248.10.138
Dec  7 19:42:50 146190 popa3d[12290]: 0 messages (0 bytes) loaded
Dec  7 19:42:50 146190 popa3d[12290]: 0 (0) deleted, 0 (0) left
Dec  7 19:43:26 146190 xinetd[27041]: smtp: fork failed: Cannot allocate memory (errno = 12)
Dec  8 06:50:07 146190 shutdown: shutting down for system halt
Dec  8 06:50:21 146190 init: Switching to runlevel: 0
 
damit das nicht mehr passiert habe ich mir folgendes überlegt ...


Ich habe 2 Scripts in /var/local erstellt, eines um das Postfach für Spam
zu lernen und eines für Ham. Wenn das Postfach durchgelesen ist überschreibe
ich es einfach mit der Datei temp, welche nur eine leere Datei (ein leeres Postfach)
ist.

Den Script kann ich ja dann ein mal täglich durch nen Cron-job starten...

Vielleicht kann's ja noch jemand verbessern, daß z.B. das Datum mit im
Log steht, oder, daß nicht ein Logfile angelegt sondern ne email geschickt
wird ... ?


ham :
PHP:
sa-learn --mbox --ham /var/mail/web4p3 > ham.log
cp /var/local/temp /var/mail/web4p3

und das gleiche eben mit dem entsprechenden Postfach für Spam ...
 
Hallo,

ich habe das jetzt installiert und ein paar Mails an spam geschickt.
Es füllt sich die procmail.log, aber die sa-learn.log bleibt leer.

Ist es ok, die beiden eMail-Adressen in einem Postfach zu haben, oder braucht hier jede Adresse auch ein eigenes Postfach?

Ciao

Martin
 
Tach !

Ich hatte auch die Idee 2 Mailadresse einzurichten um den Spamassassin vorwiegend mit falsch interpretierten Mails zu trainieren. Aber je länger ich
mich damit beschäftige desto mehr hab ich den Eindruck das es so einfach nicht ist. Denn man will ja nicht den SA auf seine eigenen Adressen trainieren. Grund: Durch das weiterleiten wird die Mail ja verändert. Das heißt man müsste sämtliche Header und Änderungen die dazugekommen sind wieder rausfischen.

Gibts eigentlich nen mbox Archiv mit deutschem Spam ? Ich hab nix gefunden....

Gruß
Reisswolf
 
Reisswolf said:
Denn man will ja nicht den SA auf seine eigenen Adressen trainieren. Grund: Durch das weiterleiten wird die Mail ja verändert.
Mit oben genanntem Script zwischen procmail und sa-learn wird wirklich nur der Anhang der weitergeleiteten Mail an sa-learn verfüttert. Und nicht die vollständige Mail.

huschi.
 
Back
Top