amavisd-new und policy banks
Geschrieben in
Technik
Donnerstag, 16. Juli 2009
(Anmerkung: Ich schreibe diesen Artikel gerade zum zweiten Mal - habe also auf die harte Tour herausgefunden, daß das Autosave-Plugin meines S9Y nicht mit dem Plugin für erweiterte Eigenschaften von Einträgen harmoniert. Toller Roller! Was ich damit sagen will: Seid mir nicht böse, wenn einige Formulierungen etwas kurz ausfallen.)
Ich hatte es lange vor mir hergeschoben, aber in den letzten Tagen habe ich dann doch mal mein Mailsystem von ein paar alten Krücken befreit und den Mailfluss logischer gestaltet. Im Einzelnen hatte das alte Setup folgende Probleme:
Die Filterung auf schädliche bzw. unerwünsche Inhalte in Postfix bedeutet eigentlich immer, daß die Mail zweimal mit Postfix in Berührung kommt. Wenn man nun den Server auch noch zum Versand von Nachrichten und als Mailinglsiten-Server einsetzt, evt. lokal eine Webmail-Oberfläche installiert hat und wie oben erwähnt einen Secondary MX betreibt, dann muß man sich über ein paar Punkte ernsthafte Gedanken machen:
Zusätzlich sollte man sich überlegen, ob die verarbeiteten Mails von einem selbst (lokal, durch Benutzer, die sich authentifizieren etc.) erzeugt werden oder nicht - im ersten Fall könnte man dann zustäzlich noch Benachrichtigungen konfigurieren, falls einer der eigenen Benutzer oder eine Workstation im eigenen Netz (das war jetzt der Hinweis, daß man @mynetworks korrekt konfigurieren, also z.B. auch den Secondary MX aufnehmen sollte!) oder gar der eigene Server plötzlich Spam oder Viren verschicken sollte.
Nachdem ich fast zehn Minuten lang mit Stift und Papier (kein Witz!) beschäftigt war, habe ich für mich die folgenden fünf Wege durch mein System gefunden:
Ich hatte es lange vor mir hergeschoben, aber in den letzten Tagen habe ich dann doch mal mein Mailsystem von ein paar alten Krücken befreit und den Mailfluss logischer gestaltet. Im Einzelnen hatte das alte Setup folgende Probleme:
- Mails, die von Mailman erzeugt wurden, sind an amavisd-new vorbei gegangen. Im Prinzip müssen die zwar auch nicht gescannt werden, aber da sie dann natürlich auch nicht im SQL-Logging landen, kann man den Bounce-Killer nicht einschalten.
- Von Sender-Verifikationstechniken wie DKIM, DomainKeys und SPF mag man halten, was man will, aber ohne tut man sich schwer, Mails bei einigen großen Freemail-Providern abzuladen. Für die Signierung mit DKIM und DomainKeys habe ich die sendmail-Milter benutzt - hier wollte ich DomainKeys rauswerfen und den DKIM-Part dann an amavisd-new deligieren.
- Da ich amavisd-new in einem before-queue-Setup betreibe und unerwünschte Inhalte direkt im SMTP-Dialog ablehnen lasse, aber auch einen Secondary MX mein Eigen nenne, hatte ich für Mails, die der Secondary einliefert, ein etwas krudes Setup, mit eigener Transportweg-Definition auf dem Secondary und zweitem smtpd auf dem Primary - auch das war mir zu kompliziert.
Die Filterung auf schädliche bzw. unerwünsche Inhalte in Postfix bedeutet eigentlich immer, daß die Mail zweimal mit Postfix in Berührung kommt. Wenn man nun den Server auch noch zum Versand von Nachrichten und als Mailinglsiten-Server einsetzt, evt. lokal eine Webmail-Oberfläche installiert hat und wie oben erwähnt einen Secondary MX betreibt, dann muß man sich über ein paar Punkte ernsthafte Gedanken machen:
- Header- und Body-Checks: In einem before-queue-Setup kommen die Header- und Body-Checks sowieso nicht zum Tragen, wenn man nun also die Anzahl der zusätzlichen smtpd-Einträge in der master.cf begrenzen will, dann sollte man sich Gedanken darüber machen, daß man auch die Wege durch amavisd-new, in denen after-queue-Filtering definiert ist, möglichst konsistent gestaltet (Parameter receive_override_options, Wert no_header_body_checks). Erschwerden kommt ein kleiner Bug in neuen amavisd-new-Versionen hinzu.
- Es ist nicht immer sinnvoll oder möglich, before-queue-Filterung zu betreiben. Typische Beispiele sind das lokale Einliefern von Mails z.B. via pickup(8) oder die Mails, die eine Mailingliste generiert.
- Ein Ablehnen von Mails sollte man tunlichst unterlassen, wenn man dabei Backscatter erzeugen könnte.
- Das Umschreiben von Adressen, z.B. via virtual_alias_maps, sollte man tunlichst immer nur einmal durchführen. Am besten ist es natürlich, wenn amavisd-new keine umgeschriebenen Empfänger zu sehen bekommt, nur so kann man z.B. für die postmaster@ eigene Regeln definieren (Parameter receive_override_options, Wert no_address_mappings).
- Die Verifikation von Empfängeradressen sollte man ebenfalls nicht zweimal durchführen - und bei Mailinglisten-Programmen kann es z.B. sinnvoll sein, ganz darauf zu verzichten (Parameter receive_override_options, Wert no_unkown_recipient_checks).
Zusätzlich sollte man sich überlegen, ob die verarbeiteten Mails von einem selbst (lokal, durch Benutzer, die sich authentifizieren etc.) erzeugt werden oder nicht - im ersten Fall könnte man dann zustäzlich noch Benachrichtigungen konfigurieren, falls einer der eigenen Benutzer oder eine Workstation im eigenen Netz (das war jetzt der Hinweis, daß man @mynetworks korrekt konfigurieren, also z.B. auch den Secondary MX aufnehmen sollte!) oder gar der eigene Server plötzlich Spam oder Viren verschicken sollte.
Nachdem ich fast zehn Minuten lang mit Stift und Papier (kein Witz!) beschäftigt war, habe ich für mich die folgenden fünf Wege durch mein System gefunden:
- Mail von irgendwelchen Dritten an Empfänger auf dem System: Hier deaktiviert man Body- und Header-Checks sowie Adressumschreibungen, überprüft die Mail, bevor sie in die Postfix-Queue gelangt, lehnt Spam- und Viren direkt ab, deaktiviert DKIM-Signing in amavisd-new und lässt auf dem smtpd, den man im zweiten Durchgang benutzt, die Prüfung von Empfängeradressen unter den Tisch fallen.
- Falls die Mail aus einem der eigenen Netze kommt, dann verfährt man wie in Punkt 1., lässt unerwünschte Inhalte jedoch passieren und aktiviert die DKIM-Signierung. Für die Reinjection kann man getrost den smtpd aus Punkt 1 wiederverwenden.
- Mail von Benutzern, die sich authentifizieren: Hierzu verwendet man die beiden dedizierten Ports 465 und 587, aktiviert das Signieren von Mails, lehnt unerwünschte Inhalte sofort ab und konfiguriert die Postifx-Seite ansonsten wie bei Punkt 1., verwendet also den gleichen smtpd für die Reinjection (den zweiten Durchgang halt) wie bei Punkt 1., die Konfiguration des Filters kann man wie in Punkt 2. handhaben.
- Mail, die lokal via sendmail(8), also pickup(8) in die Queue gelangte: Hier setzt man natürlich einen after-queue-Filter, definiert in der master.cf, ein, aktiviert das Signieren, lässt unerwünschte Inhalte durch und kann für den smtpd im zweiten Durchgang getrost alle erwähnten Werte für receive_override_options setzen.
- Für die Mails, die Mailman erzeugt, legt man einen gesonderten smtpd an, der im after-queue-Filter alle Checks deaktiviert hat und nur signiert. Für den zweiten Durchgang kann man den smtpd aus Punkt 4 recyclen.
Postfix-seitig sehen die relevanten Teile der master.cf dabei wie folgt aus:
Die dazugehörigen Teile der amaivsd-new-Konfiguration:
Tja, und ob ihr es glaubt oder nicht, das alles erhöht die Übersichtlichkeit. Natürlich wird das alles so nicht einfach so funktionieren, ich habe hier z.B. (absichtlich) die Default-Werte z.B. für das Verhalten bei Spam ausgelassen, ebenso die Konfigurationen für PenPals, den Bounce Killer, die DKIM-Signierung oder wie die Quarantäne funktionieren soll, falls Viren/Spam durchgelassen werden - das gehört hier aber auch alles nicht hin. Ebenso sind einige der oben genannten Aktionen bei Viren/Spam/$SONSTWAS-Fund leicht blödsinnig, also bitte nicht einfach rauskopieren.
Ich höre mit jetzt Haydn an. Definitiv. Ist genau das richtige Wetter dafür
CODE:
# smtpd auf der IP-Adresse, die auch als MX hinterlegt ist
85.214.107.53:25 inet n - - - - smtpd
-o smtpd_proxy_filter=127.0.0.1:10024
-o receive_override_options=no_address_mappings,no_header_body_checks
# lsmtpd, der nur an localhost lauscht und in amavisd-new eine andere Policy Bank verwendet als obiger Eintrag
127.0.0.1:25 inet n - - - - smtpd
-o smtpd_proxy_filter=127.0.0.1:10028
-o receive_override_options=no_address_mappings,no_header_body_checks
# die zwei smtpd-Einträge für authentifizeirte Nutzer
# die Werte der Optionen kann man, wie hier gezeigt, in der main.cf setzen, um die
# Übersicht zu erhöhen
85.214.107.53:587 inet n - - - - smtpd
-o smtpd_tls_security_level=$submission_smtpd_tls_security_level
-o smtpd_sasl_auth_enable=$submission_smtpd_sasl_auth_enable
-o smtpd_recipient_restrictions=$submission_smtpd_recipient_restrictions
-o syslog_name=$submission_syslog_name
-o smtpd_proxy_filter=$submission_smtpd_proxy_filter
-o receive_override_options=$submission_receive_override_options
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=$smtps_smtpd_tls_wrappermode
-o smtpd_sasl_auth_enable=$smtps_smtpd_sasl_auth_enable
-o smtpd_recipient_restrictions=$smtps_smtpd_recipient_restrictions
-o syslog_name=$smtps_syslog_name
-o smtpd_proxy_filter=$smtps_smtpd_proxy_filter
-o receive_override_options=$smtps_receive_override_options
# lokal, z.B. via /usr/sbin/sendmail erzeugte Mails kriegen einen content-filter verpasst
pickup fifo n - - 60 1 pickup
-o content_filter=lmtp-amavis:[127.0.0.1]:10026
# lmtp-client zum content-filter in einem post-queue-Setup
lmtp-amavis unix - - n - 10 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
-o disable_dns_lookups=yes
# smtpd: pre-queue reinjection
# external mail: smtpd:25/587 -> amavisd-new:10024/10028 -> smtpd:10025
127.0.0.1:10025 inet n - - - - smtpd
-o mynetworks=127.0.0.0/8
-o receive_override_options=no_unknown_recipient_checks
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-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 smtpd_delay_reject=no
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
-o syslog_name=postfix-10025
# smtpd: post-queue reinjection
# local mail, pickup -> amavisd-new:10026/10032 -> smtpd:10027
127.0.0.1:10027 inet n - - - - smtpd
-o mynetworks=127.0.0.0/8
-o receive_override_options=no_header_body_checks,no_address_mappings,no_unknown_recipient_checks
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-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 smtpd_delay_reject=no
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
-o syslog_name=postfix-10027
# smtpd: Mailman injection
# Mailman -> smtpd:10031 -> amavisd-new:10032 -> smtpd:10027 (see above)
127.0.0.1:10031 inet n - - - - smtpd
-o mynetworks=127.0.0.0/8
-o content_filter=lmtp-amavis:[127.0.0.1]:10032
-o receive_override_options=
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-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 smtpd_delay_reject=no
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
-o syslog_name=postfix-mm
Die dazugehörigen Teile der amaivsd-new-Konfiguration:
CODE:
$inet_socket_port = [9998, 10024, 10026, 10028, 10032]; # listen on listed inet tcp ports
$interface_policy{'9998'} = 'AM.PDP-INET'; # apply policy bank AM.PDP-INET to some inet tcp socket, e.g. tcp port 9998:
$interface_policy{'10024'} = 'PREQ-EXT'; # externally delivered mail
$interface_policy{'10026'} = 'POSTQ-PICKUP'; # mail submitted by /usr/sbin/sendmail
$interface_policy{'10028'} = 'PREQ-SUB'; # mail submitted using TLS on submission/smtps port
$interface_policy{'10032'} = 'POSTQ-MAILMAN'; # mail submitted by mailman
# all notifying is done using a fully functional Postfix smtpd
$notify_method = 'smtp:[127.0.0.1]:10025';
# external mail coming to mail.incertum.net
# smtpd:25 -> amavisd-new:10024 -> smtpd:10025
# reject mails, don't do singing
$policy_bank{'PREQ-EXT'} = {
final_spam_destiny => D_REJECT,
forward_method => 'smtp:127.0.0.1:10025',
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} EXTERNAL service ready',
};
# mail coming from @mynetworks, that's most notably our secondary MX
# smtpd:25 -> amavisd-new:10024 -> smtpd:10025, for MYNETS
# don't reject mails, prepare to do signing
$policy_bank{'MYNETS'} = {
originating => 1, # indicates client is ours, allows signing
final_spam_destiny => D_PASS,
smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} MYNETS service ready',
};
# mail submitted locally by /usr/sbin/sendmail
# pickup -> amavisd-new:10026 -> smtpd:10027
# don't reject mails, do signing
$policy_bank{'POSTQ-PICKUP'} = {
originating => 1, # indicates client is ours, allows signing
final_spam_destiny => D_PASS,
forward_method => 'smtp:127.0.0.1:10027',
smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} PICKUP service ready',
spam_admin_maps => ["postmaster@incertum.net"], # warn of spam from us
virus_admin_maps => ["postmaster@incertum.net"],
};
# mail deliviered to our submission port
# smtpd:587(465) -> amavisd-new:10028 -> smtpd:10025
# do signing, do reject
$policy_bank{'PREQ-SUB'} = {
originating => 1, # indicates client is ours, allows signing
final_spam_destiny => D_REJECT,
forward_method => 'smtp:127.0.0.1:10025',
smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} SUBMISSION service ready',
spam_admin_maps => ["postmaster@incertum.net"], # warn of spam from us
virus_admin_maps => ["postmaster@incertum.net"],
};
# mail from Mailman to be fanned out
# smtpd:10031 -> amavisd-new:10032 -> smtpd:10027
# do signing, don't do checks, don't reject
$policy_bank{'POSTQ-MAILMAN'} = {
originating => 1, # indicates client is ours, allows signing
final_spam_destiny => D_PASS,
forward_method => 'smtp:127.0.0.1:10027',
smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
smtpd_greeting_banner => '${helo-name} ${protocol} ${product} NOCHECKS service ready',
mynetworks_maps => [], # avoids loading MYNETS policy unnecessarily
client_ipaddr_policy => [], # avoids loading MYNETS policy unnecessarily
os_fingerprint_method => undef,
penpals_bonus_score => undef,
bounce_killer_score => 0,
bypass_decode_parts => 1,
bypass_header_checks_maps => [1],
bypass_virus_checks_maps => [1],
bypass_spam_checks_maps => [1],
bypass_banned_checks_maps => [1],
spam_lovers_maps => [1],
banned_files_lovers_maps => [1],
archive_quarantine_to_maps => [],
remove_existing_x_scanned_headers => undef,
remove_existing_spam_headers => undef,
signed_header_fields => { 'Sender' => 1 },
};
Tja, und ob ihr es glaubt oder nicht, das alles erhöht die Übersichtlichkeit. Natürlich wird das alles so nicht einfach so funktionieren, ich habe hier z.B. (absichtlich) die Default-Werte z.B. für das Verhalten bei Spam ausgelassen, ebenso die Konfigurationen für PenPals, den Bounce Killer, die DKIM-Signierung oder wie die Quarantäne funktionieren soll, falls Viren/Spam durchgelassen werden - das gehört hier aber auch alles nicht hin. Ebenso sind einige der oben genannten Aktionen bei Viren/Spam/$SONSTWAS-Fund leicht blödsinnig, also bitte nicht einfach rauskopieren.
Ich höre mit jetzt Haydn an. Definitiv. Ist genau das richtige Wetter dafür







Nachdem ich mich hier und hier schon zum Deppen gemacht habe bei dem Versuch, einen längeren Blog-Eintrag zu schreiben und gleichzeitig etwas dagegen zu unternehmen, daß er weg ist, wenn ich aus Versehen (Ctrl - W!) das Fenster schließe, war die Lösung ei
Aufgenommen: Jul 27, 09:47
Eine der ärgerlichsten Sachen, wenn man Mails noch während des SMTP-Dialogs auf Spam und Viren filtert, ist ganz klar, daß man das ja auch für Mails von Mailing-Listen tut. Und wenn man da zu oft Mails ablehnt, dann fliegt man relativ schnell von der List
Aufgenommen: Aug 14, 13:21