Postfix DKIM Support für Ciphermail

:!: Geht von einem Ciphermail-Setup auf Debian 8 aus :!:

Der erste Ansatz mittel „opendkim“ schlug fehl, da „opendkim“ Milter benutze und Ciphermail einen Conentfilter. Das Problem ist, das erst Milter ( Postfix before-queue Milter support - vor dem Qeueing der Mail) und später der Contentfilter ( Postfix After-Queue Content Filter - nach dem Qeueing der Mail) durchlaufen wird. Das hat zur Folge, dass die DKIM-Signatur durch die nachträgliche s/Mime-Signatur ungültig wird. Es muss zuerst s/Mime signiert werden und dann erst per DKIM. Das lässt sich mittels „dkimproxy“ erreichen, da diese auch ein Contentfilter ist, denn die beiden Contentfilter lassen sich verketten und man kann dabei die Reihenfolge bestimmen.

Da in meinem Setups Ciphermail immer zwischen dem Mailserver und dem Mailrelay der Firewall hängt bringt es nichts eingehende Mails zu prüfen, wenn, dann macht das die Firewall. Die Konfiguration beschränkt sich deshalb darauf ausgehende Mails zu signieren.

Installieren:

apt install dkimproxy

Config-Datei zum signieren ausgehender Mails: /etc/dkimproxy/dkimproxy_out.conf

# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10029

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10030

# specify what domains DKIMproxy can sign for (comma-separated, no spaces)
domain	DOMAIN-A.TLD,DOMAIN-B.TLD,DOMAIN-C.TLD

# specify the selector (i.e. the name of the key record put in DNS)
selector  mail

# specify location of the private key
keyfile /etc/dkimproxy/private.key

# specify what signatures to add
signature dkim(c=relaxed/relaxed)
signature domainkeys(c=nofws)

# if different keys for different domains are required
#sender_map /etc/dkimproxy/sender.map

# control how many processes DKIMproxy uses
#  - more information on these options (and others) can be found by
#    running `perldoc Net::Server::PreFork'.
min_servers 5
in_spare_servers 2

Die „master.cf“ muss angepasst werden. Wichtig ist dabei den „content_filter“ im Service „127.0.0.1:10026“ einzufügen und die beiden neuen Services am Ende anzufügen:

djigzo unix -       -       n       -       4      smtp
            -o smtp_send_xforward_command=yes
            -o smtp_discard_ehlo_keywords=8bitmime,silent-discard
            -o disable_dns_lookups=yes
            -o smtp_generic_maps=

# cleanup for reinject so we can set the hopcount_limit differently for the reinjection port
cleanup_reinject unix  n       -       -       -       0       cleanup
            -o hopcount_limit=100

127.0.0.1:10026 inet  n       -       n       -       10      smtpd
            -o content_filter=dksign:[127.0.0.1]:10029
            -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters
            -o smtpd_helo_restrictions=
            -o smtpd_client_restrictions=
            -o smtpd_sender_restrictions=
            -o smtpd_recipient_restrictions=permit_mynetworks,reject
            -o mynetworks=127.0.0.0/8
            -o smtpd_authorized_xforward_hosts=127.0.0.0/8
            -o smtpd_authorized_xclient_hosts=127.0.0.0/8
            -o cleanup_service_name=cleanup_reinject

#
# specify the location of the DKIM signing proxy
# Note: we allow "4" simultaneous deliveries here; high-volume sites may
#   want a number higher than 4.
# Note: the smtp_discard_ehlo_keywords option requires Postfix 2.2 or
#   better. Leave it off if your version does not support it.
#
dksign    unix  -       -       n       -       4       smtp
    -o smtp_send_xforward_command=yes
    -o smtp_discard_ehlo_keywords=8bitmime,starttls

#
# service for accepting messages FROM the DKIM signing proxy
#
127.0.0.1:10030 inet  n  -      n       -       10      smtpd
    -o content_filter=
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Im Verzeichnis /etc/dkimproxy den/die Key(s) erzeugen. Wenn es der Nameserver entsprechend lange TXT-Records zulässt kann man an Stelle von 1024 auch grössere Werte verwenden.

