Bots en andere kwaadwillenden sturen veel spam per e-mail. Hierbij proberen ze kwetsbaarheden op servers (e.g. je VPS) uit te buiten om spam te versturen vanaf een geïnfecteerde mailserver. Het is dan ook belangrijk om naast een goede algemene beveiliging van je VPS om op je mailserver anti-spam software te gebruiken.
In deze tutorial laten wij zien hoe je voor een mailserver met Exim en Dovecot gebruik maakt van SpamAssassin als spam-beveiliging.
- Voor de stappen in deze handleiding is een VPS met CentOS Stream, AlmaLinux of Rocky Linux met daarop Exim en Dovecot nodig. In deze handleiding leggen wij uit hoe je Exim en Dovecot opzet. Wij gaan er in deze handleiding vanuit dat je die handleiding hebt doorlopen.
- Voer de commando's in dit artikel uit met sudo, of als root-user.
Spamassassin in het kort
Spamassassin scant mail op elementen die het herkent als mogelijke kenmerken van spam, denk hierbij aan zaken als:
- Een kleine hoeveelheid tekst in verhouding tot het aantal afbeeldingen in een mail
- Een onderwerp van de mail dat uit hoofdletters bestaat
- Een ongeldig of afwezig DKIM-record (steeds meer partijen laten mail automatisch als spam tegenhouden als het geen DKIM heeft, zie ook deze handleiding)
- etc.
Wanneer Spamassassin dit soort kenmerken ziet, geeft het een score voor dat kenmerk. De score is hoger wanneer het specifieke kenmerk vaak in spam terug komt. Spamassassin telt alle scores op en als het een vooraf ingestelde waarde bereikt, wordt de mail als spam tegengehouden.
Spamassassin installeren en configureren
Stap 1
Verbind met je VPS via SSH of de VPS-console in het TransIP-controlepaneel.
Stap 2
Installeer SpamAssassin met:
dnf -y install spamassassin
Stap 3
Open vervolgens de configuratie van Exim:
nano /etc/exim/exim.conf
Stap 4
In deze stap voeg je enkele routers toe in de Exim-configuratie voor SpamAssassin (zie de toelichting onderaan deze stap). Zoek naar de 'userforward'-router, deze begint met de volgende code:
userforward:
driver = redirect
check_local_user
Voeg onder de 'userforward'-router een anti-spam router toe (het is belangrijk dat de anti_spam router voor de router(s) staan die de aflevering verzorgen):
anti_spam:
driver = accept
condition = ${if and { {<{$message_size}{256K}} {!def:header_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}}} {1}{0}}
headers_remove = X-Spam-Flag:X-Spam-Report:X-Spam-Status:X-Spam-Level:X-Spam-Checker-Version
transport = antispam
Kopieer daarna de router die je gebruikt voor het afleveren van mail en geef deze de naam 'anti_spam_delivery'. Heb je onze Exim-handleiding gevolgd voor de installatie en configuratie van Exim? Dan kopieer je de router met de naam 'virtual_router'.
Plaats de kopie direct onder de 'anti_spam'-router en voeg daarin de volgende code toe:
condition = ${if and { {def:h_X-Spam-Flag:} {eq {$h_X-Spam-Flag:}{YES}}} }
Het resultaat ziet er dan als volgt uit:
anti_spam_delivery:
driver = accept
condition = ${if and { {def:h_X-Spam-Flag:} {eq {$h_X-Spam-Flag:}{YES}}} }
require_files = +/home/vmail/$local_part@$domain/
transport = antispam_delivery
Toelichting anti_spam & antispam_delivery
Door de anti_spam router na de routers die gaan over forwards/out-of-office etc en voor eventuele delivery routers (e.g. de virtual_router en localuser routers) te plaatsen, wordt alle inkomende mail eerst langs de spam_check router gestuurd, die de antispam transport gebruikt om Spamassassin de controle te laten uitvoeren. Na de spamcontrole wordt de mail doorgestuurd naar de routers die het afleveren verzorgen.
Het voordeel van deze structuur is dat Spamassassin aardig wat resources gebruikt. Voer je de SpamAssassin controle direct op inkomende mail uit in plaats van de mail apart langs een spam router/transport te halen, dan zou dat een extra aanvalspunt op je server opleveren waarbij je resources sneller overbelast worden.
anti_spam
- condition= ${if etc: scant alle mail van 256k en kleiner (je kunt dit ook aanpassen naar bijvoorbeeld 512k) die nog niet gescand zijn door SpamAssassin.
- driver=accept: als aan de gestelde condities wordt voldaan, wordt de transport antispam gebruikt.
- headers_remove etc: verwijdert alle X-Spam-* headers uit de inkomende mail. Die moeten namelijk nog toegevoegd worden maar kunnen al aanwezig zijn als een malafide partij probeert je spambeveiliging te misleiden.
anti_spam_delivery
Deze router werkt hetzelfde als de reguliere 'virtual-router'-router, met een toevoeging:
condition = ${if and { {def:h_X-Spam-etc: zorgt ervoor dat als de mail is gecontroleerd op spam, deze wordt geleverd aan de anti_spam_delivery transport.
Stap 5
Naast deze nieuwe routers heb je ook nieuwe transports nodig voor het leveren van de mail. Scroll door naar de 'TRANSPORTS CONFIGURATION' en voeg de 'antispam'-transport toe op een willekeurige plek, bijvoorbeeld boven of onder de 'local_delivery'-transport:
antispam:
driver = pipe
command = /usr/sbin/exim -oMr spam-scanned -bS
use_bsmtp
transport_filter = /usr/bin/spamc -u $local_part@$domain
home_directory = /tmp
current_directory = /tmp
Kopieer daarna de transport die je gebruikt voor het afleveren van mail en geef deze de naam 'antispam_delivery'. Heb je onze Exim-handleiding gevolgd voor de installatie en configuratie van Exim? Dan kopieer je de transport met de naam 'virtual_delivery'.
Het resultaat ziet er als volgt uit:
antispam_delivery:
driver = appendfile
directory = /home/vmail/$local_part@$domain/.SPAM/
maildir_format
delivery_date_add
envelope_to_add
return_path_add
user = vmail
group = vmail
mode = 0660
mode_fail_narrower = false
Toelichting antispam-transport
De antispam-transport gebruikt een driver van het type 'pipe', waardoor deze afgeleverd kan worden aan een commando. In dit geval gaat het om commando onder 'command =' waarmee de spamcontrole wordt uitgevoerd en het aanvullende spamfilter dat daarbij gebruikt wordt via het spamc-commando.