Postfix Mailgateway spamassasin/amavis

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Ziel

In dieser Übung wird ein Mailgateway (mail-gw.it2XX.int) in der DMZ eingerichtet. Es übernimmt folgende Aufgaben:

  • Annahme eingehender Mails von außen (Port 25)
  • Weiterleitung an den internen Mailserver (mail.it2XX.int)
  • Spamfilterung und Virenscanning mit SpamAssassin und ClamAV
  • DKIM-Signierung ausgehender Mails mit OpenDKIM
  • SPF- und DMARC-Validierung

Die Architektur sieht wie folgt aus:

Internet → mail-gw.it2XX.int [Postfix + OpenDKIM + Amavis + SpamAssassin + ClamAV] → mail.it2XX.int [Postfix + Dovecot] → LAN [Clients]

Auf dem MAILGW

Netzkonfiguration

Parameter Wert Erläuterung
Netzwerk (NIC) DMZ Interface-Zuweisung in VirtualBox
IP 10.88.2XX.49 Statische IP
CIDR 24 Classless Inter-Domain Routing Präfixlänge
GW 10.88.2XX.1 GATEWAY
NS 10.88.2XX.21 Resolver
FQDN mail-gw.it2XX.int Fully Qualified Domain Name
SHORT mail-gw Short Name
DOM it2XX.int Domain Name
Anpassen des Templates

oder

  • debian-setup.sh -f mail-gw.it2XX.int -a 10.88.2XX.49/24 -g 10.88.2XX.1 -n 10.88.2XX.21

Einfügen in die ~/.ssh/config

als kit user auf dem Host über den ProxyJump eintragen
Host mail-gw.it2XX.int
  HostName 10.88.2XX.49
  User kit
  ProxyJump fw.it2XX.int

Postfix als Relay

Warum kein "Internet Site"?

Bei der Postfix-Installation wählen wir No configuration, da der mail-gw kein finaler Empfänger ist. Er nimmt Mails an und leitet sie weiter – er speichert keine Mailboxen. Die komplette Konfiguration erfolgt manuell.

Installation

Postfix installieren
  • apt install postfix
  • no configuration

Konfiguration

Wichtige Parameter im Überblick
Parameter Bedeutung
mydestination = Leer – der Gateway ist für keine Domain finaler Empfänger
relay_domains Domains für die Mails weitergeleitet werden
transport_maps Definiert wohin die Mail für welche Domain geht
mynetworks Nur localhost darf Mails einliefern (kein Open Relay)
smtpd_relay_restrictions Verhindert Missbrauch als Open Relay
Mailname setzen
  • echo "mail-gw.it213.int" > /etc/mailname
Konfigurationsdatei anlegen
  • vi /etc/postfix/main.cf
compatibility_level = 3.9
myhostname = mail-gw.it2XX.int
myorigin = /etc/mailname
mydomain = it2XX.int

smtpd_banner = $myhostname ESMTP $mail_name (Debian)
biff = no
inet_protocols = ipv4
inet_interfaces = all

# Kein finaler Empfaenger
mydestination =
mailbox_size_limit = 0
recipient_delimiter = +

# Relay
relay_domains = it2XX.int
transport_maps = hash:/etc/postfix/transport

# Netzwerk
mynetworks = 127.0.0.0/8

# TLS
smtpd_tls_key_file = /etc/ssl/own.key
smtpd_tls_cert_file = /etc/ssl/own.crt
smtpd_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks defer_unauth_destination

Mailrouting

Warum eckige Klammern?

Die eckigen Klammern um [mail.it2XX.int] verhindern einen MX-Lookup. Postfix liefert die Mail direkt an diesen Host – ohne DNS-Umweg über den MX-Record.

Transport-Map anlegen und aktivieren
  • echo "it2XX.int smtp:[mail.it2XX.int]:25" > /etc/postfix/transport
  • postmap /etc/postfix/transport
  • postfix reload

Amavis, SpamAssassin und ClamAV

Warum Amavis?

Amavis ist der Vermittler zwischen Postfix und den Filterkomponenten. Postfix übergibt die Mail an Amavis – Amavis ruft SpamAssassin und ClamAV auf und gibt die Mail danach zurück an Postfix. Jede Komponente macht genau eine Sache – das macht den Stack übersichtlich und stabil.

Installation

