Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


fortgeschrittene:postfix-opendkim

Dies ist eine alte Version des Dokuments!


TODO: noch nicht fertig

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

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
-- socket  = "local:/var/spool/postfix/opendkim/opendkim.sock"
-- host    = "localhost"
-- ip      = "127.0.0.1"
-- 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

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.
fortgeschrittene/postfix-opendkim.1663576210.txt.gz · Zuletzt geändert: 2022/09/19 08:30 von ingo_wichmann