SPF oder DKIM

Seit geraumer Zeit bekomme ich wiederholt Meldungen, dass E-Mails von Konten bei Suchmaschine oder anderen IT Anbietern nicht mehr angenommen werden. Stattdessen kommen Meldungen wie diese zurück:

Remote-MTA: dns; suchmaschine-smtp-in.l.suchmaschine.com
Diagnostic-Code: smtp; 550-5.7.26 This mail is unauthenticated, which poses a security risk to the 550-5.7.26 sender and xyz users, and has been blocked. The sender must 550-5.7.26 authenticate with at least one of SPF or DKIM.

Über Sinn oder Unsinn solcher Maßnahmen, die angeblich Spam verhindern sollen, lässt sich streiten, denn auch Spammer werden wissen, wie man einen „Sender Policy Framework Record“, also „SPF Eintrag“, vornimmt. Das hat mir zwar schon den einen oder anderen Auftrag beschert, aber als Trittbrettfahrer großer Konzerne sein Geld zu verdienen, fühlt sich unlauter an.

Damit die Mails wieder ausgeliefert werden, muss bei dem Provider, dem die Homepage und der Mail Account obliegt, der erwähnte SPF Record eingetragen werden. Die Vorgehensweise ist bei den Anbietern von Mail- oder Homepage Konten unterschiedlich. Lösungen lassen sich recht schnell über die problemverursachende Suchmaschine oder den anbietenden Provider selbst finden. Sind am Ende alle Einträge richtig gemacht worden, sollte der „dig domain.de txt“ Befehl folgend Ausgabe bringen, wobei die Zeile mit „v=spf1 mx […]“ entscheidend ist:

dig xyz.de txt

; <<>> DiG 9.16.42 <<>> xyz.de txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49311
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;pcmacb.de.                     IN      TXT

;; ANSWER SECTION:
xyz.de.              39312   IN      TXT     "v=spf1 mx a ip4:abc.def.ghi.jkl ip6:abcd:efgh:ijkl:unds:0wei:ter0:0000:0001 mx:xyz.de ~all"

;; Query time: 31 msec
;; SERVER: abc.def.x.y#53(abc.def.x.y)
;; WHEN: an einem Sonntag CEST 2023
;; MSG SIZE  rcvd: 142


Create dkim keys and register at abcde.de

v=spf1 mx a ip4:245.159.200.167 ip6:2a82:c209:3915:2925:0000:0000:0000:0001 mx:abcde.de ~all

apt install opendkim opendkim-tools
nano /etc/opendkim.conf
Syslog                  yes 
SyslogSuccess           yes 
#LogWhy                 no 

Canonicalization        relaxed/simple 
#Mode                   sv 
#SubDomains             no 
OversignHeaders         From 

# user (for example, Postfix). You may need to add user "postfix" to group 
# "opendkim" in that case. 
UserID                  opendkim 
UMask                   007 

# Socket for the MTA connection (required). If the MTA is inside a chroot jail, 
# it must be ensured that the socket is accessible. In Debian, Postfix runs in 
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be 
# configured as shown on the last line below. 
Socket                  local:/run/opendkim/opendkim.sock 
#Socket                 inet:8891@localhost 
#Socket                 inet:8891 
#Socket                 local:/var/spool/postfix/opendkim/opendkim.sock 

PidFile                 /run/opendkim/opendkim.pid 

# Hosts for which to sign rather than verify, default is 127.0.0.1. See the 
# OPERATION section of opendkim(8) for more information. 
#InternalHosts          192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 

# The trust anchor enables DNSSEC. In Debian, the trust anchor file is provided 
# by the package dns-root-data. 
TrustAnchorFile         /usr/share/dns/root.key 
#Nameservers            127.0.0.1 

## added by myself 
# Required for signing 
KeyTable             /etc/opendkim/key.table 
SigningTable         /etc/opendkim/signing.table 
InternalHosts        /etc/opendkim/trusted.hosts 

