====== OpenDKIM ======
===== Pakete =====
* Debian (11): ''opendkim'', zum Testen zusätzlich: ''opendkim-tools miltertest''
===== dkim Schlüsselpaar erzeugen =====
mkdir /etc/opendkim
cd /etc/opendkim
opendkim-genkey -d linuxhotel.de
(( Alternativ kann man den Selector z.B. mit ''-s 2022'' auf einen selbst gewählten Wert setzen. Übliche Werte sind der hostname (nicht der fqdn) oder das Jahr. Läßt man das wie hier weg, dann wird "default" genommen. ))
===== öffentlichen Schlüssel der DNS-Zone hinzufügen =====
cat default.txt >> /var/cache/bind/master/linuxhotel.de
DKIM Keys werden selten ausgetauscht. TTL kann in der Regel länger sein als andere, z.B. auf 1D (1 Tag) anpassen. Auf der anderen Seite: zum Testen mit "t=y;" kann auch eine kürzere TTL praktisch sein.
vim /var/cache/bind/master/linuxhotel.de
named-checkzone -D linuxhotel.de /var/cache/bind/master/linuxhotel.de | grep _domainkey
->${selector}._domainkey.${domain}
default._domainkey.linuxhotel.de. 86400 IN TXT "v=DKIM1; h=sha256; k=rsa; " "p=MIIB....
rndc reload linuxhotel.de
journalctl -fu named.service
==== DNS-Eintrag prüfen ====
dig @127.0.0.1 default._domainkey.linuxhotel.de txt
-> DKIM Record Check (gibt es eine Alternative zu https://www.dmarcanalyzer.com/dkim/dkim-checker ?)
opendkim-testkey -d linuxhotel.de -s default -k default.private -vv
-> "key not secure" bedeutet, dass die DNS Antwortwort nicht mit DNSSEC validiert werden konnte (fehlendes AD flag in der Ausgabe von ''dig'') - DKIM funktioniert aber auch ohne DNSSEC. Aber natürlich ist es mit DNSSEC besser.
===== opendkim konfigurieren =====
Verzeichnis für Unix-Socket anlegen:
mkdir /var/spool/postfix/opendkim
chgrp opendkim /var/spool/postfix/opendkim
chmod o-rwx /var/spool/postfix/opendkim
Domain linuxhotel.de
# können auch mehrere Domains sein, kann auch ein Pfad zu einer Datei sein, die mehrere Domains enthält.
# Selector 2022
# wenn man nichts einstellt, dann "default"
KeyFile /etc/opendkim/default.private
Socket local:/var/spool/postfix/opendkim/opendkim.sock
# Postfix smtpd läuft im chroot, daher muss der Socket da hin
InternalHosts 127.0.0.0/8,
# hier alle IP-Adressen von unauthentifizierten SMTP-Clients, die über diesen MTA versenden. SASL-authentifizierte SMTP-Clients werden unabhängig von Ihrer IP-Adresse signiert.
Die [[https://wiki.debian.org/opendkim#DNS_resolution|opendkim-Version in Debian macht DNS-Anfragen selbst]], und nutzt nicht die Einstellungen aus ''/etc/nsswitch.conf'' und ''/etc/resolv.conf''. Wenn opendkim die selben Nameserver nutzen soll, dann muss man die mit ''Nameservers ...'' angeben.
Syntax testen:
opendkim -n
opendkim neu starten:
systemctl restart opendkim.service
==== opendkim testen ====
To: test@example.com
Subject: Testing DKIM
Date: Wed, 29 Jan 2014 17:34:00 +0000 (UTC)
From: nutzer@linuxhotel.de
hello dkim
opendkim-testmsg -d linuxhotel.de -k /etc/opendkim/default.private -s default < test.eml
-- usage:
-- miltertest -s opendkim-testmilter.lua -D socket=local:/var/spool/postfix/opendkim/opendkim.sock -D host=localhost -D ip=127.0.0.1 -D from=test@linuxhotel.de
-- TODO: auth_type
conn = mt.connect(socket)
if conn == nil then
error "mt.connect() failed"
else
msg = "connected to " .. socket
print(msg)
end
conninfo = mt.conninfo(conn, host, ip)
if conninfo ~= nil then
error "mt.conninfo() failed"
else
msg = "send connection info - host: " .. host .. ", ip: " .. ip
print(msg)
end
print("")
print("send envelope macros and sender data")
-- mt.helo() is called implicitly
-- TODO: auth_type
mt.macro(conn, SMFIC_MAIL, "i", "test-id")
if mt.mailfrom(conn, from) ~= nil then
error "mt.mailfrom() failed"
else
msg = "send mailfrom " .. from
print(msg)
end
if mt.getreply(conn) ~= SMFIR_CONTINUE then
error "mt.mailfrom() unexpected reply"
end
print("")
print("send headers")
if mt.header(conn, "From", from) ~= nil then
error "mt.header(From) failed"
else
msg = "send From: " .. from
print(msg)
end
-- send EOH
if mt.eoh(conn) ~= nil then
error "mt.eoh() failed"
end
if mt.getreply(conn) ~= SMFIR_CONTINUE then
error "mt.eoh() unexpected reply"
end
if mt.eom(conn) ~= nil then
error "mt.eom() failed"
end
if mt.getreply(conn) ~= SMFIR_ACCEPT then
error "mt.eom() unexpected reply"
end
print("")
-- verify that a test header field got added
-- if mt.eom_check(conn, MT_HDRADD) then
-- print("Header added")
-- else
-- error "no Header added"
-- end
if mt.eom_check(conn, MT_HDRINSERT, "DKIM-Signature") then
print("DKIM-Signature added")
else
error "no DKIM-Signature added"
end
-- wrap it up!
mt.disconnect(conn)
miltertest -s opendkim-testmilter.lua -D socket=local:/var/spool/postfix/opendkim/opendkim.sock -D host=localhost -D ip=127.0.0.1 -D from=test@linuxhotel.de
====== Postfix ======
((
Wenn wir opendkim bzw. unserer obigen Konfiguration nicht vertrauen:
postconf -e 'milter_default_action = accept'
postconf -e 'soft_bounce = yes'
Ich würde das nur einschalten, wenn es tatsächlich Ärger mit dem opendkim-Milter gibt.
Im Regelbetrieb sollten beide Einstellungen wieder auf ihren Default zurückgesetzt werden.
))
Postfix Zugriffsrechte auf den opendkim-Socket geben:
gpasswd -a postfix opendkim
Postfix soll den opendkim-Milter nutzen:
postconf -e 'smtpd_milters = unix:opendkim/opendkim.sock'
postconf -e 'non_smtpd_milters = unix:opendkim/opendkim.sock'
Doku:
https://www.mailhardener.com/kb/dkim
https://datacadamia.com/marketing/email/postfix/opendkim