We krijgen heel wat spam in onze mailbox. Gelukkig zijn er veel tools beschikbaar die het mogelijk maken om spam te detecteren en het daarna apart te zetten in een speciale spamfolder. Maar eigenlijk is dat een beetje dweilen met de kraan open. Mocht je thuis of in je bedrijf een eigen mailserver hebben, dan kun je ook gaan dweilen met de kraan dicht.

Auteur: Arjan ten Hoopen

Met dweilen met de kraan dicht, bedoel ik dat je voorzieningen gaat treffen om spam, of in ieder geval zoveel mogelijk spam, te weren vóórdat het op de mailserver wordt opgeslagen. Deze voorziening heet ‘greylisting’. Black- en whitelisting zijn waarschijnlijk bij iedereen al bekend. Greylisting is iets dat ertussen in zit. In het kort komt het erop neer dat de mailserver die contact maakt, eerst moet ‘bewijzen’ dat zij netjes te werk gaat. Gaat het niet volgens de regels, dan wordt zij genegeerd. Gaat zij wel volgens de regels, dan wordt zij geserviced.

Simpel en effectief

Het idee hierachter is, in al haar simpelheid, extreem effectief. Hoe gaat het spelletje? Als een zendende mailserver contact zoekt met een ontvangende mailserver, dan spreken zij elkaar via een afgesproken protocol (SMTP). Dit protocol beschrijft hoe met elkaar gecommuniceerd moet worden. Normaal gesproken wordt een mail direct afgeleverd. Echter, de ontvangende mailserver kan ook aangeven dat ze erg druk is en daarom verzoekt om het later nog een keer te proberen. Een nette zendende mailserver zal het na enige tijd opnieuw proberen.

Het businessmodel achter spam is; zoveel mogelijk mails verzenden. De techniek achter dit businessmodel gaat ervan uit dat bij de eerste poging om de mail af te leveren dit ook lukt. Mocht het niet lukken, jammer maar helaas. Ze gaan dan gewoon door naar de volgende.

Postgrey

Het tool postgrey maakt het mogelijk om greylisting te implementeren. In dit artikel gaan we uit van postgrey met postfix als mailserver op een openSUSE Leap 15 systeem. Voor andere distributies is de installatie en configuratie zeer vergelijkbaar. Postgrey is niet gebonden aan postfix. Ze kan nagenoeg door alle mailservers gebruikt worden. Het enige verschil zit in de details van de configuratie van de mailserver.

Laten we het proces stap voor stap doorlopen. Op de smtp port op je mailserver (meestal port 25) biedt een zendende mailserver zich aan. Postfix pakt het op en zal een policy check doen om te bepalen hoe verder te gaan. De policy check is: vragen aan postgrey of deze mailserver geserviced mag worden.

Postgrey bouwt een database met daarin triplets. Een triplet bestaat uit 1) het IP-adres van de mailserver die een mail probeert af te leveren, 2) de verzender van de mail en 3) de ontvanger van de mail.  Als een triplet voor het eerst gezien wordt, dan zal postgrey een foutmelding geven. Dit gaat ervoor zorgen dat postfix aan de zendende mailserver zal vragen om het later nog eens te proberen.

Drempel

Een nette mailserver zal het na enige tijd weer proberen. Standaard staat postgrey ingesteld op een drempel van 5 minuten. Tijdens deze 5 minuten zal mail met een onbekend triplet niet geaccepteerd worden. Wordt een triplet na 5 minuten weer gedetecteerd dan wordt de triplet ‘bekend’ en zal de mail normaal worden afgeleverd bij de ontvanger.

Dit standaard gedrag kun je nog op diverse manieren beïnvloeden. De drempeltijd is ingesteld op 5 minuten, echter deze kun je groter en kleiner maken. Mijn ervaring is dat 5 minuten een zeer acceptabele drempelwaarde is. Maak je de drempeltijd korter, dan is het mogelijk dat je toch nog wel redelijk wat spam krijgt. Om de voor jou meest optimale waarde te krijgen, zal je wat moeten experimenteren. Zorg ervoor dat deze experimenten wel een paar dagen duren, anders krijg je geen betrouwbare cijfers.

Whitelist

Standaard komt postgrey ook met een whitelist_clients bestand (/etc/postgrey/whitelist_clients). In deze lijst zijn clients opgenomen die ‘betrouwbaar’ zijn. Naast deze betrouwbare clients kan je zelf ook een lijst aanleggen met betrouwbare clients. Doe dit in /etc/postgrey/whitelist_clients_local. Naast clients kan je ook een whitelist maken voor ontvangers, zie /etc/postgrey/whitelist_recipients

