Spamassassin: GeoIP Header Informationen

4

Ich habe mal wieder etwas Zeit gefunden mich mit einer weiteren Antispam Maßnahme zu beschäftigen. Der Geo-IP basierten Bewertung.
Das Verfahren ist recht simple. Die IP Adresse des einliefernden Servers wird mit einer Datenbank von IP Adressen abgeglichen,
um so den Ort des Servers zu erfahren.

Basierend auf zu erstellenden Regeln, kann dann eine E-Mail anhand der Spam Punkte auf- oder abgewertet werden. Das Verfahren setzte dabei auf
die Perl Module GEO::IP und IP::Country:Fast auf. Seit Spamassassin 3.4 ist Geo::IP fester bestandteil von Spamassassin.

Perl Module installieren

cpan -i Geo::IP IP::Country::Fast

GeoIP Datenbank installieren

Einmalig manuelle Installation

Die Geo Datenbank liegtbei Debian unter /usr/local/share/GeoIP/GeoIP.dat.

Sollte diese noch vorhanden sein, muss sie nachgeladen werden.

cd /tmp
wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
mkdir /usr/local/share/GeoIP/
mv GeoIP.dat /usr/local/share/GeoIP/

Scriptgesteuerte Installation

Für den Download der Datenbank gibt es auch ein Paket, welches ein Download Script bereitstellt.

apt-get install geoip-database-contrib

Da dieses, die GeoIP.dat jedoch unter /usr/share/GeoIP/ ablegt, muss an Softlink erstellt werden.

cd /usr/local/share/GeoIP
ln -s /usr/share/GeoIP/GeoIP.dat

Anschließend kann die GeoIP Datei heruntergeladen werden.

/usr/sbin/update-geoip-database

Diesem Spamassassin Wiki Beitrag zufolge sollte die GeoIP Datenbank von hier bezogen werden, da diese Quelle im Gegensatz zur obigen monatlich aktualisiert wird.
Zum Zeitpunkt meines Tests, war Datei aus der angegebenen Quelle jedoch auch schon 6 Monate alt.

Relay Country aktivieren

Zum aktivieren des Plugins muss lediglich eine Zeile auskommentiert werden.

/etc/spamassassin/init.pre
loadplugin Mail::SpamAssassin::Plugin::RelayCountry

Spam Regel

Ich habe dafür eine neue Datei /etc/spammassasin/70_geoip.cf erstellt.
Eine Regel zur Aufwertung und eine Regel zur Abwertung. Die ISO 3166 Länder Kürzel findet man hier.

header          RELAYCOUNTRY_GOOD X-Relay-Countries =~ /^(DE|FR)/
describe        RELAYCOUNTRY_GOOD First untrusted relay is Germany or France :-)
score           RELAYCOUNTRY_GOOD -2.0

header          RELAYCOUNTRY_BAD X-Relay-Countries =~ /^(CN|SE)/
describe        RELAYCOUNTRY_BAD First untrusted relay is China or Sweden :-)
score           RELAYCOUNTRY_BAD 2.0

Plugin prüfen

Auch wenn eine Überprüfung ohne Neustart der Dienste auskommt… schadet er auch nicht… nur um Fehler auszuschließen

/etc/init.d/spamassassin restart
/etc/init.d/amavis restart

Bevor man sich jetzt zig Test eMails zuschickt, lohnt sich ein Blick in die Spamassassin Debug Ausgabe.
Da sich diese nicht mit grep filtern lässt, einfach nach Notepad kopieren und dort nach Country suchen.
Reicht der Consolen Buffer nicht für die gesamte Ausgabe, diesen erhöhen und den Befehl erneut ausführen.

Wenn das Plugin installiert ist und läuft, sollte sich in der Ausgabe folgendes wiederfinden.

spamassassin -D --lint 2>&1 | grep -i geoip

Aug 20 21:22:52.766 [23997] dbg: plugin: loading Mail::SpamAssassin::Plugin::RelayCountry from @INC
Aug 20 21:22:52.767 [23997] dbg: metadata: RelayCountry: IPv6 support not enabled, versions Geo::IP 1.39, GeoIP C API 1.4.7 required

Auf Fehler deuten folgende Einträge hin.

failed to load 'Geo::IP', skipping: Can't locate IP/Country/Fast.pm in @INC
failed to load 'IP::Country::Fast', skipping: Can't locate IP/Country/Fast.pm in @INC

^ Perl Module nicht installiert

failed to load 'Geo::IP', skipping: Error opening /usr/local/share/GeoIP/GeoIP.dat

