Domain Key Identified Mail outbound - ORIGINATING - signieren

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;):

/etc/amavis/conf.d/50-user
# 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:

/etc/postfix/master.cf
# 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:

/etc/postfix/master.cf
# 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