====== 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