^ GeoIP Datenbank nicht installiert oder am falschen Ort abgespeichert.

Test E-Mail

Das ganze sieht dann in einer Test E-Mail wie folgt aus.

X-Spam-Status: No, score=-11.818 tagged_above=-100 required=12.31
 tests=[BAYES_00=-1.9, FREEMAIL_ENVFROM_END_DIGIT=0.25,
 FREEMAIL_FROM=0.001, HTML_MIME_NO_HTML_TAG=0.377,
 MIME_HTML_ONLY=0.723, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01,
 RCVD_IN_MSPIKE_WL=-0.01, RELAYCOUNTRY_GOOD=-2,
 RP_MATCHES_RCVD=-0.548, SPF_PASS=-0.001]
 autolearn=ham autolearn_force=no

E-Mail Country Header

Laut dem Spamassassin Wiki Beitrag kann ein Country Header hinzugefügt werden. Wer jedoch Spamassassin in Verbindung mit Amavis einsetzt,
wird merken, dass dies nicht funktioniert. Hintergrund ist, dass Amavis die Header in die E-Mails einfügt und nicht Spamassassin.

Ich bin jedoch hier auf eine Lösung dafür gestoßen. Die nachfolgenden Zeilen müssen in die Amavis Konfiguration kopiert werden.
In meinem Fall habe ich diese in der /etc/amavis/conf.d/50-user abgelegt. Jedoch vor der finalen Return Zeile (1;  # insure a defined return).

package Amavis::Custom;

BEGIN {
  import Amavis::Conf qw(:platform :confvars c cr ca $myhostname);
  import Amavis::Util qw(do_log untaint safe_encode safe_decode);
  import Amavis::rfc2821_2822_Tools;
  import Amavis::Notify qw(build_mime_entity);
}

sub new {
  my($class,$conn,$msginfo) = @_;
  my($self) = bless {}, $class;
  $self;  # returning an object activates further callbacks,
  # returning undef disables them
}

sub before_send {
  my($self,$conn,$msginfo) = @_;
  my($all_local) = !grep { !$_->recip_is_local }
    @{$msginfo->per_recip_data};
  if ($all_local) {
     my($hdr_edits) = $msginfo->header_edits;
     my ($rly_country) =
  $msginfo->supplementary_info('RELAYCOUNTRY');
        $hdr_edits->add_header('X-Relay-Countries', $rly_country)
                 if defined $rly_country && $rly_country ne '';
        my($languages) = $msginfo->supplementary_info('LANGUAGES');
        $hdr_edits->add_header('X-Spam-Languages', $languages)
                 if defined $languages && $languages ne '';
   }
}

Nach einem Reload von Amavis erscheint die Country Zeile dann auch im Header.

/etc/init.d/amavis restart

 

X-Relay-Countries: DE DE
X-Spam-Flag: NO
X-Spam-Score: 1.182
X-Spam-Level: *
X-Spam-Status: No, score=1.182 tagged_above=-100 required=12.31
 tests=[BAYES_00=-1.9, FREEMAIL_ENVFROM_END_DIGIT=0.25,
 FREEMAIL_FROM=0.001, HTML_MIME_NO_HTML_TAG=0.377,
 MIME_HTML_ONLY=0.723, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01,
 RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_OOSBL=5, RELAYCOUNTRY_GOOD=-2,
 RP_MATCHES_RCVD=-0.548, SPF_PASS=-0.001]
 autolearn=no autolearn_force=no
Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

4 Kommentare

  1. Herzlichen Dank für diese kurze, eindeutige und funktionierende Anleitung für die Implementierung der GeoIP in Spamassassin. Einzig, was ich noch nicht nachvollziehen kann, wenn eine Email nicht aus dem als GOOD oder BAD definierten Bereich kommt, erscheint dann der Tag RELAYCOUNTRY_GOOD // RELAYCOUNTRY_BAD gar nicht im Header der Mail? und warum wird eine Mail von Web.de nur mit RELAYCOUNTRY_GOOD getagged und nicht mit -2.00. Danke für eine Antwort.

    PS: DE | FR = Deutschland & Frankreich – CN | SE = China und Schweden ^^

    VG

    sts

    • Christian Scholz am

      Dank für den Hinweis zu den zwei Fehlern. Wurde korrigiert. Zu Deinen Fragen:

       

      E-Mail matched weder RELAYCOUNTRY_GOOD noch RELAYCOUNTRY_BAD

      Der Header wird immer gesetzt. Es erfolgt dann allerdings keine Bewertung, siehe nachfolgend Beispiel:

      X-Relay-Countries: DE DE DE
      X-Spam-Flag: NO
      X-Spam-Score: 7.11
      X-Spam-Level: *******
      X-Spam-Status: No, score=7.11 tagged_above=-100 required=12.31
          tests=[AM.WBL=8, BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
          DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, MIME_HTML_MOSTLY=0.428,
          PYZOR_CHECK=1.392, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001,
          T_RP_MATCHES_RCVD=-0.01] autolearn=no autolearn_force=no

       

      Warum wird eine Mail von Web.de nur mit RELAYCOUNTRY_GOOD getagged und nicht mit -2.00.

      Nachfolgend ein Header von einer Web.de E-Mail. Mit den oben dargestellten Regeln sollte eine Bewertung mit -2 erfolgen.
      Im Nachfolgenden Beispiel ist die positive Bewertung auf -0,001 angepasst.

      X-Relay-Countries: DE DE
      X-Spam-Flag: NO
      X-Spam-Score: 2.37
      X-Spam-Level: **
      X-Spam-Status: No, score=2.37 tagged_above=-100 required=12.31
          tests=[BAYES_00=-1.9, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001,
          RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01,
          RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_OOSBL=5, RELAYCOUNTRY_GOOD=-0.001,
          SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01]

       

  2. Also bei mir wir da ganz unterschiedlich gearbeitet, leider habe ich noch kein System erkannt.

    X-Relay-Countries – erscheint gar nicht, X-Spam-Flag und X-Spam-Score  – ebenso nicht.

    Hier ein paar Beispiele :

    von Moonmail Liste X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on autospam.xxxxxxxx.de
    X-Spam-Level: ***
    X-Spam-Status: No, score=3.6 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY,
        MONEY_BACK,RCVD_IN_DNSWL_NONE,T_DKIM_INVALID,T_KAM_HTML_FONT_INVALID,
        URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.1

    von meinem Webserver: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on autospam.xxxxxxxx.de
    X-Spam-Level:
    X-Spam-Status: No, score=-2.0 required=5.0 tests=RELAYCOUNTRY_GOOD,
        URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.1

    von Booking.com: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on autospam.xxxxxxxx.de
    X-Spam-Level: **
    X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_03_06,
        HTML_FONT_LOW_CONTRAST,HTML_IMAGE_RATIO_06,HTML_MESSAGE,MIME_HTML_ONLY,
        T_DKIM_INVALID,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.1

    von Vautron (Strato) X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on autospam.xxxxxxxx.de
    X-Spam-Level:
    X-Spam-Status: No, score=-2.0 required=5.0 tests=RCVD_IN_DNSWL_NONE,
        RELAYCOUNTRY_GOOD,URIBL_BLOCKED autolearn=unavailable autolearn_force=no
        version=3.4.1

    Das ist jedes Mal anders. Irgend eine Idee?

  3. PS und so sieht eine echte Spam Mail aus:

    #### SPAMASSASSIN PART ####

    X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on autospam.xxxxxxxx.de
    X-Spam-Flag: YES
    X-Spam-Level: ********
    X-Spam-Status: Yes, score=8.8 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE,RAZOR2_CF_RANGE_51_100,RAZOR2_CHECK,RCVD_IN_PSBL,T_DKIM_INVALID,
     T_HK_NAME_DR,URIBL_ABUSE_SURBL,URIBL_BLOCKED autolearn=no autolearn_force=no
     version=3.4.1

    #### MAILSERVER PART ####

    X-MailServer-Spam: YES
    X-MailServer-Reason-1: Rejected by SURBL. – (Score: 3)
    X-MailServer-Reason-3: Tagged as Spam by SpamAssassin – (Score: 8)
    X-MailServer-Reason-4: Rejected by Sorbs. – (Score: 3)
    X-MailServer-Reason-5: The host name specified in HELO does not match IP address. – (Score: 3)
    X-MailServer-Reason-6: Rejected by UCE Protect LVL 2 – (Score: 3)
    X-MailServer-Reason-Score: 20
    IS-SPAM: REALSPAM-4-STARS

    Wir verwenden kein Amavis – der Mailserver ist getrennt vom Spamassassin – läuft über Port 783 auf einer dedizierten Maschine für Spamd / Clamavd. 

    Mail-Flow: Incoming ->[MAILSERVER] -> Spamassassin(external)tagging -> ClamAV(external)removal -> Mailservers eigene Spamtests / RFC Konformität / DNSBL Tests / Scoring -> tagging entsprechend Score -> Auslieferung in das Postfach.

Antworten