Kapitel 18 Mail-Transport & Abwehr Admin: #pMtaFilters

Milter (Sendmail-Milter-Protokoll) und MTA-Hooks (HTTP pro SMTP-Phase)

Vorhandene Filter lassen sich direkt in den SMTP-Dialog einhängen: Milter sprechen das Sendmail-Milter-Protokoll Version 6 (Rspamd über den Milter-Proxy, ClamAV-Milter, OpenDKIM, DLP-Produkte), MTA-Hooks sind einfache HTTP-Dienste, die pro Phase (CONNECT, EHLO, MAIL FROM, RCPT TO, DATA) ein JSON-Dokument erhalten und eine Entscheidung zurückgeben. Beide laufen für eingehende Mails (Port 25) und auf Wunsch auch für die Einlieferung (465/587). Eingerichtet wird unter Milter & MTA-Hooks (#pMtaFilters) mit Test-Knopf pro Eintrag.

Praxis-Tipp & Architektur-Hinweis

Standardaktion bewusst wählen: "annehmen" (fail open) hält den Mailfluss bei einem Filterausfall am Laufen, "vorübergehend abweisen" (wie Postfix milter_default_action = tempfail) lässt Absender später erneut zustellen, bis der Filter wieder läuft. Für Virenscanner ist tempfail sicherer, für reine Bewertungsdienste accept. Quarantäne legt eingehende Mails im Junk-Ordner ab; bei der Einlieferung wird die Mail mit 550 abgewiesen.

Antwort eines MTA-Hooks (Stalwart-kompatibel)

Anfrage: context (stage, client, sasl, tls, server, queue, protocol), envelope (from, to) und bei DATA message (headers, contents, size). Signatur im Header X-Nextxch-Signature: sha256=HMAC über den Body.

Referenz / Konfiguration
POST https://dlp.intern/hook   (X-Nextxch-Hook-Stage: data)

{
  "action": "accept",
  "modifications": [
    { "type": "addHeader", "name": "X-DLP-Status", "value": "clean" },
    { "type": "changeHeader", "index": 1, "name": "Subject", "value": "[extern] Angebot" },
    { "type": "deleteHeader", "index": 1, "name": "X-Internal-Route" }
  ]
}

{ "action": "reject", "response": { "status": 550, "enhancedStatus": "5.7.1", "message": "Vertrauliche Daten erkannt" } }
{ "action": "tempfail", "response": { "status": 451, "message": "Bitte später erneut versuchen" } }
{ "action": "quarantine" }      { "action": "discard" }

Einstellungen, Standardwerte & Best Practices

Einstellung / Ort Funktion Standardwert Best Practice im Betrieb
Milter-Adresse TCP oder Unix-Socket des Milters: inet:host:port, inet:port@host (Sendmail-Schreibweise), host:port oder unix:/pfad. - Rspamd: inet:127.0.0.1:11332 (Proxy-Worker mit milter = yes). ClamAV-Milter: unix:/run/clamav/clamav-milter.ctl oder inet:127.0.0.1:7357.
Phasen und Aktionen (Milter) Optionsaushandlung v6, Makros (j, {client_addr}, i, {auth_authen}, {mail_addr}, {rcpt_addr}), connect, helo, mail, rcpt, data, header, eoh, body, eom. Antworten: accept, continue, reject, tempfail, discard, Antwortcode, Quarantäne. Änderungen: Header hinzufügen, einfügen, ändern, Inhalt ersetzen, Empfänger hinzufügen/entfernen, Absender ändern. alle angeboten Phasen, die der Milter abwählt (SMFIP_NO*), werden nicht gesendet; Phasen ohne Antwort (SMFIP_NR_*) werden nicht abgewartet.
Zeitlimits Verbinden, je Befehl und für Inhalt/Ende der Nachricht getrennt einstellbar; Fortschrittsmeldungen (progress) verlängern das Inhaltslimit. 5 s / 10 s / 60 s Für Virenscanner mit großen Anhängen das Inhaltslimit auf 120 bis 300 s erhöhen.
MTA-Hook Phasen und Sicherheit Pro Hook wählbar: connect, ehlo, mail, rcpt, data. Optionaler Auth-Header (z. B. Authorization: Bearer ...) und HMAC-SHA256-Signatur; beide werden verschlüsselt gespeichert und nie angezeigt. data Nur benötigte Phasen aktivieren: jeder Aufruf verlängert den SMTP-Dialog um die Antwortzeit des Hooks. Der Hook sollte in unter einer Sekunde antworten.
Reihenfolge Milter und Hooks laufen nach dem Feld Reihenfolge; die erste Abweisung beendet die Kette. Bei DATA sieht jeder Filter die Nachricht mit den Änderungen der vorherigen. Milter 100, Hooks 200 Schnelle, günstige Prüfungen (z. B. Reputation) vor teure (Virenscan) setzen.