Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


fortgeschrittene:postfix-opendkim

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

1)

ö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
/etc/opendkim.conf
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 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

test.eml
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
opendkim-testmilter.lua
-- 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

2)

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
1)
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.
2)
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.
fortgeschrittene/postfix-opendkim.txt · Zuletzt geändert: 2022/12/24 11:30 von ingo_wichmann