Categories
Internet, Unix en security

Fetchmail gebruiken om sa-learn aan te sturen

Nu zijn er al flink wat postings geweest over hoe SpamAssassin en Bayesian-filtering in te zetten, maar wat gebeurt er nog meer achter de schermen. In een van de eerste postings was al naar voren gekomen hoe vanaf de commandline de database gevuld kan worden, maar wat als de data op een IMAP-server staat?

Gelukkig zijn er op Unix duizend en één tooltjes beschikbaar en zo ook om berichte van een IMAP- of een POP3-server te halen. We beginnen dus met het installeren van fetchmail, wat dit al jaren kan en nog steeds regelmatig updates krijgt.

$ sudo apt-get install fetchmail

De tweede stap is om het bestand /etc/fetchmailrc te voorzien van de juiste informatie zoals in het voorbeeld hieronder. Wat al gelijk opvalt zijn de twee entries voor de spamuser en ook twee voor de hamuser. De mailserver plaatst berichten met een spam-label automatisch in de Junk-folder en hierdoor moet fetchmail twee folders leeghalen. Dit kan verschillen per mailserver configuratie uiteraard.

Een tweede kenmerk is dat tegen fetchmail wordt vertelt om een alternatieve Mail Delivery Agent te gebruiken en dat is /usr/bin/sa-learn in dit geval. Oplettende lezers zullen ook merken dat “-u amavis” ontbreekt, maar dat komt omdat in de SpamAssassin configuratie wordt afgedwongen om alles te leren onder de gebruiker amavis.

poll imap.example.org proto imap:
user "spamuser" password "password" ssl mda '/usr/bin/sa-learn --spam' folder 'INBOX' fetchall no rewrite
user "spamuser" password "password" ssl mda '/usr/bin/sa-learn --spam' folder 'Junk' fetchall no rewrite
user "hamuser" password "password" ssl mda '/usr/bin/sa-learn --ham' folder 'INBOX' fetchall no rewrite
user "hamuser" password "password" ssl mda '/usr/bin/sa-learn --ham' folder 'Junk' fetchall no rewrite

De derde stap is om het bestand /etc/default/fetchmail aan te passen met volgende opties. Het vertelt fetchmail om als daemon te draaien en 15 minuten na het beëindigen van een poll opnieuw te controleren of er nieuwe berichten zijn. Tevens wordt ook duidelijk gemaakt aan fetchmail dat hij onder geen beding bounce-berichten de wereld mag insturen.

OPTIONS="-d 900 --nobounce"
START_DAEMON=yes

Als laatste stap is het nu om fetchmail te starten en doordat de START_DAEMON op yes is gezet zal fetchmail ook automatisch starten als de machine herstart.

$ sudo invoke-rc.d fetchmail start

Zoals al gezegd is fetchmail redelijk lang op de markt en kent ook vele opties om sommige dingen nog verder te tunen. Een nadeel van de huidige opzet is dat voor elke nieuw bericht een sa-learn proces wordt opgestart. Het is dus wel verstandig om te kijken wat de impact is als je veel berichten per dag moet verwerken. Tevens valt er nog wat te spelen met fetchmail opties zoals expunge, limit en limitflush bijvoorbeeld.

Categories
Internet, Unix en security

IMAP migreren naar IMAP, deel 2

In september ging een posting over het migreren van IMAP en afgelopen weekend was het zover. Dovecot 1.0.15 werd upgrade naar 1.2.9 waardoor oa een bug in de delivery agent werd geholpen en bewust werd van namespace prefixen. Maar ook werd Sieve-ondersteuning verbetert en redelijk veel performance verbeteringen.

Een van de belangrijkste reden van de migratie was niet om Dovecot te upgraden, maar om mailbox-layout op een dermate manier te wijzigen dat Dovecot zoveel mogelijk out-of-the-box gebruikt kon worden. De INBOX-prefix moest dus verdwijnen en na veel testen met oa Evolution, Roundcube, Thunderbird en Microsoft Outlook 2007 kwam de volgende layout eruit rollen.

Trash
Drafts
INBOX.Test
Junk
Sent
INBOX

Een van de keuzes was om dubbele algemene mappen aan te maken, maar gezien het feit hoe makkelijk vele clients de nieuwe layout oppakte zijn de algemene mappen op het hoogste niveau geplaatst. Elke client lijkt hier redelijk goed mee om te gaan. Alleen Evolution behoefte in sommige speciale gevallen een opschoning van de lokale cache, maar in veel gevallen is het niet eens nodig. De keuze gaf ook de mogelijkheid om Dovecot zo in te stellen dat de algemene mappen altijd beschikbaar zijn en door de gebruiker eigenlijk niet weg te gooien zijn. De mappen worden bij het eerst volgende bericht weer automatisch aangemaakt en beschikbaar gesteld.

protocol lda {
mail_plugins = autocreate ...
}
plugin {
autocreate = Trash
autocreate2 = Junk
autocreate3 = Drafts
autosubscribe = Trash
autosubscribe2 = Junk
autosubscribe3 = Drafts
}

Door de vaste locatie en het automatisch beschikbaar stellen van mappen is het vooraf wegfilteren van Spam wel een optie geworden. En hoewel dit natuurlijk wel een heikel punt is, want de gebruiker heeft ineens geen invloed meer of spam opzij wordt gezet. Dit is misschien het belangrijkste punt wat van XS4ALL te leren is en dat is om niet te veel keuzes te geven, maar een veilige oplossing aan te bieden.

