SPF, DKIM en DMARC

Als het goed is heb je inmiddels Postfix geinstalleerd.

We gaan er nu eerst voor zorgen dat jouw mail niet als SPAM gezien wordt. Dat doen we door een SPF, DKIM en DMARC records te maken.

Wat zijn SPF, DKIM en DMARC-Records?

SPF en DKIM zijn 2 type records in de DNS zie helpen bij het voorkomen van email-spoofing, en daarmee voorkomen dat jouw mail in spamboxen terecht komt. Dat is geen garantie dat dat niet gebeurt, maar andersom, als je ze niet instelt, is het wel bijna een garantie dat jouw mails wel in die spambox komt.

SPF (Sender Policy Framework) record bewaken welke hosts of IP adressen mail mogen sturen namens het betreffende domein. Het is van belang dat je ervoor zorgt dat alleen vanaf jouw eigen mailserver of van die van jouw internetprovider mails mag sturen namens jouw domein.

DKIM (DomainKeys Identified Mail) stuurt een ‘sleutel’mee met de mail als handtekening. De ontvanger kan deze sleutel controleren aan de hand van de publieke sleutel die opgeslagen is in de DNS server.

Komt de mail door deze controles heen, dan wordt de mail gewoon afgeleverd. Klopt een van de controles niet, dan geeft het DMARC-record aan wat er met de mail moet gebeuren.

Het klinkt best ingewikkeld, maar eigenlijk valt het best mee.

Een SPF record in de DNS maken.

Voeg een TXT record toe in de DNS manager van jouw provider. Geef deze de naam ‘@’ met de waarde [codebox]v=spf1 mx ~all[/codebox]

[entrybox]

Naam                type    waarde               prio
@                   TXT     "v=spf1 mx ~all"    

[/entrybox]Of die aanhalingstekens ook ingevoerd moeten worden hangt van de provider af.

Een beetje uitleg:

  • v=spf1 geeft aan dat het een SPF record is, versie SPF1.
  • mx geeft aan dat alle hosts die vermeld zijn in het MX record mails mogen versturen van dit domein, en alle andere geblokkeerd dienen te worden.
  • ~all geeft aan dat mails van jouw domein afkomstig moeten zijn van de hosts die genoemd zijn in het SPF record. Emails van andere hosts worden gemarkeerd als onveilig.

Een DMARC record maken in de DNS.

Nu je toch met de DNS bezig bent, maak ook meteen het DMARC record aan. Voeg in je DNS een TXT-record toe. Geef deze de naam _dmarc en als waarde geef je mee: v=DMARC1; p=none; rua=mailto:reports@voorbeeld.nl

[entrybox]

Naam       type   waarde               
_dmarc     TXT    "v=DMARC1; p=none; rua=mailto:reports@voorbeeld.nl"    

[/entrybox]Nogmaals, of die aanhalingstekens ook ingevoerd moeten worden hangt dus van de provider af.

Een beetje uitleg hierbij:

  • v=DMARC1 betekent dat protocol versie DMARC1 gebruikt wordt.
  • p=none betekent dat we eigenlijk niets met deze informatie doen.
  • rua staat voor ‘reporting URI for aggregate report’. Dit mail adres geeft aan waar het rapport naartoe gestuurd moet worden. Vul hier een adres ie wat je zelf prettig vindt.

Policy none geeft aan dat de mails die niet door de controles komen wel vermeld worden in een rapport dat je op het aangegeven mailadres krijgt (eens per dag), maar dat er verder niets met deze mails gebeurt. De mails die niet door de SPF/Dkim testen komen, komen dus ook niet in je spambox terecht. Het is verstandig om dit een tijdje te bekijken en daarna te kiezen wat je met die mails wilt doen. Je kunt naast none ook quarantine of reject invullen. Bij quarentine wordt je mail afgeleverd in je spambox en bij reject zie je er nooit meer wat van terug. Wil je wat meer informatie, dan heeft Google daar een heel aardig overzicht van gemaakt.

De SPF Policy Agent configureren

We moeten natuurlijk ook onze eigen SMTP server vertellen dat deze moet controleren op het SPF record.

We hebben in het begin al de package hiervoor geinstalleerd. Dat is postfix-policyd-spf-python. We moeten deze nu instellen in de configuratie van Postfix.
[codebox]

sudo nano /etc/postfix/master.cf