# Optional but recommended: 
Canonicalization     relaxed/simple 
Mode                 sv
nano /etc/postfix/main.cf
# DKIM socket for local Unix socket 
smtpd_milters = unix:/run/opendkim/opendkim.sock 
non_smtpd_milters = unix:/run/opendkim/opendkim.sock 
milter_default_action = accept 
milter_protocol = 6
mkdir -p /etc/opendkim/keys/abcde.de
chown -R opendkim:opendkim /etc/opendkim
usermod -aG opendkim postfix
nano /lib/systemd/system/opendkim.service
[Unit] 
Description=OpenDKIM Milter 
Documentation=man:opendkim(8) man:opendkim.conf(5) man:opendkim-lua(3) man:opendkim-genkey(8) man:opendkim-genzone(8) man:opendkim-testkey(8) http://www.opendkim.org/docs.html 
After=network-online.target nss-lookup.target 
Wants=network-online.target 

[Service] 
Type=forking 
PIDFile=/run/opendkim/opendkim.pid 
ExecStart=/usr/sbin/opendkim 
ExecReload=/bin/kill -USR1 $127.0.0.1
localhost
mail.abcde.de
MAINPID 
Restart=on-failure 
UMask=007 

[Install] 
WantedBy=multi-user.target
nano /etc/opendkim/trusted.hosts
127.0.0.1
localhost
mail.abcde.de
nano /etc/opendkim/signing.table
*@abcde.de default._domainkey.abcde.de
nano /etc/opendkim/key.table
default._domainkey.abcde.de abcde.de:default:/etc/opendkim/keys/abcde.de/default.private

Generate the keys

cd /etc/opendkim/keys/abcde.de
opendkim-genkey -s default -d abcde.de

Make sure files are owned by opendkim

chown -R opendkim:opendkim /etc/opendkim
chmod go-r /etc/opendkim/keys/abcde.de/default.private

Entries in DNS TXT Record:

default._domainkey.abcde.de  86400   TXT     0

this is one line in “data”:

v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy8fiSlKdHX0U3b2EM4SWjU1aTAjcshJhyZt8iv5XtLv/Bf00ZJ11PqzSTtlCmsKCYYuO9BEAKVf3/nX+zmUH9KJWWnF1yU4+MYwnIpxACbrMh0BX1PlITGdDSdLnmhObiDlWqEeABBmnaUfrv+e4GKhxwPf2NjaeTObceiofz13hIOeHPFc7/5xaIkPOEjL/6ftCTRQSg2P/GqL1ePqbdzii8Cwn9EQ61g0xWFaqBug9vCFRWX+/Es1LtmIenjvSmMAn0j184o5yLzEv71uR7l0bwuRn85t6tMvocxGdeNcHuacHHZG4GZFrE/qdJCbYPBrYbMTcX0kIK5lNKNjucQIDAQAB
systemctl daemon-reexec
systemctl restart opendkim postfix

If there’s more domains:

/etc/opendkim/keys/
├── example.com/
│   ├── default.private
│   └── default.txt
├── example.org/
│   ├── default.private
│   └── default.txt
mkdir -p /etc/opendkim/keys/abc.de
mkdir -p /etc/opendkim/keys/xyz.de
mkdir -p /etc/opendkim/keys/cde-berlin.com
cd /etc/opendkim/keys/abc.de
opendkim-genkey -s default -d abc.de
chown opendkim:opendkim default.private
chmod 600 default.private
cd /etc/opendkim/keys/xyz.de
opendkim-genkey -s default -d xyz.de
chown opendkim:opendkim default.private
chmod 600 default.private
cd /etc/opendkim/keys/cde-berlin.com
opendkim-genkey -s default -d cde-berlin.com
chown opendkim:opendkim default.private
chmod 600 default.private
nano /etc/opendkim/key.table
default._domainkey.abc.de abc.de:default:/etc/opendkim/keys/abc.de/default.private
default._domainkey.xyz.de xyz.de:default:/etc/opendkim/keys/xyz.de/default.private
default._domainkey.cde-berlin.com cde-berlin.com:default:/etc/opendkim/keys/cde-berlin.com/default.private
nano /etc/opendkim/signing.table
*@abc.de default._domainkey.abc.de
*@xyz.de default._domainkey.xyz.de
*@cde-berlin.com default._domainkey.cde-berlin.com
nano /etc/opendkim/trusted.hosts
127.0.0.1
localhost

*.abc.de
*.xyz.de
*.cde-berlin.com

Generate the keys

cd /etc/opendkim/keys/abc.de
opendkim-genkey -s default -d abc.de

usw…….

chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rwx /etc/opendkim/keys
systemctl daemon-reexec
systemctl restart opendkim postfix

/