Verschiedene Ansätze zur Sicherung eures Servers werde ich hier aufzeigen und erklären.

DKIM mit Kopano und Postfix

Um DKIM mit Kopano einzurichten müssen wir zuerst OpenDKIM installieren und einrichten. DKIM fügt ein Schlüssel zu jeder E-Mail Nachricht hinzu welche dann mit dem Schlüssel auf dem DNS Server abgeglichen wird. So sind die E-Mails glaubwürdiger und werden nicht als SPAM gekennzeichnet. DKIM hat natürlich auch schwächen aber wird trotzdem heutzutage vorausgesetzt um als Vertrauenswürdig zu gelten.

Die Installation starten wir mit folgenden Befehl:

sudo apt-get install opendkim opendkim-tools 

Als nächstes erstellen wir die Verzeichnisse für die DKIM-Schlüssel ein.

mkdir /etc/opendkim
mkdir /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys

OpenDKIM hat wie jede angere Linux Software eine Konfigurationsdatei. Diese bearbeiten wir damit OpenDKIM anschliessend mit Postfix kommunizieren kann. Wir bearbeiten aber zuerst die Datei /etc/default/opendkim denn auf Debian wird diese zuerst abgearbeitet.

sudo nano /etc/default/opendkim.conf

Es wird alles auskommentiert ausser “RUNDIR”.

# NOTE: This is a legacy configuration file. It is not used by the opendkim
# systemd service. Please use the corresponding configuration parameters in
# /etc/opendkim.conf instead.
#
# Previously, one would edit the default settings here, and then execute
# /lib/opendkim/opendkim.service.generate to generate systemd override files at
# /etc/systemd/system/opendkim.service.d/override.conf and
# /etc/tmpfiles.d/opendkim.conf. While this is still possible, it is now
# recommended to adjust the settings directly in /etc/opendkim.conf.
#
#DAEMON_OPTS=""
# Change to /var/spool/postfix/run/opendkim to use a Unix socket with
# postfix in a chroot:
#RUNDIR=/var/spool/postfix/run/opendkim
RUNDIR=/run/opendkim
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
# default:
 # SOCKET=local:$RUNDIR/opendkim.sock
# listen on all interfaces on port 54321:
#SOCKET=inet:54321
# listen on loopback on port 12345:
#SOCKET=inet:12345@localhost
# listen on 192.0.2.1 on port 12345:
#SOCKET=inet:12345@192.0.2.1
 # USER=opendkim
 # GROUP=opendkim
 # PIDFILE=$RUNDIR/$NAME.pid
 # EXTRAAFTER=

Als nächstes öffnen wir die Konfigurationsdatei unter /etc/opendkim.conf

sudo nano /etc/opendkim.conf
# Socket-Datei zur Kommunikation (alternativ: lokaler Port)
Mode                    sv
# Socket                  local:/var/run/opendkim/opendkim.sock
Socket                  inet:12345@localhost

# OpenDKIM verwendet diesen Benutzer bzw.
# diese Gruppe
UserID                  opendkim:opendkim
UMask                   002
PidFile                 /var/run/opendkim/opendkim.pid

# OpenDKIM bei Problemen neustarten,
# aber max. 10 mal pro Stunde
AutoRestart             yes
AutoRestartRate         10/1h

# This is a basic configuration for signing and verifying. It can easily be
# adapted to suit a basic installation. See opendkim.conf(5) and
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for complete
# documentation of available configuration parameters.

Syslog                  yes
SyslogSuccess           yes
LogWhy                  yes

# Common signing and verification parameters. In Debian, the "From" header is
# oversigned, because it is often the identity key used by reputation systems
# and thus somewhat security sensitive.
Canonicalization        relaxed/simple
#Mode                   sv
#SubDomains             no
OversignHeaders         From

# interne Mails (signieren, nicht verifizieren)
InternalHosts           refile:/etc/opendkim/trusted

# Hosts, denen vertraut wird (vermeidet Warnungen beim Logging)
ExternalIgnoreList      refile:/etc/opendkim/trusted

# welche Verschlüsselungs-Keys sollen für welche
# Domains verwendet werden
# (refile: für Dateien mit regulären Ausdrücke)
SigningTable            refile:/etc/opendkim/signing.table
KeyTable                /etc/opendkim/key.table

# diesen Signatur-Algorithmus verwenden
SignatureAlgorithm      rsa-sha256

# Signing domain, selector, and key (required). For example, perform signing
# for domain "example.com" with selector "2020" (2020._domainkey.example.com),
# using the private key stored in /etc/dkimkeys/example.private. More granular
# setup options can be found in /usr/share/doc/opendkim/README.opendkim.
#Domain                 example.com
#Selector               2020
#KeyFile                /etc/dkimkeys/example.private

