Hier ist meine SMTP-Situation.
Der E-Mail-Fluss wird von einem Online-Relay-Anbieter markiert (!!SPAM!!, !!BULK!! usw.)
Der E-Mail-Fluss wird von einem internen Postfix empfangen. Der Transport ist so konfiguriert, dass er an unseren internen Exchange weitergeleitet wird, andernfalls, wenn der Betreff markiert ist. Ich mache das mit Header_checks. Der markierte E-Mail-Fluss wird an unseren Quarantäneserver gesendet (WebUI für einzelne Benutzer usw.).
/^[sS]ubject:.*!!SPAM!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!BULK!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!SUSPECT!!*/ FILTER smtp:192.168.11.250
Es funktioniert einwandfrei. Unser Quarantäneserver kann eine Liste vertrauenswürdiger Absender für Benutzer erstellen. Diese Whitelist ist verfügbar und ich kann sie auf mein Postfix herunterladen.
Meine Frage ist: Wie kann ich meine Whitelist vor der Header-Prüfung anwenden?
If Subject contains *!!SPAM!!*
then
If from contains [email protected] AND if to contains [email protected]
Then redirect to internal exchange server
else redirect to quarantine server
endif
endif
Ich weiß nicht, wie das geht. Irgendwelche Tipps?
Antwort1
Nach einem Kommentar von @masegaloeh habe ich eine Lösung gefunden. Die Idee besteht darin, einen zweiten Postfix-SMTP-Server zu haben, der mit einem Richtlinienserver auf 10025 lauscht, um E-Mails an den normalen Server (sofern auf der Whitelist) oder an den Quarantäneserver zu senden.
Die Idee begann als Ihre header_checks-Lösung in main.cf:
header_checks = regexp:/etc/postfix/header_checks
In header_checks:
/^(S|s)ubject: .*!!(SPAM|BULK|SUSPECT)!!.*/ FILTER smtp:127.0.0.1:10025
Dann in master.cf (bearbeitet mit @masegaloeh-Kommentaren):
10025 inet n - n - - smtpd
-o receive_override_options=no_header_body_checks
-o smtpd_recipient_restrictions=${my_switcher_restrictions}
policy unix - n n - 0 spawn user=nobody argv=/etc/postfix/policy-server-switcher
Dadurch wird die Verwendung von header_checks durch die zweite Instanz von Postfix außer Kraft gesetzt.
Und in main.cf
my_switcher_restrictions = check_policy_service unix:private/policy
Und der Inhalt von Policy-Server-Switcher
!/bin/bash
sender=""
recipient=""
while read line
do
key=$(echo $line | cut -f1 -d=)
value=$(echo $line|cut -f2 -d=)
if [ "$key" == "sender" ]
then
sender=${value}
logger -p mail.info -t PolicyServer "Sender is: ${value}"
fi
if [ "$key" == "recipient" ]
then
recipient=${value}
logger -p mail.info -t PolicyServer "Recipient is: ${value}"
fi
if [ "x${recipient}" != "x" ] && [ "x${sender}" != "x" ]
then
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
echo "action=FILTER smtp:192.168.1.151"
echo
exit 0
fi
done
Natürlich müssen Sie Ihren Richtlinienserver so programmieren, dass er die Whitelist aus der Datenbank oder aus LDAP lädt. Hier ist nur ein Beispiel, um Ihnen einen Eindruck davon zu vermitteln.
Aber das hat noch einige Einschränkungen, nehmen wir an, ich sende eine Mail mit diesem
Dies wird für alphamikevictor und thomas an den normalen Server gesendet, sofern der letzte Test mit dem Richtlinienserver FILTER auf den Normalwert zurücksetzt. Wenn Sie alphamikevictor jedoch an die zweite Position setzen, werden E-Mails für beide Empfänger in die Quarantäne gesendet.