Hulpartikel overzicht

Hulpartikel

DKIM gebruiken met Postfix

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 CentOS, Ubuntu, of Debian 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:

apt -y install opendkim

CentOS:

yum -y install opendkim

 

Stap 3

Open vervolgens de DKIM-configuratie:

nano /etc/opendkim.conf

Stap 4

  • Pas in het bestand de 'Mode' aan onder 'configuration options' als volgt:
    Mode     sv
    Standaard staat OpenDKIM in verificatie-mode. Door de toevoeging 's' (sign) geef je aan dat OpenDKIM ook uitgaande berichten moet ondertekenen.
     
  • CentOS: Pas in hetzelfde bestand het mailadres aan onder ReportAddress en ontcommentarieer de regel, of voeg deze toe als die nog niet bestaat.
    ReportAddress "voorbeeld.nl postmaster" <postmaster@voorbeeld.nl>
    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.
     
  • Pas de 'Selector' aan als volgt:
    Selector key
    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
     
  • 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 /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
    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
     
  • 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:

domein dkim voorbeeld

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:

dkim cname voorbeeld

  • 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_a voorbeeld

  • 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.

Wil je dit artikel met andere gebruikers bespreken, laat dan vooral een bericht achter onder 'Reacties'.

Heb je ook een goed idee?

Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

Heeft dit artikel je geholpen?

Maak een account aan of log in om een beoordeling achter te laten.

Reacties

Maak een account aan of log in om een reactie te plaatsen.

0
hejvdb 27 maart 2023 (#9694)

Dank voor de SPF en DKIM artikelen. Ik kreeg steeds meer mail terug van gmail adressen. Nu lijkt dat een stuk minder. Dank! Egbert Jan

0
tremani 3 februari 2023 (#9490)

Mails werden pas gesigned met DKIM door het toevoegen van onderstaande aan TrustedHosts. Waarschijnlijk omdat mails eerst van de applicatie aan localhost worden afgeleverd.

127.0.0.1

::1

localhost

0
virtuals 4 oktober 2022 (#8897)

@ijsbrekerholding, chmod 0600 dkim.private.key

0
virtuals 4 oktober 2022 (#8894)

Ik liep hier tegen aan:

  1. Geef de juiste rechten aan de private key: chmod 0600 dkim.private.key

  2. In het bestand TrustedHosts worden IP-nummers, IP-ranges of het domein van je servers opgegeven. Bij het domein mag geen wildcard worden opgegeven. Voorbeeld bij servernamen die tot het domein test.lan behoren: .test.lan

0
Matthijs van Beek Admin 16 maart 2021 (#5490)

@keestux,

Bedankt voor je feedback en excuses voor de verlate reactie. Er bleek een bug te zitten in de manier waarop dit codeblock werd getoond: in de achterliggende code van dit artikel stonden er inderdaad spaties tussen bij stap 6, maar op de website werden die niet getoond. We hebben zojuist de pagina hierop aangepast.

0
keestux 27 februari 2021 (#5426)

Met behulp van gdb en de source code (lang leve Open Source !!!) is het gelukt om de fout te vinden. Zoals ik al eerder meldde is de instructie in Stap 6 verdacht.

Er ontbreekt een spatie (of TAB). Het moet zijn

key._domainkey.voorbeeld.nl    voorbeeld.nl:key:/etc/opendkim/keys/dkim.private.key

NB. de doc van opendkim wordt pas duidelijk als je het goed hebt

0
keestux 26 februari 2021 (#5421)

Het lukt me nog niet om een bericht te versturen. Ik heb alle stappen meermaals gecontroleerd. Een mail kan nu niet verzonden worden vanwege

Feb 26 21:04:45 bout3 opendkim[25322]: BC4DA178996: signing table references unknown key 'key._domainkey.ijzerbout.nl'

Ik heb nog niet gevonden hoe je opendkim kan debuggen. Het enige is het opendkim-testkey programma, en dat ziet er goed uit.

# opendkim-testkey -d ijzerbout.nl -s key -vvvvvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'key._domainkey.ijzerbout.nl'
opendkim-testkey: key secure
opendkim-testkey: key OK

De TXT record is ook goed.

# dig key._domainkey.ijzerbout.nl txt +short
"v=DKIM1; k=rsa; p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A...AdT4Njk/zSQrxHNfrNN5kCAwEAAQ=="

Tja, wat nu?

0
keestux 26 februari 2021 (#5420)

Hier is een commando om de hele pubkey op 1 regel te krijgen (zonder dat je een tekst editor nodig hebt)

echo $(sed -e '1d' -e '$d' dkim.public.key | tr -d '\n')
0
keestux 26 februari 2021 (#5419)

Dank voor de uitleg. Klopt het KeyTable voorbeeld in stap 6? De domain staat er namelijk dubbel

key._domainkey.voorbeeld.nlvoorbeeld.nl:key:/etc/opendkim/keys/dkim.private.key
0
Matthijs van Beek Admin 26 februari 2021 (#5415)

@ijsbrekerholding,

Zou ik je mogen vragen bij welk besturingssysteem liep je hier tegen aan liep en bij welke van deze commando's precies zodat wij het kunnen reproduceren?

Gebaseerd op de melding kun je het waarschijnlijk oplossen door de gebruiker postfix uit de opendkim groep te verwijderen en daarna met chmod 755 de rechten op directory aan te passen zodat alleen de opendkim gebruiker de bestanden kan schrijven.

0
ijsbrekerholding 11 februari 2021 (#5353)

De rechten (stap 15) werken niet helemaal goed.

opendkim: key._domainkey.XXX: key data is not secure: /etc/opendkim/keys/dkim.private.key is in group YYY which as multiple users (e.g., "postfix")

Kom je er niet uit?

Ontvang persoonlijke hulp van onze supporters

Neem contact op