[/codebox]
Voeg de volgende regels toe aan het eind van de file:
[codebox]

policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

[/codebox]
Sla de file op met <ctrl-x> gevolgd door een ‘Y’.

Vervolgens wijzigen we de main.cf file:
[codebox]

sudo nano /etc/postfix/main.cf

[/codebox]
Voeg deze regels toe aan het eind van de file:
[codebox]

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

[/codebox]
De eerste regel stelt de time-out in van de Postfix policy agent. De rest zorgt ervoor dat inkomende mails moeten voldoen aan de regels.

Sla de file op met <ctrl-x> gevolgd door een ‘Y’, en herstart Postfix
[codebox]

sudo systemctl restart postfix

[/codebox]

DKIM instellen.

Allereerst installeren we OpenDKIM, een open-source DKIM authenticatie systeem.
[codebox]

sudo apt install opendkim opendkim-tools

[/codebox]
Dan voegen we de postfix user toe aan de opendkim group.
[codebox]

sudo gpasswd -a postfix opendkim

[/codebox]
De configuratiefile van OpenDKIM aanpassen.
[codebox]

sudo nano /etc/opendkim.conf

[/codebox]
Zoek naar met <ctrl-w> naar “# Commonly-used options” en verwijder het # voor de volgende regels: Verander daarbij “simple” in “relaxed/simple”.
[codebox]

Canonicalization   simple <- veranderen in relaxed/simple
Mode               sv
SubDomains         no

[/codebox]
Voeg meteen daaronder de volgende regels toe:
[codebox]

AutoRestart         yes
AutoRestartRate     10/1M
Background          yes
DNSTimeout          5
SignatureAlgorithm  rsa-sha256

[/codebox]
En voeg deze regels toe aan het eind van de file.
[codebox]

#OpenDKIM user
# Remember to add user postfix to group opendkim
UserID             opendkim

# Map domains in From addresses to keys used to sign messages
KeyTable           /etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts

[/codebox]
Sla de file op met <ctrl-x> gevolgd door een ‘Y’

Signing- en key-tabel, en trusted hosts-file aanmaken

We maken eerst een mappenstructuur aan voor OpenDKIM
Maak opendkim de eigenaar en geef opendkim als enige lees en schrijfrechten in die mappen.
[codebox]

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

[/codebox]
Maak een file aan voor de signing tabel.
[codebox]

sudo nano /etc/opendkim/signing.table

[/codebox]
Voeg onderstaande regel toe. (vervang voorbeeld.nl door je eigen domeinnaam)
[codebox]

*@your-domain.com default._domainkey.your-domain

[/codebox]
Sla de file op met <ctrl-x> gevolgd door een ‘Y’

Maak een file aan voor de key tabel.
[codebox]

sudo nano /etc/opendkim/key.table

[/codebox]
Voeg onderstaande regel toe. (vervang voorbeeld.nl weer door je eigen domeinnaam)
[codebox]

default._domainkey.voorbeeld.nl    voorbeeld.nl:default:/etc/opendkim/keys/voorbeeld.nl/default.private

[/codebox]
Sla de file op met <ctrl-x> gevolgd door een ‘Y’

Vervolgens maken we de Trusted Hosts-file aan:
[codebox]

sudo nano /etc/opendkim/trusted.hosts

[/codebox]
Voeg onderstaande regel toe: (voorbeeld.nl natuurlijk vervangen door jouw domeinnaam.)
[codebox]

127.0.0.1
localhost

*.voorbeeld.nl

[/codebox]Sla de file op met <ctrl-x> gevolgd door een ‘Y’

Een “Private/Public Keypair” aanmaken.

Omdat DKIM gebruikt wordt om verzonden berichten te controleren moeten wij er natuurlijk voor zorgen dat er een ‘private key’ aangemaakt wordt die meegestuurd word in de mail, en een ‘public key’ die opgeslagen wordt in de DNS.

We maken een aparte map aan voor het domein:
[codebox]

sudo mkdir /etc/opendkim/keys/voorbeeld.nl

[/codebox]
Daarna gebruiken we de opendkim-genkey tool om de sleutels (keys) aan te maken.
[codebox]

sudo opendkim-genkey -b 2048 -d voorbeeld.nl -D /etc/opendkim/keys/voorbeeld.nl -s default -v