De syntax voor een regel in een postgrey whitelist bestand heeft veel gelijkenis met de syntax regels van de Postfix access tabellen. Voor ontvangers kan je een domein opgeven. Dit is of een geheel of gedeeltelijk mailadres of een reguliere expressie. Dit maakt het geheel zeer flexibel. Voor clients geldt dat je een domein of sub-domain op kunt geven of een (gemaskeerd) IP-adres. De IP-adressen kunnen ook via reguliere expressies gedefinieerd worden. Het meegeleverde whitelist_clients bestand geeft je genoeg voorbeelden.

Installatie

Voor het installeren van postgrey gebruik je de package manager. Na de installatie kan je eventueel de whitelists in /etc/postgrey aanpassen. Ik raad je echter aan om dit later te doen. In ieder geval nadat je wat ervaring hebt gekregen met postgrey en hoe het zich op jouw mailserver gedraagt.

De postgrey configuratie staat in /etc/sysconfig/postgrey. Controleer in dit bestand of POSTGREY_CONN_OPTIONS ingesteld staat op –inet=127.0.0.1:10031. Deze setting gaan we gebruiken tijdens de configuratie van postfix.

Je moet de postgrey service nog wel starten en ervoor zorgen dat zij automatisch wordt gestart nadat je systeem ge-reboot is (Zie Listing 1).

systemctl start postgrey

systemctl enable postgrey

Listing 1

 

Vervolgens moet je in de configuratie van postfix (/etc/postfix/mail.cf) aangeven dat er een policy check uitgevoerd moet worden. Zoek in het configuratie bestand naar de key “smtpd_recipient_restrictions” en voeg hieraan toe check_policy_service inet:127.0.0.1:10031

Aan de slag

Nadat je postfix opnieuw geladen hebt (systemctl reload postfix), is het greylisten actief. Speur na enige tijd in je maillog naar regels die er als volgt uit zien (Zie Listing 2).

2019-01-30T12:22:52.279171+02:00 mailsrv1 postgrey[9271]: action=greylist, reason=new, client_name=aserp2130.company.com, client_address=201.101.167.12, sender=john.doe@company.com,  recipient=arjan@mysite.nl

2019-01-30T12:22:52.279442+02:00 mailsrv1 postgrey[9271]: cleaning up old logs...

2019-01-30T12:22:52.339017+02:00 mailsrv1 postfix/smtpd[15279]: NOQUEUE: reject: RCPT from aserp2130.company.com[201.101.167.12]: 450 4.2.0 <arjan@mysite.nl>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/mysite.nl.html; from=<john.doe@company.com> to=<arjan@mysite.nl> proto=ESMTP helo=<aserp2130.company.com>

Listing 2

 

Wat zie je hier gebeuren? Eerst zie je dat postgrey een nieuw triplet detecteert waarna postfix vervolgens een 450 error code terugstuurt. Enige tijd later zal het nogmaals geprobeerd worden. Nu is de drempeltijd wel overschreden en zal de mail geaccepteerd worden (Zie Listing 3).

2019-01-30T14:02:44.619575+02:00 mailsrv1 postfix/smtpd[18531]: connect from aserp2130.company.com[201.101.167.12]

2019-01-30T14:02:45.250142+02:00 mailsrv1 postgrey[9271]: action=pass, reason=triplet found, delay=5993, client_name=aserp2130.company.com, client_address=201.101.167.12, sender=john.doe@company.com, recipient=arjan@mysite.nl

2019-01-30T14:02:45.861360+02:00 mailsrv1 postfix/local[18546]: 59495F208BB: to=<arjan@mysite.nl>, relay=local, delay=0.83, delays=0.73/0.01/0/0.09, dsn=2.0.0, status=sent (delivered to maildir)

Listing 3

 

Het postgrey pakket heeft ook nog een rapportage tool, te vinden met commando postgreyreport. Dit commando neemt als input een maillog file en maakt een analyse met betrekking tot het greylisting proces. Het is aan te raden om te werken met een maillog die al enkele uren oud is. Neem je een real-time maillog, dan is het mogelijk dat het gegenereerde rapport niet geheel accuraat is. Er kunnen namelijk mailservers zijn die nog niet volledige geverifieerd zijn.

 

Veel plezier met het drastisch verminderen van spam!