Pakete installieren
  • apt install amavis spamassassin clamav clamav-daemon swaks
Dienste aktivieren und starten
  • systemctl enable amavis clamav-daemon clamav-freshclam --now

ClamAV mit Amavis verbinden

Den amavis-User zur clamav-Gruppe hinzufügen
  • adduser amavis clamav

!!! ist schon gesetzt

ClamAV-Daemon konfigurieren
  • vi /etc/clamav/clamd.conf
# UNIX Socket
LocalSocket /var/run/clamav/clamd.ctl
LocalSocketMode 666
  • systemctl restart clamav-daemon

Amavis konfigurieren

Amavis für SpamAssassin und ClamAV aktivieren
  • vi /etc/amavis/conf.d/15-content_filter_mode
use strict;
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1;
  • systemctl restart amavis

Einbinden in Postfix

Postfix übergibt Mails an Amavis und nimmt sie gefiltert zurück
  • postconf -e "content_filter = smtp-amavis:[127.0.0.1]:10024"


In master.cf den Rückgabe-Transport eintragen
  • vi /etc/postfix/master.cf
smtp-amavis unix -    -    n    -    2 smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o smtp_dns_support_level=disabled
    -o max_use=20

127.0.0.1:10025 inet n  -    n    -    -  smtpd
    -o content_filter=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
  • postfix reload

OpenDKIM

Was ist OpenDKIM?

OpenDKIM signiert ausgehende Mails kryptografisch. Der Empfänger prüft die Signatur anhand des öffentlichen Schlüssels im DNS. Wurde die Mail unterwegs verändert, schlägt die Prüfung fehl.

Installation

OpenDKIM installieren
  • apt install opendkim opendkim-tools

Schlüsselpaar erzeugen

Verzeichnis anlegen und Schlüssel generieren
  • mkdir -p /etc/opendkim/keys/it2XX.int
  • opendkim-genkey -D /etc/opendkim/keys/it2XX.int/ -d it2XX.int -s mail
  • chown -R opendkim:opendkim /etc/opendkim/keys

Konfiguration

Hauptkonfiguration
  • vi /etc/opendkim.conf
Syslog          yes
SyslogSuccess   yes
LogWhy          yes

Canonicalization    relaxed/simple
Mode                sv
SubDomains          no

AutoRestart         yes
AutoRestartRate     10/1M
Background          yes
DNSTimeout          5
SignatureAlgorithm  rsa-sha256

UserID          opendkim
UMask           007
Socket          inet:8891@localhost
PidFile         /run/opendkim/opendkim.pid

OversignHeaders     From

KeyTable        /etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
ExternalIgnoreList  /etc/opendkim/TrustedHosts
InternalHosts       /etc/opendkim/TrustedHosts
KeyTable anlegen
  • vi /etc/opendkim/KeyTable
mail._domainkey.it2XX.int it2XX.int:mail:/etc/opendkim/keys/it2XX.int/mail.private
SigningTable anlegen
  • vi /etc/opendkim/SigningTable
*@it2XX.int mail._domainkey.it2XX.int
TrustedHosts anlegen
  • vi /etc/opendkim/TrustedHosts
127.0.0.1
localhost
it2XX.int
mail-gw.it2XX.int
  • systemctl enable opendkim --now

Einbinden in Postfix

OpenDKIM als Milter in Postfix eintragen
  • vi /etc/postfix/main.cf
# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
  • postfix reload
Public Key für den DNS auslesen
  • cat /etc/opendkim/keys/it2XX.int/mail.txt

Der Inhalt sieht etwa so aus:

mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

!!!Wichtig!!! Diesen Wert für den nächsten Schritt notieren – er wird auf dem Nameserver eingetragen.

Auf dem Nameserver

Was muss geändert werden?

Durch den neuen Gateway muss der MX-Record auf mail-gw zeigen. Zusätzlich kommen SPF, DKIM und DMARC neu dazu. Am Ende muss die Zone neu signiert werden (DNSSEC).

A-Record

Ein A-Record für mail-gw
  • vi /var/cache/bind/it2XX.int
it2XX.int.  IN  MX  10  mail-gw

MX-Record

Der MX-Record zeigt jetzt auf den Gateway – nicht mehr direkt auf mail
  • vi /var/cache/bind/it2XX.int
