Postfix Mailgateway spamassasin/amavis
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
- 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
- vi /etc/postfix/main.cf
# Amavis
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 disable_dns_lookups=yes
-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).
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 |