[/codebox]
Dit command maakt een 2048 bits sleutel aan. -d (domain) geeft aan om welk domein het gaat. -D geeft aan in welke map de sleutels worden opgeslagen. Als naam gebruiken we ‘default’, ook wel selector genoemd (-s).

De 2 sleutels worden opgeslagen als default.private en default.txt. Die laatste bevat de sleutel die we in de DNS moeten zetten.

Maakt opendkim eigenaar van de ‘private key’. (vergeet voorbeeld.nl niet te vervangen door jouw eigen domeinnaam)
[codebox]

sudo chown opendkim:opendkim /etc/opendkim/keys/voorbeeld.nl/default.private

[/codebox]

Sleutel toevoegen aan de DNS.

We kunnen de public key opvragen met het volgende commando:
[codebox]

sudo cat /etc/opendkim/keys/voorbeeld.nl/default.txt

[/codebox]
De tekst na de ‘p’ is de uiteindelijke sleutel.

We moeten de hele tekst hebben die tussen de ronde haken staat, maar daar moet nog wel wat mee gebeuren.

  • Kopieer de tekst tussen de ronde haken en plak die in een tekstverwerker (notepad of zo).
  • Verwijder nu alle aanhalingstekens en spaties/enter-tekens tussen die regels. Je hebt nu dus 1 hele lange regel.
  • Kopieer die regel en plak die weer in een DNS record. Geef dat record de naam default._domainkey ‘en maak het een type TXT.

[entrybox]

Naam                type    waarde               
default._domainkey  TXT     "v=DKIM1; k=rsa; p=(...)"    

[/entrybox]Let op, mogelijk moet die regel tussen aanhalingstekens staan, zoals eerder ook al besproken. Die mogen dan alleen aan het begin en aan het eind van de regel staan.

De configuratie testen

Voer het volgende commando uit om de instellingen te testen:
[codebox]

sudo opendkim-testkey -d voorbeeld.nl -s default -vvv

[/codebox]
Als alles goed is zie je:

[entrybox]key OK[/entrybox]

Mogelijk zie je oom dat de key ‘not secure’ is, maar dat is geen probleem.

Postfix aan OpenDKIM koppelen

Maak een map aan waar de ‘socket file’ van OpenDKIM opgeslagen wordt. Deze maakt het mogelijk voor de postfix-group om met de OpenDKIM-user te ‘praten’.
[codebox]

sudo mkdir /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim

[/codebox]
Wijzig daarna de OpenDkim-configuratie file:
[codebox]

sudo nano /etc/default/opendkim

[/codebox]
Zoek de eerste ‘SOCKET’-regel. Als daar nog een # voor staat, dan mag je dat # verwijderen. Vervang de regel dan door deze:
[codebox]

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

[/codebox]
De file ziet er dan zo uit:[entrybox]# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=””
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
# default:
SOCKET=”local:/var/spool/postfix/opendkim/opendkim.sock”
# listen on all interfaces on port 54321:
#SOCKET=”inet:54321″
# listen on loopback on port 12345:
#SOCKET=”inet:12345@localhost”
# listen on 192.0.2.1 on port 12345:
#SOCKET=”inet:12345@192.0.2.1″[/entrybox]
Sla de file op.
Pas nu nog de Postfix main-configuration file aan:
[codebox]

sudo nano /etc/postfix/main.cf

[/codebox]
Voeg deze regels toe na het “smtpd_recipient_restriction”gedeelte.
[codebox]

# Milter configuration
# OpenDKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock

[/codebox]
Sla de file op met <ctrl-x> gevolgd door een ‘Y’, en herstart OpenDKIM en Postfix
[codebox]

sudo systemctl restart opendkim
sudo systemctl restart postfix

[/codebox]

Controle!

Om de instellingen van jouw mailserver nu te controleren kun je een mail sturen naar ‘Mail-tester.com’.
Ga naar ‘www.mail-tester.com’. Daar krijg je een mailadres te zien waar je een mailtje naartoe moet sturen. Vervolgens krijg je een rapport-cijfer te zien met daarbij alle afwijkingen in je mail. Je ziet dan ook of je DNS instellingen goed zijn, en je SPF, DKIM en DMARC geaccepteerd worden.

Je stuurt heel eenvoudig de mail met [codebox]echo “test mailtje” | sendmail <uniek-nummer>@mail-tester.com[/codebox]