E-mail & DNS Hardening
Rechten Omlaag, Controle Omhoog
Aanvalspaden worden klein zodra rechten, segmenten en beheerkanalen consequent zijn ingericht.
Voor E-mail & DNS Hardening blijft de basis hetzelfde: minder impliciet vertrouwen en meer zicht op afwijkend gedrag.
Zo beperk je niet alleen de kans op incidenten, maar vooral ook de omvang en duur als er iets misgaat.
Directe maatregelen (15 minuten)
Waarom dit telt
De kern van E-mail & DNS Hardening is risicoreductie in de praktijk. Technische context ondersteunt de maatregelkeuze, maar implementatie en borging staan centraal.
SPF (Sender Policy Framework)
SPF is het eerste mechanisme dat voorkomt dat aanvallers e-mails versturen namens jouw domein. Het werkt simpel: je publiceert een DNS TXT-record dat beschrijft welke mailservers namens jouw domein mogen verzenden. De ontvangende mailserver controleert of de afzendende server in dat lijstje staat.
Hoe SPF werkt
De afzender stuurt een e-mail, de ontvangende server doet een DNS
TXT-lookup op het domein van de envelope-from, en controleert of het
IP-adres van de afzender in het SPF-record staat. Resultaat:
pass, fail, softfail, of
neutral.
example.com. IN TXT "v=spf1 <mechanisms> <qualifier>all"
Mechanisms
| Mechanism | Beschrijving | Voorbeeld |
|---|---|---|
ip4 |
IPv4-adres of CIDR-range | ip4:192.0.2.0/24 |
ip6 |
IPv6-adres of CIDR-range | ip6:2001:db8::/32 |
include |
Verwijst naar SPF-record van ander domein | include:_spf.google.com |
a |
A-record van het domein zelf | a |
mx |
MX-records van het domein | mx |
exists |
DNS A-lookup op opgegeven domein | exists:%{i}._spf.example.com |
redirect |
Vervangt SPF-record door dat van ander domein | redirect=_spf.example.com |
Qualifiers
| Qualifier | Betekenis | Resultaat |
|---|---|---|
+ (default) |
Pass – afzender is geautoriseerd | Accept |
- |
Hard fail – afzender is niet geautoriseerd | Reject |
~ |
Soft fail – afzender is waarschijnlijk niet geautoriseerd | Accept maar markeer |
? |
Neutral – geen uitspraak | Accept |
~all vs -all
Het verschil is cruciaal:
# Soft fail -- verdachte mail wordt nog steeds afgeleverd (vaak in spam)
example.com. IN TXT "v=spf1 include:_spf.google.com ~all"
# Hard fail -- niet-geautoriseerde mail wordt geweigerd
example.com. IN TXT "v=spf1 include:_spf.google.com -all"
Gebruik altijd -all in productie.
~all is bedoeld als tijdelijke instelling tijdens de
uitrol, niet als permanent beleid. Toch draaien de meeste organisaties
jarenlang op ~all omdat “het werkt” en niemand het ooit
aanpast.
Voorbeelden voor veelgebruikte setups
Office 365:
example.com. IN TXT "v=spf1 include:spf.protection.outlook.com -all"
Google Workspace:
example.com. IN TXT "v=spf1 include:_spf.google.com -all"
Self-hosted (Postfix op 203.0.113.25):
example.com. IN TXT "v=spf1 ip4:203.0.113.25 mx -all"
Gecombineerd (O365 + marketingtool + eigen server):
example.com. IN TXT "v=spf1 include:spf.protection.outlook.com include:mail.marketingtool.com ip4:203.0.113.25 -all"
Veelgemaakte fouten
- Te veel DNS lookups: SPF staat maximaal 10 lookups
toe (
include,a,mx,exists,redirect). Overschrijd je dit, dan faalt de hele SPF-check. Gebruikip4/ip6waar mogelijk. - Te permissief:
v=spf1 +allautoriseert de hele wereld om namens jouw domein te mailen. - Geen SPF voor subdomeinen: Aanvallers gebruiken subdomeinen zonder SPF-record voor phishing.
DKIM (DomainKeys Identified Mail)
DKIM voegt een cryptografische handtekening toe aan uitgaande e-mails. De ontvangende server verifieert de handtekening met een publieke sleutel die in DNS staat. Hiermee kan de ontvanger vaststellen dat het bericht daadwerkelijk afkomstig is van het geclaimde domein en onderweg niet is gewijzigd.
Hoe DKIM werkt
- De verzendende mailserver berekent een hash van specifieke headers en de body
- De hash wordt ondertekend met een private key
- De handtekening wordt toegevoegd als
DKIM-Signatureheader - De ontvanger haalt de publieke sleutel op uit DNS:
selector._domainkey.example.com - De ontvanger verifieert de handtekening
DNS-record
selector1._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
De selector is een vrij te kiezen naam (bijv.
s1, google, selector1) waarmee je
meerdere DKIM-keys kunt gebruiken – handig voor key rotation.
Key length
Gebruik minimaal 2048 bits. RSA 1024-bit keys worden
als onveilig beschouwd. Sommige organisaties stappen over op Ed25519
(k=ed25519), maar de ondersteuning hiervoor is nog
beperkt.
Dit produceert twee bestanden: - selector1.private – de
private key (op de mailserver) - selector1.txt – het DNS
TXT-record (publiceer in DNS)
Key rotation
Draai je DKIM-keys minstens jaarlijks: genereer een nieuw keypair met een nieuwe selector, publiceer het DNS-record, wacht op propagatie, schakel de mailserver over, en verwijder het oude record na 48 uur.
OpenDKIM configuratie
# /etc/opendkim.conf
Syslog yes
Domain example.com
KeyFile /etc/opendkim/keys/selector1.private
Selector selector1
Socket inet:8891@localhost
Canonicalization relaxed/simple
Mode sv
SubDomains yes
AutoRestart yes
MinimumKeyBits 2048DMARC (Domain-based Message Authentication)
DMARC bouwt voort op SPF en DKIM. Het vertelt ontvangende mailservers wat ze moeten doen als een bericht faalt op zowel SPF als DKIM, en waar ze rapportages naartoe moeten sturen.
Hoe DMARC SPF en DKIM combineert
DMARC vereist alignment – het domein in de
From:-header moet overeenkomen met: - Het domein dat door
SPF is gevalideerd (envelope-from), of - Het domein
waarvoor DKIM heeft ondertekend (d= parameter)
Als geen van beide aligned is, faalt DMARC – ongeacht of SPF en DKIM individueel slagen.
Policy levels
| Policy | Actie | Gebruik |
|---|---|---|
p=none |
Doe niets, stuur alleen rapportages | Fase 1: monitoring |
p=quarantine |
Plaats in spam/quarantaine | Fase 2: testen |
p=reject |
Weiger het bericht | Fase 3: productie |
Uitrolstrategie
Rol DMARC gefaseerd uit. Ga niet direct naar
p=reject, tenzij je graag wilt ontdekken welke systemen
allemaal namens jouw domein mailen.
Fase 1 – Monitoring (2-4 weken):
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; fo=1"
Fase 2 – Quarantine met percentage (2-4 weken):
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc-reports@example.com"
Fase 3 – Quarantine 100% (2 weken):
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
Fase 4 – Reject (einddoel):
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; fo=1"
Rapportages
| Tag | Type | Beschrijving |
|---|---|---|
rua |
Aggregate | Dagelijkse XML-rapporten met statistieken over alle mailverkeer |
ruf |
Forensic | Gedetailleerde meldingen per gefaald bericht (niet alle providers sturen deze) |
fo=1 |
Failure options | Stuur forensic report als SPF of DKIM faalt (niet alleen als beide falen) |
Subdomein-policy
Vergeet subdomeinen niet. Zonder sp=reject erft een
subdomein het hoofdbeleid, maar een aanvaller kan subdomeinen gebruiken
die niet in je SPF-record staan:
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc-reports@example.com"
DMARC reporting tools
Handmatig XML-rapporten parsen is onbegonnen werk. Gebruik een tool als parsedmarc (open source, lokaal draaien), dmarcian (SaaS, free tier), DMARC Analyzer, of Postmark DMARC (gratis wekelijkse samenvattingen).
DNSSEC
DNSSEC beschermt tegen DNS spoofing en cache poisoning door DNS-antwoorden cryptografisch te ondertekenen. Zonder DNSSEC kan een aanvaller vervalste DNS-antwoorden injecteren en verkeer omleiden naar een kwaadaardige server – inclusief je MX-records.
Hoe DNSSEC werkt
| Record type | Functie |
|---|---|
RRSIG |
Digitale handtekening over een DNS record set |
DNSKEY |
Publieke sleutel waarmee RRSIG-records worden geverifieerd |
DS |
Hash van de DNSKEY, gepubliceerd in de bovenliggende zone (delegation signer) |
NSEC/NSEC3 |
Bewijst dat een domein niet bestaat (authenticated denial of existence) |
De vertrouwensketen loopt van de root zone (.) via de
TLD (.nl, .com) naar jouw domein. Elke laag
bevat een DS-record dat verwijst naar de DNSKEY van de onderliggende
zone.
Hoe activeren
Bij je DNS-provider/registrar: De meeste grote registrars (TransIP, Cloudflare, Route 53) ondersteunen DNSSEC met een enkele knop. Activeer het en de provider regelt automatisch het DS-record bij de TLD.
Self-hosted (BIND): Genereer een ZSK en KSK met
dnssec-keygen, onderteken de zone metdnssec-signzone, en publiceer het DS-record bij je registrar.
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.com # ZSK
dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK example.com # KSK
dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) \
-N INCREMENT -o example.com -t db.example.comValidatie testen
# Controleer of DNSSEC-signatures aanwezig zijn
dig +dnssec example.com A
# Kijk naar de 'ad' (Authenticated Data) flag in het antwoord
dig +dnssec +multi example.com SOA
# Uitgebreide DNSSEC-validatie
delv @1.1.1.1 example.com A +rtrace
# Online test
# https://dnssec-analyzer.verisignlabs.com/Let op: een verkeerd geconfigureerd DNSSEC maakt je domein volledig onbereikbaar. Test grondig in een staging-omgeving.
DNS-filtering en sinkholing
DNS-filtering blokkeert verbindingen naar bekende malware- en phishing-domeinen door het DNS-antwoord te manipuleren. In plaats van het echte IP-adres terug te geven, krijgt de client een geblokkeerd-pagina of een NXDOMAIN.
Response Policy Zone (RPZ)
RPZ is een standaard voor DNS-firewalling. Je laadt een lijst met kwaadaardige domeinen in je DNS-resolver, en elke query voor die domeinen wordt geblokkeerd:
# /etc/bind/rpz.db
$TTL 300
@ IN SOA localhost. admin.localhost. (
2024010101 3600 600 86400 300 )
IN NS localhost.
; Blokkeer specifiek domein
malware-c2.evil.com CNAME . ; NXDOMAIN
*.malware-c2.evil.com CNAME . ; inclusief subdomeinen
; Redirect naar sinkhole
phishing.example.com A 127.0.0.1
Oplossingen voor organisaties
| Oplossing | Type | Geschikt voor |
|---|---|---|
| Pi-hole | Self-hosted (blocklists) | Klein netwerk, lab |
| NextDNS | SaaS (AI + lijsten) | MKB |
| Quad9 (9.9.9.9) | Gratis resolver (threat intel) | Iedereen |
| Cloudflare Gateway | SaaS (zero trust) | Enterprise |
| Cisco Umbrella | SaaS (uitgebreid) | Enterprise |
Sinkholing
Bij sinkholing wijs je kwaadaardige domeinen naar een interne server die het verzoek logt. Elk systeem dat probeert een C2-domein te resolven verschijnt in je logs – ideaal voor het detecteren van geinfecteerde hosts:
# Unbound sinkhole configuratie
local-zone: "malware-c2.evil.com" redirect
local-data: "malware-c2.evil.com A 10.0.0.100"Aanvullende DNS-hardening
DoH (DNS over HTTPS) en DoT (DNS over TLS)
Standaard DNS-verkeer is onversleuteld (poort 53/UDP). Iedereen op het netwerk kan meelezen. DoH en DoT versleutelen DNS-queries:
| Protocol | Poort | Voordeel | Nadeel |
|---|---|---|---|
| DoT | 853/TCP | Makkelijk te filteren op netwerkniveau | Zichtbaar als DoT-verkeer |
| DoH | 443/TCP | Ononderscheidbaar van HTTPS-verkeer | Moeilijk te monitoren/blokkeren |
Voor interne netwerken is DoT vaak de betere keuze – je kunt het wel monitoren via de netwerklaag. DoH is lastiger omdat het over poort 443 loopt, dezelfde poort als al het andere HTTPS-verkeer.
# Unbound DoT configuratie (als forwarder)
server:
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
forward-zone:
name: "."
forward-tls-upstream: yes
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 9.9.9.9@853#dns.quad9.netZone transfer beperken (AXFR)
Een open zone transfer lekt je volledige DNS-zone – alle hostnamen, IP-adressen, MX-records. Beperk AXFR tot je secundaire nameservers:
# BIND - named.conf
zone "example.com" {
type master;
file "db.example.com";
allow-transfer { 198.51.100.10; 198.51.100.11; }; # Alleen secundaire NS
also-notify { 198.51.100.10; 198.51.100.11; };
};
Test of je zone transfer daadwerkelijk geblokkeerd is:
DNS-recursie uitschakelen op autoritatieve servers
Autoritatieve nameservers moeten geen recursie toestaan. Laat recursie alleen toe op je interne resolvers:
# BIND - op de autoritatieve server
options {
recursion no;
allow-query { any; };
};
# BIND - op de interne resolver
options {
recursion yes;
allow-recursion { 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
};
MTA-STS (Mail Transfer Agent Strict Transport Security)
MTA-STS dwingt af dat inkomende mailservers TLS gebruiken bij het afleveren van e-mail, en voorkomt daarmee TLS-downgrade aanvallen. Configuratie vereist een DNS TXT-record en een policy-bestand:
_mta-sts.example.com. IN TXT "v=STSv1; id=20240101T000000"
Het policy-bestand op
https://mta-sts.example.com/.well-known/mta-sts.txt:
version: STSv1
mode: enforce
mx: mail.example.com
max_age: 86400
DANE (DNS-based Authentication of Named Entities)
DANE gebruikt DNSSEC om TLS-certificaten te binden aan DNS-namen via TLSA-records. Hiermee kun je specificeren welk certificaat een mailserver moet presenteren:
_25._tcp.mail.example.com. IN TLSA 3 1 1 a]b]c]d]e]f]... (SHA-256 hash van certificaat)
DANE vereist een werkende DNSSEC-configuratie. Zonder DNSSEC heeft DANE geen enkele waarde.
TLS-RPT (SMTP TLS Reporting)
Vergelijkbaar met DMARC-rapportages, maar dan voor TLS-fouten bij
mailaflevering. Publiceer een _smtp._tls TXT-record met een
rua-adres om meldingen te ontvangen wanneer
TLS-verbindingen falen.
_smtp._tls.example.com. IN TXT "v=TLSRPTv1; rua=mailto:tls-reports@example.com"
De cynische noot
Phishing is al tien jaar de nummer-1 aanvalsvector. Niet nummer twee. Niet “een van de” vectoren. Nummer. Een. Elke pentest, elke red team-oefening, elke breach-analyse – phishing staat bovenaan. En de technologie om het te stoppen bestaat. SPF is er sinds 2006. DKIM sinds 2007. DMARC sinds 2012. Meer dan tien jaar geleden.
En toch draait minstens de helft van alle organisaties zonder
fatsoenlijk DMARC-record. Of ze hebben p=none en denken dat
ze beschermd zijn. p=none doet letterlijk niets. Het is het
equivalent van een beveiligingscamera die wel opneemt maar die niemand
bekijkt.
Het mooiste zijn de organisaties die een e-mail security gateway kopen voor tweehonderdduizend euro – met sandboxing, AI-detectie, URL-rewriting, en een dashboard dat eruitziet alsof het de NASA mission control is – maar vergeten een DMARC-record in te stellen. Dat is alsof je een gepantserde deur koopt voor je huis maar het keukenraam openlaat. De technologie die gratis is en uit drie DNS-records bestaat, is te moeilijk. Maar een appliance die een eigen rack nodig heeft, die willen we wel.
De waarheid is simpel: alles wat geen vendor-demo heeft, geen
sales-lunch oplevert, en geen mooi dashboard heeft, wordt niet
geimplementeerd. SPF/DKIM/DMARC is gratis, dus het is niemands project.
DNSSEC is een DNS-instelling, dus het valt tussen beheer en security in
het niemandsland van “dat doet de ander wel.” En ondertussen stuurt een
aanvaller vanuit een willekeurig IP-adres e-mails namens jouw CEO, omdat
jouw domein ~all heeft in plaats van -all en
je DMARC-policy op none staat. Maar hey, die email gateway
heeft de phish wel gedetecteerd – in de demo.
Veelvoorkomende fouten
| # | Fout | Risico | Oplossing |
|---|---|---|---|
| 1 | Geen SPF-record | Iedereen kan mailen namens jouw domein | Publiceer SPF met -all |
| 2 | SPF met ~all in productie |
Spoofed mail wordt afgeleverd (als spam) | Wijzig naar -all |
| 3 | Meer dan 10 DNS lookups in SPF | SPF-check faalt volledig (PermError) | Gebruik ip4/ip6, flatten includes |
| 4 | DKIM met 1024-bit key | Key kan gekraakt worden | Genereer 2048-bit (of hoger) keypair |
| 5 | DMARC op p=none als einddoel |
Geen bescherming, alleen monitoring | Uitrollen naar p=reject |
| 6 | Geen DMARC-record | Geen controle over spoofing-beleid | Publiceer DMARC, begin met p=none |
| 7 | Subdomeinen zonder SPF/DMARC | Aanvallers gebruiken subdomeinen voor spoofing | sp=reject in DMARC, SPF per subdomein |
| 8 | Open zone transfer (AXFR) | Volledige DNS-zone lekt naar aanvallers | allow-transfer beperken |
| 9 | Recursie op autoritatieve DNS | DNS-amplification aanvallen, cache poisoning | recursion no op autoritatieve servers |
| 10 | Geen DNSSEC | Kwetsbaar voor DNS spoofing/cache poisoning | Activeer DNSSEC bij registrar |
| 11 | DKIM-keys nooit roteren | Vergroot risico bij key compromise | Jaarlijkse key rotation |
| 12 | Geen MTA-STS | TLS-downgrade aanvallen op mailverkeer | Publiceer MTA-STS policy |
| 13 | Geen TLS-RPT | Geen zicht op TLS-problemen bij mailaflevering | Publiceer _smtp._tls TXT-record |
| 14 | DMARC-reports niet analyseren | Geen zicht op spoofing-pogingen | Gebruik parsedmarc of SaaS-tool |
| 15 | DNS over plain UDP intern | DNS-queries afluisterbaar op het netwerk | Implementeer DoT voor interne resolvers |
Checklist
| # | Maatregel | Prioriteit | Complexiteit | Status |
|---|---|---|---|---|
| 1 | SPF-record met -all publiceren |
Kritiek | Laag | ☐ |
| 2 | DKIM inschakelen (2048-bit) | Kritiek | Middel | ☐ |
| 3 | DMARC uitrollen (none -> quarantine
-> reject) |
Kritiek | Middel | ☐ |
| 4 | DMARC sp=reject voor subdomeinen |
Hoog | Laag | ☐ |
| 5 | DMARC-rapportages monitoren | Hoog | Middel | ☐ |
| 6 | DNSSEC activeren | Hoog | Laag-Middel | ☐ |
| 7 | Zone transfers beperken (AXFR) | Hoog | Laag | ☐ |
| 8 | Recursie uitschakelen op autoritatieve servers | Hoog | Laag | ☐ |
| 9 | DNS-filtering implementeren (RPZ/Quad9/NextDNS) | Hoog | Middel | ☐ |
| 10 | MTA-STS configureren | Middel | Middel | ☐ |
| 11 | DANE/TLSA-records publiceren | Middel | Hoog | ☐ |
| 12 | DoT/DoH voor interne resolvers | Middel | Middel | ☐ |
| 13 | TLS-RPT inschakelen | Middel | Laag | ☐ |
| 14 | DKIM key rotation procedure | Middel | Middel | ☐ |
| 15 | DNS sinkholing voor C2-detectie | Middel | Middel | ☐ |
| 16 | SPF-record valideren (< 10 lookups) | Hoog | Laag | ☐ |
Samenvatting
E-mail en DNS vormen samen het fundament van vrijwel alle zakelijke
communicatie, en daarmee ook het primaire aanvalsoppervlak voor
phishing, spoofing en man-in-the-middle aanvallen. De verdediging
bestaat uit lagen: SPF vertelt wie er mag mailen, DKIM bewijst dat het
bericht authentiek is, en DMARC combineert beide en definieert het
handhavingsbeleid. DNSSEC beschermt de DNS-infrastructuur zelf tegen
manipulatie. Aanvullende maatregelen als MTA-STS, DANE, DNS-filtering en
sinkholing maken de keten compleet. Geen van deze technologieen is
nieuw, geen is bijzonder complex, en de meeste zijn gratis. Het enige
wat ontbreekt is de discipline om ze in te richten, te testen, en door
te zetten tot p=reject. Drie DNS-records scheiden je domein
van een phishing-paradijs en een goed beschermde mailinfrastructuur. De
keuze is niet moeilijk – de uitvoering blijkbaar wel.
In het volgende hoofdstuk behandelen we MSSQL hardening: hoe je SQL Server-instanties beveiligt tegen misbruik van xp_cmdshell, linked servers, en credential harvesting via UNC path injection.
Verder lezen in de kennisbank
Deze artikelen in het portaal geven je meer achtergrond en praktische context:
- Firewalls — de uitsmijter die niet alles tegenhoudt
- Netwerksegmentatie — waarom je niet alles aan alles moet knopen
- DNS — het telefoonboek dat het internet bij elkaar houdt
- Logging en monitoring — de bewakingscamera's van je IT-omgeving
- Zero Trust — vertrouw niemand, ook jezelf niet
Je hebt een account nodig om de kennisbank te openen. Inloggen of registreren.
Gerelateerde securitymaatregelen
Deze artikelen bieden aanvullende context en verdieping: