|
|
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| =Ziel=
| | *[[Postfix Mailgateway rspamd]] |
| 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)=
| |
| {| class="wikitable" style="background-color: #f2f2f2;"
| |
| ! 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
| |
| *[[Anpassen des Debian 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
| |
| <pre>
| |
| Host mail-gw.it2XX.int
| |
| HostName 10.88.2XX.49
| |
| User kit
| |
| ProxyJump fw.it2XX.int
| |
| </pre>
| |
| | |
| =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
| |
| {| class="wikitable"
| |
| ! Parameter !! Bedeutung
| |
| |-
| |
| | <code>mydestination =</code> || Leer – der Gateway ist für keine Domain finaler Empfänger
| |
| |-
| |
| | <code>relay_domains</code> || Domains für die Mails weitergeleitet werden
| |
| |-
| |
| | <code>transport_maps</code> || Definiert wohin die Mail für welche Domain geht
| |
| |-
| |
| | <code>mynetworks</code> || Nur localhost darf Mails einliefern (kein Open Relay)
| |
| |-
| |
| | <code>smtpd_relay_restrictions</code> || Verhindert Missbrauch als Open Relay
| |
| |}
| |
| | |
| ;Konfigurationsdatei anlegen
| |
| * vi /etc/postfix/main.cf
| |
| <syntaxhighlight lang="bash">
| |
| 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
| |
| </syntaxhighlight>
| |
| | |
| ==Mailrouting==
| |
| ;Warum eckige Klammern?
| |
| Die eckigen Klammern um <code>[mail.it2XX.int]</code> 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
| |
| | |
| =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==
| |
| ;Pakete installieren
| |
| * apt install rspamd clamav-daemon clamav-freshclam redis-server swaks
| |
| | |
| ;Dienste aktivieren und 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
| |
| <syntaxhighlight lang="bash">
| |
| servers = "127.0.0.1:6379";
| |
| </syntaxhighlight>
| |
| | |
| ==Rspamd Controller absichern==
| |
| ;Passwort erzeugen
| |
| * rspamadm pw
| |
| | |
| ;In die Controller-Konfiguration eintragen
| |
| * vi /etc/rspamd/override.d/worker-controller.inc
| |
| <syntaxhighlight lang="bash">
| |
| password = "$2$...";
| |
| bind_socket = "*:11334";
| |
| </syntaxhighlight>
| |
| | |
| * systemctl restart rspamd
| |
| | |
| ;Webinterface aufrufen
| |
| * http://10.88.2XX.49:11334
| |
| | |
| ==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.
| |
| | |
| ;ClamAV auf UNIX Socket umstellen
| |
| * vi /etc/clamav/clamd.conf
| |
| <syntaxhighlight lang="bash">
| |
| # TCP deaktiviert
| |
| #TCPSocket 3310
| |
| #TCPAddr 127.0.0.1
| |
| | |
| # UNIX Socket
| |
| LocalSocket /var/run/clamav/clamd.ctl
| |
| LocalSocketMode 666
| |
| </syntaxhighlight>
| |
| | |
| ;Rspamd Antivirus-Modul konfigurieren
| |
| * vi /etc/rspamd/override.d/antivirus.conf
| |
| <syntaxhighlight lang="bash">
| |
| 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;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * 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==
| |
| ;TXT-Record auf ns.it2XX.int eintragen
| |
| * vi /etc/bind/db.it2XX.int
| |
| <syntaxhighlight lang="bash">
| |
| it2XX.int. IN TXT "v=spf1 mx a:mail-gw.it2XX.int ~all"
| |
| </syntaxhighlight>
| |
| | |
| ;Bedeutung der Parameter
| |
| {| class="wikitable"
| |
| ! Parameter !! Bedeutung
| |
| |-
| |
| | <code>v=spf1</code> || SPF Version 1
| |
| |-
| |
| | <code>mx</code> || Der MX-Eintrag der Domain ist berechtigt
| |
| |-
| |
| | <code>a:mail-gw.it2XX.int</code> || Dieser Host ist explizit berechtigt
| |
| |-
| |
| | <code>~all</code> || 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==
| |
| ;Verzeichnis anlegen und Schlüssel generieren
| |
| * 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==
| |
| ;Signing-Konfiguration anlegen
| |
| * vi /etc/rspamd/local.d/dkim_signing.conf
| |
| <syntaxhighlight lang="bash">
| |
| enabled = true;
| |
| domain {
| |
| it2XX.int {
| |
| path = "/var/lib/rspamd/dkim/it2XX.int.mail.key";
| |
| selector = "mail";
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| * systemctl restart rspamd
| |
| | |
| ==DNS-Eintrag==
| |
| ;Public Key auslesen
| |
| * cat /var/lib/rspamd/dkim/it2XX.int.mail.pub
| |
| | |
| Der Inhalt sieht etwa so aus:
| |
| <pre>
| |
| mail._domainkey.it2XX.int IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
| |
| </pre>
| |
| | |
| ;Eintrag per nsupdate auf ns.it2XX.int eintragen
| |
| * nsupdate -k /etc/bind/rndc.key
| |
| <pre>
| |
| server 127.0.0.1
| |
| zone it2XX.int
| |
| update add mail._domainkey.it2XX.int 3600 TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
| |
| send
| |
| EOF
| |
| </pre>
| |
| | |
| * 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==
| |
| ;TXT-Record auf ns.it2XX.int eintragen
| |
| * vi /etc/bind/db.it2XX.int
| |
| <syntaxhighlight lang="bash">
| |
| _dmarc.it2XX.int. IN TXT "v=DMARC1; p=none; rua=mailto:postmaster@it2XX.int"
| |
| </syntaxhighlight>
| |
| | |
| ;Bedeutung der Parameter
| |
| {| class="wikitable"
| |
| ! Parameter !! Bedeutung
| |
| |-
| |
| | <code>v=DMARC1</code> || DMARC Version 1
| |
| |-
| |
| | <code>p=none</code> || Nur beobachten, nichts abweisen (zum Einstieg)
| |
| |-
| |
| | <code>rua=</code> || Adresse für Aggregat-Reports
| |
| |}
| |
| | |
| !!!'''Wichtig'''!!! <code>p=none</code> ist nur für den Anfang. Sobald SPF und DKIM stabil laufen auf <code>p=quarantine</code> oder <code>p=reject</code> umstellen.
| |
| | |
| * rndc reload
| |
| | |
| =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 DKIM
| |
| | |
| ==Logs==
| |
| ;Postfix und Rspamd live beobachten
| |
| * journalctl -u postfix -f
| |
| * journalctl -u rspamd -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==
| |
| ;Testmail mit EICAR-Anhang durch Rspamd scannen
| |
| * rspamc --ip 1.2.3.4 /tmp/virus.eml
| |
| | |
| =Ports und Dienste=
| |
| {| class="wikitable"
| |
| ! 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
| |
| |}
| |
| | |
| [[Kategorie:Mail]]
| |
| [[Kategorie:Security]]
| |
| [[Kategorie:DMZ]]
| |