Spammers proberen zich vaak uit te geven voor domeinen van derden door die te spoofen. Hoe bekender en vertrouwder de partij waar ze zich voor uitgeven, hoe groter de kans dat een ontvanger de spam leest.
Naast de nodige maatregelen als SPF-controle, kun je gebruik maken van DKIM. DKIM wordt gebruikt om de validiteit van de afzender van e-mails te kunnen controleren. Bij het verzenden van e-mails wordt met DKIM een digitale handtekening meegestuurd. Deze wordt gecontroleerd door middel van de sleutel (of key) die in het DKIM-record is opgenomen.
In deze tutorial laten wij zien hoe je uitgaande mail met DKIM ondertekent op een VPS met Postfix. Inkomende mail kun je automatisch laten scannen op DKIM met Spamassassin.
- Voor de stappen in deze handleiding is een VPS met Ubuntu, Debian, CentOS Stream, AlmaLinux of Rocky Linux met Postfix en Dovecot nodig. In deze handleiding leggen wij uit hoe je Postfix en Dovecot installeert en configureert. Wij gaan er voor deze handleiding vanuit dat je die handleiding hebt doorlopen.
- Voer de commando's in deze tutorial uit met sudo, of als root-user.
Stap 1
Verbind met je VPS via SSH of de VPS-console.
Stap 2
DKIM-support is niet standaard aanwezig in Postfix. Installeer daarom eerst OpenDKIM met:
Ubuntu & Debian:
apt -y install opendkim
CentOS Stream, AlmaLinux & Rocky Linux:
dnf -y install opendkim
Stap 3
Open vervolgens de DKIM-configuratie:
nano /etc/opendkim.conf
- Pas in het bestand de 'Mode' aan onder 'configuration options' als volgt:Standaard staat OpenDKIM in verificatie-mode. Door de toevoeging 's' (sign) geef je aan dat OpenDKIM ook uitgaande berichten moet ondertekenen.
Mode sv
-
CentOS: Pas in hetzelfde bestand het mailadres aan onder ReportAddress en ontcommentarieer de regel, of voeg deze toe als die nog niet bestaat.Binnenkomende mails met onjuiste DKIM-verificatie krijgen vanuit dit mailadres een bericht teruggestuurd met een failure raport. Let wel dat je het mailadres dat je hier gebruikt ook aan moet maken als die nog niet bestaat.
ReportAddress "voorbeeld.nl postmaster" <postmaster@voorbeeld.nl>
- Pas de 'Selector' aan als volgt:De selector is een symbolische naam voor het ondertekenen van je mail. Dit is ook de naam die in je DNS-records voor ._domainkey komt, bijvoorbeeld key._domainkey
Selector key
- Commentarieer tot slot de KeyFile locatie uit en ontcommentarieer de KeyTable, SigningTable, ExternalIgnoreList en InternalHosts (voeg de regels handmatig toe in Ubuntu / Debian) zodat de betreffende regels er uitzien als volgt:KeyFile bepaalt welk bestand normaal gesproken gebruikt wordt voor het ondertekenen van mail met DKIM. Dit werkt alleen voor een enkel domein die je onder #Domain instelt. Om meerdere verschillende domeinen met DKIM te ondertekenen gebruik je de KeyTable, SigningTable, ExternalIgnoreList en InternalHosts
#KeyFile /etc/opendkim/keys/dkim.private.key KeyTable /etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts
- Zoek naar de Socket variabele en pas de waarde aan als volgt:
Socket inet:8891@localhost
-
Ubuntu/Debian:Maak de /etc/opendkim/keys folder aan met:
mkdir -p /etc/opendkim/keys
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter). Gebruik je CentOS? Ga dan nu door naar stap 5.
Ubuntu & Debian:
De OpenDKIM-socket wordt niet alleen vanuit /etc/opendkim.conf, maar ook vanuit /etc/default/opendkim aangestuurd. Het is dan ook noodzakelijk om ook in dit bestand de socket aan te passen.
Open /etc/default/opendkim:
nano /etc/default/opendkim
Pas ook hier de socket-waarde aan naar:
Socket inet:8891@localhost
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 5
Open het bestand /etc/opendkim/KeyTable:
nano /etc/opendkim/KeyTable
Stap 6
Voeg voor ieder domein de onderstaande regel toe onderaan het bestand. Vervang voorbeeld.nl door de naam van je domein en key door de gewenste DKIM-selector.
key._domainkey.voorbeeld.nl voorbeeld.nl:key:/etc/opendkim/keys/dkim.private.key
Je bent vrij de locatie /etc/opendkim/keys/dkim.private.key aan te passen en voor ieder domein een unieke key te genereren. Let wel dat je daar dan rekening mee houdt in de volgende stappen.
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 7
Open vervolgens het bestand /etc/opendkim/SigningTable:
nano /etc/opendkim/SigningTable
Stap 8
Voeg onderaan het bestand voor ieder van je domeinen de volgende regel toe. Vervang hier ook 'key' door je DKIM-selector en voorbeeld.nl door je domeinnaam.
*@voorbeeld.nl key._domainkey.voorbeeld.nl
Dit vertelt OpenDKIM dat alle mail van @voorbeeld.nl door key._domainkey.voorbeeld.nl ondertekent moet worden.
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 9
Open tot slot het bestand /etc/opendkim/TrustedHosts:
nano /etc/opendkim/TrustedHosts
Stap 8
Voeg onderaan het bestand voor ieder van je domeinen de volgende regel toe. Vervang voorbeeld.nl door je domeinnaam.
*.voorbeeld.nl
Mail die naar je mailserver wordt verstuurd en gericht is aan domeinen in het TrustedHosts bestand, wordt niet gecontroleert op DKIM-geldigheid.
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 9
Ga naar de OpenDKIM keys-directory en genereer vervolgens een 4096 bit key voor het ondertekenen van je mail:
cd /etc/opendkim/keys
openssl genrsa -out dkim.private.key 4096
Je bent vrij de directory en de naam dkim.private.key aan te passen. Let wel dat je dezelfde directory en naam gebruikt in de volgende stappen.
Stap 10
Vervolgens extract je de public key uit de .key-file die je zojuist hebt aangemaakt met het commando:
openssl rsa -in dkim.private.key -out dkim.public.key -pubout -outform PEM
De public key neem je op in de DNS-records van de domeinen die via je mailserver mailen, zie de volgende stap.
Stap 11
Voor ieder domein waar je mail mee verstuurt vanaf je VPS, heb je een TXT-record nodig waarin de public key is opgenomen. In de vorige stap heb je een aparte .key-file gemaakt met daarin je public key. Print de inhoud van dit bestand met het commando:
cat /etc/opendkim/keys/dkim.public.key
De output ziet er als volgt uit:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQBAA4GNADCBiQKBgQDU4Fi7KotzLl789XQtY7nGU7Pd
sJ7tz1cTrr5JL6NNNO2bICv8rmm6fslxtk0nH0tvomsHY4d7A9IoCVog7QMs67Px
YXubn0sT2Ye5VtxkgHj6yaMpwUCMzQE1TzyLdnn6fYveRrTHBAeeGVE33svW/d1h
n11NKwcRxGtXveqc2QIDAQAB
-----END PUBLIC KEY-----
Kopieer de inhoud in een tekstverwerker (bijvoorbeeld notepad of TextEditor), verwijder de eerste en laatste regel (begin / end public key) en plaats de volledige inhoud op één regel zodat je een lange code krijgt zoals hieronder:
MIGfMA0GCSqGSIb3DQEBAQBAA4GNADCBiQKBgQDU4Fi7KotzLl789XQtY7nGU7PdsJ7tz1cTrr5JL6NNNO2bICv8rmm6fslxtk0nH0tvomsHY4d7A9IoCVog7QMs67PxYXubn0sT2Ye5VtxkgHj6yaMpwUCMzQE1TzyLdnn6fYveRrTHBAeeGVE33svW/d1hn11NKwcRxGtXveqc2QIDAQAB
Stap 12
Vervolgens maak je een TXT-record aan in de DNS-instellingen van ieder domein waar je mail voor verstuurt op je VPS met de syntax hieronder.
- naam: key._domainkey
- ttl: 5 min
- type: TXT
- waarde: v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAADCBiQKBgQDU4etcetera
- Vervang de waarde achter p= door de waarde van je public key die je in stap 11 hebt genoteerd.
- Mail je vanaf een subdomein? Dan wordt de naam van je DNS-record key._domainkey.jesubdomein.
In het TransIP-controlepaneel ziet het resultaat er bijvoorbeeld als volgt uit:
Sla je nieuwe record tot slot op. Het duurt daarna maximaal 24 uur (doorgaans niet langer dan een paar minuten) voor de wijzigingen verwerkt zijn. Dit komt door de wereldwijde verwerkingstijd van DNS-wijzigingen en hebben wij helaas geen invloed op.
Je kunt vervolgens de DKIM-key testen met het commando:
opendkim-testkey -d voorbeeld.nl -s key -vvv
Vervang hier 'voorbeeld.nl' door het domein waar je het DNS-record voor hebt toegevoegd en 'key' door de Selector (zie stap 6).
In Ubuntu/Debian kan het zijn dat je eerst de opendkim-tools moet installeren voor je dit commando kunt gebruiken. Dit doe je met:
apt -y install opendkim-tools
Stap 13
Nu OpenDKIM geconfigureerd is, stellen we Postfix in om het te kunnen gebruiken. Open de Postfix-configuratie met:
nano /etc/postfix/main.cf
Stap 14
Voeg onderaan het bestand de volgende code toe:
# Milter configuration for DKIM milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 15
OpenDKIM heeft geen toegang tot de certificaten voor het ondertekenen van de mail en Postfix geen toegang tot de OpenDKIM-groep. Je past dit aan met:
chown opendkim:opendkim /etc/opendkim/keys/ -R usermod -a -G opendkim postfix
Stap 16
Start en schakel tot slot OpenDKIM in en herstart Postfix:
systemctl start opendkim
systemctl enable opendkim
systemctl restart postfix
Public en private keys vernieuwen
In deze handleiding heb je met OpenSSL een public en private key gegenereerd. SSL-keys verlopen niet (in tegenstelling tot SSL-certificaten), maar om veiligheidsredenen is het aan te raden om van tijd tot tijd (bijvoorbeeld jaarlijks) je public en private key te vervangen.
Een relatief eenvoudige manier om dit te bereiken is door een constructie met meerdere DKIM-records. Wij gebruiken een dergelijke constructie ook voor TransIP en dit werkt als volgt:
Eerder in dit artikel hebben wij uitgelegd dat de DKIM-selector het eerste deel is van de naam van het DKIM-record. De selector 'key', geeft je dus de subdomeinnaam 'key._domainkey'. Stel dat je wil mailen namens voorbeeld.nl en het domein die je gebruikt als smtp/mx domein mijnmailserver.nl is .
In plaats van een TXT-record met de naam 'key._domainkey', maak je in de DNS-instellingen van ieder domein die mail verstuurt via je VPS (hier voorbeeld.nl) twee CNAME-records aan, bijvoorbeeld de volgende:
- Voor de DKIM-controle wordt in dit voorbeeld gekeken naar de waarde van key._domainkey.voorbeeld.nl. Dit komt doordat de dkim_selector op 'key' is ingesteld. key1._domainkey.voorbeeld.nl wordt op dit moment dus niet gebruikt.
- key._domainkey.voorbeeld.nl verwijst naar het subdomein dkim_a.mijnmailserver.nl. In de DNS-instellingen van mijnmailserver.nl maak je voor het subdomein dkim_a daadwerkelijk het TXT-record aan waar je public key in is opgenomen, dus bijvoorbeeld:
- dkim_b.mijnmailserver.nl hoef je op dit moment nog geen record voor aan te maken (wel key1._domainkey die ernaar verwijst). Dat doe je pas wanneer je je keys wil updaten.
Stel nu dat je je public en private key wil updaten. Je genereert dan een nieuwe key (zie stap 2), maar dan voor het dkim_b-record, bijvoorbeeld:
cd /etc/opendkim/keys/
openssl genrsa -out dkim_b.private.key
openssl rsa -in dkim_b.private.key -out dkim_b.public.key -pubout -outform PEM
Vervolgens maak je bij je SMTP-domein (hier mijnmailserver.nl) een TXT-record voor dkim_b aan met de public key die je zojuist hebt gemaakt. Wacht na het aanmaken van dit record voor de zekerheid 24 uur voor je verder gaat, zodat de DNS-wijziging de tijd heeft gehad om te propageren.
Nu pas je in de OpenDKIM-configuratie (/etc/opendkim.conf), /etc/opendkim/SigningTable en /etc/opendkim/KeyTable waar nodig de waarde van de private_key en dkim_selector aan, zodat die van key1 / dkim_b worden gebruikt, bijvoorbeeld:
Selector = key1
key1._domainkey.voorbeeld.nl voorbeeld.nl:key1:/etc/opendkim/keys/dkim.private.key
*@voorbeeld.nl key1._domainkey.voorbeeld.nl
Herstart daarna OpenDKIM en Postfix. Er wordt vanaf dat moment gebruik gemaakt van de key die is opgenomen in het DNS-record met de naam key1._domainkey, die op zijn beurt verwijst naar dkim_b.mijnmailserver.nl.
Herhaal deze stappen om nieuwe keys te genereren voor dkim.private.key en dkim.public.key, pas het TXT-record van dkim_a.mijnmailserver.nl aan naar de nieuwe public key, en zet daarna de dkim_selector terug op de waarde 'key'.
Daarmee zijn we aan het eind gekomen van deze handleiding over het gebruik van DKIM in Postfix. Mocht je aan de hand van deze handleiding nog vragen hebben, aarzel dan niet om onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.