Postfix Mailgateway

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 Rspamd und ClamAV
  • DKIM-Signierung ausgehender Mails
  • SPF- und DMARC-Validierung

Die Architektur sieht wie folgt aus:

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

Netzkonfiguration MAILGW-Server (DMZ)

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

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
  • 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.

  • echo "it2XX.int smtp:[mail.it2XX.int]:25" > /etc/postfix/transport
  • postmap /etc/postfix/transport
  • postfix reload

Rspamd und ClamAV

Warum auf dem Gateway?

Spam- und Virenfilterung gehört auf den Gateway – nicht auf den Mailserver. Schädliche Mails werden abgewiesen bevor sie den internen Mailserver überhaupt erreichen. Der Mailserver bleibt sauber und hat weniger Last.

Installation

apt install rspamd clamav-daemon clamav-freshclam redis-server swaks

Dienste starten

systemctl enable rspamd clamav-daemon redis-server --now

Redis-Anbindung

Redis dient als Gedächtnis für Rspamd – für Bayes-Filter, Greylisting und den ClamAV-Cache.

  • vi /etc/rspamd/local.d/redis.conf
servers = "127.0.0.1:6379";

Rspamd Controller absichern

Passwort erzeugen
rspamadm pw
In die Controller-Konfiguration eintragen
  • vi /etc/rspamd/override.d/worker-controller.inc
password = "$2$...";
bind_socket = "*:11334";
systemctl restart rspamd
Webinterface

Einbinden in Postfix

Rspamd hängt sich als Milter zwischen Empfang und Weiterleitung. Jede eingehende Mail wird erst von Rspamd geprüft, bevor Postfix sie an mail.it2XX.int weiterleitet.

postconf -e "smtpd_milters=inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters=inet:127.0.0.1:11332"
postfix reload

ClamAV-Anbindung

Warum UNIX Socket?

Der UNIX Socket ist schneller als TCP und bleibt lokal – kein Netzwerkoverhead.

  • vi /etc/clamav/clamd.conf
# TCP deaktiviert
#TCPSocket 3310
#TCPAddr 127.0.0.1

# UNIX Socket
LocalSocket /var/run/clamav/clamd.ctl
LocalSocketMode 666
  • vi /etc/rspamd/override.d/antivirus.conf
enabled = true;
clamav {
    type = "clamav";
    symbol = "CLAM_VIRUS";
    servers = "/var/run/clamav/clamd.ctl";
    scan_text_mime = true;
    scan_mime_parts = true;
    min_size = 0;
    scan_unauthenticated = true;
    stream = true;
    score = 20.0;
}
systemctl restart rspamd clamav-daemon

SPF

Was ist SPF?

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. Steht er nicht drin, gilt die Mail als verdächtig.

DNS-Eintrag

Der SPF-Eintrag wird als TXT-Record in der DNS-Zone eingetragen.

  • vi /etc/bind/db.it2XX.int (auf ns.it2XX.int)
it2XX.int.  IN  TXT  "v=spf1 mx a:mail-gw.it2XX.int ~all"
Bedeutung der Parameter
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)
rndc reload

DKIM

Was ist DKIM?

DKIM (DomainKeys Identified Mail) 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. Rspamd übernimmt das Signieren automatisch.

Schlüsselpaar erzeugen

mkdir -p /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -d it2XX.int -k /var/lib/rspamd/dkim/it2XX.int.mail.key > /var/lib/rspamd/dkim/it2XX.int.mail.pub
chown -R _rspamd:_rspamd /var/lib/rspamd/dkim

Rspamd DKIM-Signing konfigurieren

  • vi /etc/rspamd/local.d/dkim_signing.conf
enabled = true;
domain {
    it2XX.int {
        path = "/var/lib/rspamd/dkim/it2XX.int.mail.key";
        selector = "mail";
    }
}
systemctl restart rspamd

DNS-Eintrag

Den Public Key aus der .pub-Datei in den DNS eintragen:

cat /var/lib/rspamd/dkim/it2XX.int.mail.pub

Der Inhalt sieht etwa so aus:

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

Diesen Eintrag auf ns.it2XX.int eintragen:

nsupdate -k /etc/bind/rndc.key << EOF
server 127.0.0.1
zone it2XX.int
update add mail._domainkey.it2XX.int 3600 TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
send
EOF
rndc reload

DMARC

Was ist DMARC?

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. Ohne DMARC können SPF und DKIM einzeln umgangen werden.

DNS-Eintrag

  • vi /etc/bind/db.it2XX.int (auf ns.it2XX.int)
_dmarc.it2XX.int.  IN  TXT  "v=DMARC1; p=none; rua=mailto:postmaster@it2XX.int"
Bedeutung der Parameter
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.

rndc reload

Test

Testmail senden

swaks --to martha@it2XX.int --from test@it2XX.int --server mail-gw.it2XX.int

DKIM prüfen

swaks --to martha@it2XX.int --from test@it2XX.int --server mail-gw.it2XX.int | grep DKIM

Logs

journalctl -u postfix -f
journalctl -u rspamd -f

GTUBE Spam-Test

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

rspamc --ip 1.2.3.4 /tmp/virus.eml

Ports und Dienste

Dienst Port Protokoll
Postfix SMTP (eingehend) 25 TCP
Rspamd Proxy (Milter) 11332 TCP
Rspamd Worker 11333 TCP
Rspamd Controller (WebUI) 11334 TCP
Redis 6379 TCP