protocol lda {
mail_plugins = sieve ...
}
plugin {
sieve_before = /etc/dovecot/sieve/discard-junk.sieve
}

Door tegen de Sieve-plugin te vertellen dat hij voor elke lokale delivery van een mailbericht het discard-junk.sieve script moet afwerken. Nu zijn er vele voorbeelden in omloop met wildcard en dat men de wildcards telt, maar waarom niet gewoon de beslissing in bijvoorbeeld Amavisd-new laten maken en zoeken naar de juiste header.

require ["fileinto"];
# rule:[spamfilter]
if anyof (header :contains "X-Spam-Flag" "YES")
{
fileinto "Junk";
}

Wat nu eigenlijk nog overblijft is om het Sieve-script met de hand te compileren.

$ sudo sievec /etc/dovecot/sieve/discard-junk.sieve

Er zijn nog veel meer wijzigingen geweest, maar die komen binnenkort vanzelf aan de orde.

Categories
Internet, Unix en security

Sieve heeft ook zijn eigen poort

Sieve is een gestandaardiseerde filtertaal voor mailservers en clients. Oa Dovecot heeft een implementatie van hiervan waardoor mail op de server al kan worden gefilterd ipv op de client. Om eerlijk zijn ook de enige juiste plek IMHO, maar dat zijn details. Een andere bekende implementatie is binnen de Cyrus mailsuite en waar het precies fout is gegaan laat ik even in het midden. Heel lang is er een discussie geweest of Sieve wel de oplossing was, omdat er vele wegen waren of juist ontbraken om de regels op de mailserver te krijgen.

Gelukkig is er na lang gesteggel een redelijk veilige oplossing gekomen, maar iemand had poort 2000 uitgekozen om deze dienst op te laten draaien. Helaas was deze poort door IANA al vergeven aan Cisco SCCP om hun eigen XMMP/VoIP-oplossing op te laten luisteren. Uiteindelijk is poort 4190 uit IANA komen rollen als gereserveerde poort voor het Sieve-protocol. De migratie naar deze poort is nu begonnen en zal met Debian 6.0 waarheid worden voor veel Debian-gebruikers cq installaties. Bug 560094 heeft meer informatie.

Categories
Internet, Unix en security

IMAP migreren naar IMAP, deel 1

Vroeger was Courier redelijk de standaard voor diensten zoals POP3 en IMAP, maar er waren te veel beperkinge en de developers te moeilijk in de omgang. En totdat Dovecot aan de releasecandidates begon van 1.0 serie was er ook niet echt een alternatief. Een zeer goed bruikbaar alternatief welke nog hard in ontwikkeling is met mailboxen in verschillende namespaces zoals public en private, maar ook fatsoenlijk Sieve-ondersteuning.

Met de komst van Roundcube 0.3 als webmailclient zijn er nieuwe mogelijkheden beschikbaar gekomen welke nu langzaam benut kunnen worden. Ondersteuning voor Sieve is daar eentje van en met de belofte van de developers om ook ondersteuning in Evolution te bouwen komt serverside mailfitering voor oa de Linux-wereld en de normale gebruikers redelijk dichtbij. Geen geknutsel meer met .procmailrc of .maildrop files uploaden en hopen dat het werkt.

Helaas kwam er direct een probleem aan het licht bij het testen. Een probleem in de private namespace van de mailbox en eentje die eigenlijk voorkomt uit de migratie van Courier naar Dovecot. Om het gedrag van Courier te imiteren beschikt Dovecot over de mogelijkheid om standaard een prefix voor subfolders te zetten. Een actie om zo gebruikers transparante kunnen migreren, maar welke wel zorgt dat alle subfolders onderdeel zijn van de Inbox.

Om cache fouten in mailclients uit te sluiten is het gebruiken van een simpele client aan te raden. Simpeler dan de Perl-code hieronder bestaat bijna niet, maar doet precies wat het moet doen.

#!/usr/bin/env perl
use Net::IMAP::Client;
my $imap = Net::IMAP::Client->new(
server => 'mailhost',
user => 'username',
pass => 'password',
ssl => 1,
port => 993
) or die "Could not connect to IMAP server";
$imap->login or die('Login failed: '.$imap->last_error);
foreach ($imap->folders) { print $_."\n"; }

Bij de eerste run komt de output zoals die nu wordt aangeboden aan de mailclient.

INBOX.Trash
INBOX.Drafts
INBOX.Test
INBOX.Junk
INBOX.Sent
INBOX

Bij het uitschakelen van alleen de prefix-optie in Dovecot komt gelijk naar voren wat er gaat veranderen.

Trash
Drafts
Test
Junk
Sent
INBOX

Bij het controleren met verschillende mailclients komt direct naar voren dat hier wat slims gedaan moet gaan worden. Want de mailclients zien subfolders die ineens niet meer onderdeel zijn van de Inbox. Technisch gezien zijn ze nu ook geen onderdeel van de Inbox. Voor de standaard folders zoals Trash, Drafts, Junk en Sent zal dit niet echt een probleem gaan vormen, maar wel voor bv de folder Test.