it2XX.int.  IN  MX  10  mail-gw.it2XX.int.

SPF

SPF legt fest welche Server Mails für die Domain versenden dürfen

SPF (Sender Policy Framework) legt fest, welche Mailserver berechtigt sind, Mails für eine Domain zu versenden. Der Empfänger prüft beim Eingang ob der sendende Server in der SPF-Liste der Absenderdomain steht.

  • vi /var/cache/bind/it2XX.int
it2XX.int.  IN  TXT  "v=spf1 mx a:mail-gw.it2XX.int ~all"
Parameter Bedeutung
v=spf1 SPF Version 1
mx Der MX-Eintrag der Domain ist berechtigt
a:mail-gw.it2XX.int Dieser Host ist explizit berechtigt
~all Alle anderen sind Softfail (verdächtig, aber nicht abgewiesen)

DKIM

Public Key vom mail-gw auslesen und in die Zonendatei kopieren

Den folgenden Befehl auf mail-gw.it2XX.int ausführen und die Ausgabe kopieren:

  • cat /etc/opendkim/keys/it2XX.int/mail.txt
Den ausgegebenen Eintrag in die Zonendatei eintragen
  • vi /var/cache/bind/it2XX.int
mail._domainkey.it2XX.int.  IN  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

DMARC

DMARC verbindet SPF und DKIM und legt fest was bei Fehlschlag passiert

DMARC (Domain-based Message Authentication, Reporting and Conformance) verbindet SPF und DKIM. Es legt fest was passieren soll wenn SPF oder DKIM fehlschlägt – und wer einen Bericht bekommt.

  • vi /var/cache/bind/it2XX.int
_dmarc.it2XX.int.  IN  TXT  "v=DMARC1; p=none; rua=mailto:postmaster@it2XX.int"
Parameter Bedeutung
v=DMARC1 DMARC Version 1
p=none Nur beobachten, nichts abweisen (zum Einstieg)
rua= Adresse für Aggregat-Reports

!!!Wichtig!!! p=none ist nur für den Anfang. Sobald SPF und DKIM stabil laufen auf p=quarantine oder p=reject umstellen.

Zone neu signieren

Nach jeder Änderung muss die Zone neu signiert werden
  • dnssec-signzone -A -N INCREMENT -o it2XX.int -t /var/cache/bind/it2XX.int
  • rndc reload
Prüfen
  • dig MX it2XX.int
  • dig TXT it2XX.int
  • dig TXT mail._domainkey.it2XX.int
  • dig TXT _dmarc.it2XX.int

Auf dem Mailserver

Postfix einschränken

mail.it2XX.int soll Mails nur noch vom Gateway annehmen

Bisher hat der Mailserver direkt von außen empfangen. Jetzt ist der Gateway vorgelagert – der Mailserver muss entsprechend eingeschränkt werden.

mynetworks und relayhost anpassen
  • vi /etc/postfix/main.cf
mynetworks = 127.0.0.0/8 10.88.2XX.49/32
relayhost = [mail-gw.it2XX.int]:25
  • postfix reload
Prüfen – direkte Verbindung von außen muss fehlschlagen
  • swaks --to martha@it2XX.int --server mail.it2XX.int

Test

Testmail senden

Einfache Testmail über den Gateway schicken
  • swaks --to martha@it2XX.int --from test@it2XX.int --server mail-gw.it2XX.int

DKIM prüfen

DKIM-Header in der Antwort prüfen
  • swaks --to martha@it2XX.int --from test@it2XX.int --server mail-gw.it2XX.int | grep -i dkim

Logs

Postfix, Amavis und OpenDKIM live beobachten
  • journalctl -u postfix -f
  • journalctl -u amavis -f
  • journalctl -u opendkim -f

GTUBE Spam-Test

Standardisierte Spam-Testmail senden
  • swaks --to martha@it2XX.int --server mail-gw.it2XX.int --body "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X"

EICAR Virus-Test

Testdatei erstellen und per swaks schicken
  • swaks --to martha@it2XX.int --server mail-gw.it2XX.int --attach /tmp/eicar.com

Ports und Dienste

Dienst Port Protokoll
Postfix SMTP (eingehend) 25 TCP
Amavis 10024 TCP
Amavis Rückgabe an Postfix 10025 TCP
OpenDKIM (Milter) 8891 TCP