openssl genrsa -out /etc/dkimproxy/private.key 1024
openssl rsa -in /etc/dkimproxy/private.key -pubout -out /etc/dkimproxy/public.key

Und noch die passende Rechte für die Dateien setzen.

chmod 400 /etc/dkimproxy/*.key
chown dkimproxy /etc/dkimproxy/*.

Der Public-Key in der Datei „public.key“ muss noch im Nameserver in einem TXT-Record eingetragen werden.

v=DKIM1;k=rsa;p=LANGER.PUBLIC.KKEY

Passende Records kann man sich hier erzeugen lassen.

Jetzt noch die Datei /etc/default/dkimproxy anpassen.

# Default configuration for dkimproxy.

# which daemons whould be run; anything other than '1' will disable a daemon
# default: 1
RUN_DKIMPROXY_OUT=1
RUN_DKIMPROXY_IN=0

# The following variables specify configuration to be passed as arguments to
# the dkimproxy daemons. If a variable is commented out, the default value
# within the /etc/init.d/dkimproxy script will be used. If a variable is unset
# or set to an empty value, the corresponding argument will be omitted from
# the dkimproxy command line, and dkimproxy is free to read a value from its
# own configuration file or use its own default value.

# configuration file to use for dkimproxy.in
# default: "/etc/dkimproxy/dkimproxy_in.conf"
#DKIMPROXY_IN_CONF="/etc/dkimproxy/dkimproxy_in.conf"

# configuration file to use for dkimproxy.out
# default: "/etc/dkimproxy/dkimproxy_out.conf"
DKIMPROXY_OUT_CONF="/etc/dkimproxy/dkimproxy_out.conf"

# user and group of the dkimproxy daemons
# default: dkimproxy
DKIMPROXYUSER=dkimproxy
DKIMPROXYGROUP=dkimproxy

# private key to use for signing
# default: "/var/lib/dkimproxy/private.key"
#DKIMPROXY_OUT_PRIVKEY="/var/lib/dkimproxy/private.key"

# hostname for verification "Authentication-Results" header
# Feel free to use hostname -f if that fits you, but then make
# sure that your DNS dkim key entry is setup accordingly with
# something like _domainkey.mx.example.com
# default: `hostname -d`
#DKIM_HOSTNAME=`hostname -d`

# domains to sign for; specify multiple domains separated by commas
# default: `hostname -d` and domains parsed from /var/lib/dtc/etc/local_domains
#DOMAIN=`hostname -d`

# Number of pre-forked process that dkimproxy should keep ready for action.
# The best value for performances is 5 on a single core server. It would
# seem reasonable to add at least one process per core on your server.
# Each process will take about 2MB of RAM, so with a value of 2 for both
# the in and the out daemon, dkimproxy will use 10/12 MB of RAM.
# default: 5
#DKIMPROXY_IN_MIN_SERVERS=5
DKIMPROXY_OUT_MIN_SERVERS=5

Das Debian-Init-Scrtipt hat meiner Meinung nach den Fehler, dass wenn man Konfigurationsdateien benutzt trotzdem die anderen Commandline-Parameter genutzt werden, was bei mir zu Problemen geführt hat. Deshalb habe ich in der /etc/init.d/dkimproxy vor dem „case“ einfach folgendes eingefügt:

DKIMPROXY_OUT_ARGS="--conf_file=/etc/dkimproxy/dkimproxy_out.conf"

Zum Schluss noch die Dienste neu starten:

service postfix restart
service dkimproxy restart

Tests:

Ziel der Tests:

The Port25 Solutions, Inc. team

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   pass
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

Voraussetzung ist hier aber noch mehr als nur DKIM.





Quellen:

http://dkimproxy.sourceforge.net/usage.html

http://serverzeit.de/tutorials/e-mailserver/domainkeys-mit-postfix-und-dkimproxy/dkim-signierung