DKIM basiert auf asymetrischer Verschlüsselung mit public- und private-Key.
Das Key-Paar wird mit folgender Syntax erzeugt:
amavisd genrsa <Dateiname> [Anzahl der Bits für den Schlüssel]
Die Bitgröße sollte heutzutage - wenn vom DNS-Provider unterstützt - 4096 Bit betragen, 1024 Bit ist definitiv die unterste Grenze, die sinnhaft ist!
Als Namen wird eine Kombination aus Datums-Stempel des Erstellungsdatums in der Form YYYYMMDD , Dateiversion NN und Domainname gewählt.
So ist es einfacher, die einzelnen Schlüssel auseinander zu halten, wenn mehrere benötigt, oder einzelne Schlüssel für ungültig erklärt (revoked) werden müssen.
Dieser Datums-Stempel wird auch als Selector in der AMaViS-Konfiguration verwendet.
Also z.B. am 26. August 2014, als Version 01 des Keys:
# amavisd-new genrsa /etc/postfix/dkim/2014082601_haas-online.org_key.pem 1024 Private RSA key successfully written to file "/etc/postfix/dkim/2014082601_haas-online.org_key.pem" (1024 bits, PEM format)
Der Public-Key muss nun in der DNS-Zone hinterlegt werden:
Dieser wird mit folgendem Befehl angezeigt:
# amavisd-new showkey haas-online.org ; key#1, domain haas-online.org, /etc/postfix/dkim/2014082601_haas-online.org_key.pem 2014082601._domainkey.haas-online.org. 3600 TXT ( "v=DKIM1; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZRaQ59r+k9NrREiM84nFo6SVF" "lTer21iSUVVg3VHDuaMPMAckNt+g/yNl1Ni/9r7/KFTn9P98T3JOTV8iRa7K5ZmN" "e3WtlmqbcKEvlXCgXhablqAGOlYMeKJ0JoL+zfivycROn3lrESv7tbuVvA52q2Ao" "TV2Yt6/0dfoZ1xwE/wIDAQAB")
Dieser Eintrag muss ggf. noch für den jeweiligen DNS-Provider umgeformt werden. Manche DNS-Provider akzeptieren nur Keys mit 1024 Bit, andere kommen mit den Zeilenumbrüchen nicht zurecht.
Man sollte es immer nach folgendem Grundmuster versuchen:
Selector._domainkey.domainname.de. TXT ( "v=DKIM1; p=dkim-public-key" )
Bei OVH muss der „fortgeschrittene Modus“ aktiviert werden, in dem die DNS-Zone als Textfile editiert werden kann:
Empfang > Shared Hosting > Domains & DNS > DNS Zone (fortgeschrittener Modus)
Fortgeschrittener Modus (Deaktiviert die Assistenten, es wird nur die Syntax der Zone überprüft)
Leider unterstützt OVH auch nur 1024 Bit große TXT-Records
2014082601._domainkey IN TXT ( "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZRaQ59r+k9NrREiM84nFo6SVFlTer21iSUVVg3VHDuaMPMAckNt+g/yNl1Ni/9r7/KFTn9P98T3JOTV8iRa7K5ZmNe3WtlmqbcKEvlXCgXhablqAGOlYMeKJ0JoL+zfivycROn3lrESv7tbuVvA52q2AoTV2Yt6/0dfoZ1xwE/wIDAQAB" )
Die AMaVIS-Konfiguration muss nun um folgende Zeilen ergänzt werden, wobei zunächst die DKIM-Signierung explizit ausgeschaltet wird ($enable_dkim_signing = 0;):
# DKIM-Signierung:
# $enable_dkim_signing = 1;
$enable_dkim_signing = 0;
$signed_header_fields{'received'} = 0; # turn off signing of Received
dkim_key('haas-online.org', '2014082601', '/etc/postfix/dkim/2014082601_haas-online.org_key.pem');
dkim_key('andere-domain.de', '2014060101', '/etc/postfix/dkim/andere-domain.de_key.pem');
@mynetworks = qw(127.0.0.0/8); # list your internal networks
@local_domains_maps = (
".$mydomain",
read_hash('/etc/postfix/virtual_domains')
);
@client_ipaddr_policy = (
[qw( 0.0.0.0/8 127.0.0.1/8 [::] [::1] )] => 'ORIGINATING',
\@mynetworks => 'ORIGINATING',
);
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } # catchall defaults
);
# damit Amavisd
# auf 10024/tcp fuer inbound (DKIM/SPF verify, Anti-SPAM)
# forwarding auf 10025/tcp
# und 10026/tcp fuer outbound (DKIM sign)
# forwarding auf 10027/tcp
# lauscht:
$inet_socket_port = [10024,10026]; # listen on multiple TCP ports
$forward_method = 'smtp:[127.0.0.1]:10025'; # MTA with non-signing service
$notify_method = 'smtp:[127.0.0.1]:10027'; # MTA with signing service
# it is up to MTA to re-route mail from authenticated roaming users or
# from internal hosts to a dedicated TCP port (such as 10026) for filtering
$interface_policy{'10026'} = 'ORIGINATING';
$policy_bank{'ORIGINATING'} = { # mail supposedly originating from our users
originating => 1, # declare that mail was submitted by our smtp client
allow_disclaimers => 1, # enables disclaimer insertion if available
# notify administrator of locally originating malware
virus_admin_maps => ["virusalert\@$mydomain"],
spam_admin_maps => ["virusalert\@$mydomain"],
warnbadhsender => 1,
# forward to a smtpd service providing DKIM signing service
forward_method => 'smtp:[127.0.0.1]:10027',
# force MTA conversion to 7-bit (e.g. before DKIM signing)
smtpd_discard_ehlo_keywords => ['8BITMIME'],
bypass_banned_checks_maps => [1], # allow sending any file names and types
terminate_dsn_on_notify_success => 0, # don't remove NOTIFY=SUCCESS option
};
Für die Signierung muss in Postfix ein zweiter Kanal eröffnet werden, da AMaVIS als pre-queue Filter für inbound emails konfiguriert wurde, und eine Signatur erst ganz am Schluss - nach der ganzen „email-Sanitation“ - durchgeführt werden sollte.
Dazu wurde in der AMaVIS-Konfiguration der Port 10027 konfiguriert, der nun auch in Postfix eingerichtet werden muss:
# AMaViS - non-signing: localhost:10025 inet n - - - - smtpd -o smtpd_proxy_filter= -o smtpd_authorized_xforward_hosts=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o receive_override_options=no_unknown_recipient_checks # AMaViS - signing: localhost:10027 inet n - - - - smtpd -o smtpd_proxy_filter= -o smtpd_authorized_xforward_hosts=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o receive_override_options=no_unknown_recipient_checks
Ausserdem müssen inbound emails als INCOMING und outbound emails als ORIGINATING getagged werden:
# inbound emails: smtpd pass - - - - - smtpd # AmaVis als 'before-queue-filter': -o smtpd_proxy_filter=localhost:10024 -o smtpd_proxy_timeout=600 -o smtpd_client_connection_count_limit=200 -o milter_macro_daemon_name=INCOMMING # outbound emails: # damit auch direkt vom Server erzeugt emails versendet weren koennen (z.B. Webmailer, Statusmails etc.): localhost:smtp inet n - - - - smtpd -o smtpd_proxy_filter=localhost:10026 -o smtpd_proxy_timeout=600 -o milter_macro_daemon_name=ORIGINATING submission inet n - - - - smtpd ... -o smtpd_proxy_filter=localhost:10026 -o smtpd_proxy_timeout=600 -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd ... -o smtpd_proxy_filter=localhost:10026 -o smtpd_proxy_timeout=600 -o milter_macro_daemon_name=ORIGINATING
Der DKIM-Eintrag kann nun mit AMaVIS getestet werden:
# amavisd-new testkeys haas-online.org TESTING#1: 2014082601._domainkey.haas-online.org => invalid (public key: not available)
→ der DKIM-Eintrag im DNS ist entweder fehlerhaft, oder noch nicht aktiv (TTL!) Sobald der DKIM-Eintrag im DNS aktiv ist, kann der DKIM-Key nochmals getestet werden:
# amavisd-new testkeys haas-online.org TESTING#1: 2014082601._domainkey.haas-online.org => pass
← zurück