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