# In Debian, opendkim runs as user "opendkim". A umask of 007 is required when
# using a local socket with MTAs that access the socket as a non-privileged
# user (for example, Postfix). You may need to add user "postfix" to group
# "opendkim" in that case.
# UserID                        opendkim
# UMask                 007

# Socket for the MTA connection (required). If the MTA is inside a chroot jail,
# it must be ensured that the socket is accessible. In Debian, Postfix runs in
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be
# configured as shown on the last line below.
# Socket                        local:/run/opendkim/opendkim.sock
#Socket                 inet:8891@localhost
#Socket                 inet:8891
#Socket                 local:/var/spool/postfix/opendkim/opendkim.sock

# PidFile                       /run/opendkim/opendkim.pid

# Hosts for which to sign rather than verify, default is 127.0.0.1. See the
# OPERATION section of opendkim(8) for more information.
#InternalHosts          192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# The trust anchor enables DNSSEC. In Debian, the trust anchor file is provided
# by the package dns-root-data.
# TrustAnchorFile               /usr/share/dns/root.key
#Nameservers            127.0.0.1

Vertrauenswürdige Domains

sudo nao /etc/opendkim/trusted
127.0.0.1
::1
localhost
meinedomain.ch
server1.meinedomain.ch

Die Zuordnung der Schlüssel zum Hostnamen erfolgt als nächstes.

sudo nano /etc/opendkim/signing.table

Der Inhalt sieht wie folgt aus.

# E-Mails von xxx@meinedomaein.ch den Schlüssel 'meinedomainname'
# zum Signieren verwenden
*@meinedomain.ch meinedomainname

Die nächste Datei gibt dann den Ort des Schlüssels bekannt.

sudo nano /etc/opendkim/key.table
# Datei /etc/opendkim/key.table
# der Schlüssel 'meindomainname' befindet sich in
# des Datei /etc/opendkim/keys/meindomainname.private
meindomainname meinedomain.ch:201611:/etc/opendkim/keys/meindomainname.private

Schlüssel generieren

cd /etc/opendkim
opendkim-genkey -d meinedomain -b 2048 -r -s 201611

Die nun erzeugten Dateien werden an den korrekten Ort verschoben.

cd /etc/opendkim
mv 201611.private keys/meindomainname.private
mv 201611.txt     keys/meindomainname.txt
chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rwx /etc/opendkim/keys

Nun wird der TXT Record auf dem DNS Server gesetzt.

201611._domainkey       IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; s=email; "
          "p=MIIBIjANBgkqhkiSD3gsdQEFAAOCAQ8AMIIBCgKCAQEAqTO04CpcVyQwkAHiiI0MhdjvhuqROaFcoeIP6PTNnMXa0Qdjih9Mfld35bF37V6j73k6ov9y8EVASG3tasFASfk6uN+LmlacGyh9cS583wbDanBLmOKM4KJGkUoRwJj08PEeRKu3OEgdkUOabKl/CzIpoASf3twqasfrg2rD+eKgEbz8MLIb4VASGFa3tasdwKvA1aicqYC"
          "SjQOcNZhn0QuhIASfat3twafasfSZT8+ES6uwIRWa7ASGat3tafasfketMNB17Sen7kP2ASGasg3tasKWz1rTCH7PYfIOhKT337CASgfat3tafsasfu7ppQSWFAWfwr3w"

Nun starten wir einmal DKIM neu und schauen ob alles noch funktioniert.

service opendkim restart

Kurz überprüfen ob der Service läuft.

● opendkim.service - OpenDKIM Milter
     Loaded: loaded (/lib/systemd/system/opendkim.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-02-12 20:38:09 CET; 5s ago
       Docs: man:opendkim(8)
             man:opendkim.conf(5)
             man:opendkim-lua(3)
             man:opendkim-genkey(8)
             man:opendkim-genzone(8)
             man:opendkim-testkey(8)
             http://www.opendkim.org/docs.html
    Process: 2652 ExecStart=/usr/sbin/opendkim (code=exited, status=0/SUCCESS)
   Main PID: 2653 (opendkim)
      Tasks: 7 (limit: 4700)
     Memory: 2.1M
        CPU: 5ms
     CGroup: /system.slice/opendkim.service
             ├─2653 /usr/sbin/opendkim
             └─2654 /usr/sbin/opendkim

SPF mit Kopano

Das Sender-Policy-Framework ist wie DKIM dafür da die E-Mails vertrauenswürdiger zu machen. SPF wird nur auf dem DNS Server hinterlegt und benötigt keine weitere Konfiguration. Auf dem DNS Server wird ein TXT Eintrag gemacht und danach muss man die IP-Adresse vom Mailserver hinterlegen.

"v=spf1 mx a ip4:IPADRESSE ?all"

DMARC mit Kopano