-
Die Schnittstelle Implementation Fragen und Diskussion
Postfix Policy Daemons im Eigenbau.Sinn und Implementation.
David Schweikert
ISG.EE - ETH Zrich
2. Mailserver-KonferenzMagdeburg, 20. Mai 2005
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
ber die ISG.EE
IT Support Gruppe an der ETH Zrich15 MitarbeiterAlle unsere
Tools sind GPLhttp://isg.ee.ethz.ch
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
ber mich
Arbeite seit 5 Jahren bei der ISG.EEAdministration von
Mail-Servers (unter anderem)Open-Source Projekte: Mailgraph,
Postgrey, Gedafe, ISGTC,Perl-Modulehttp://people.ee.ethz.ch/dws
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Postfix Policy Daemons im Eigenbau1 Die Schnittstelle
Was ist eine SMTP-Policy?Beispiel SMTP-PoliciesMotivation fr ein
externer ProzessDas ProtokollKonfiguration in Postfix
2 ImplementationImplementation mit spawnImplementation als
einzelne ProzessDatenbankenTestenTypische Fallen
3 Fragen und Diskussion
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Was ist eine SMTP-Policy?
Was ist eine SMTP-Policy?
Entscheiden beimMail-Verkehrseingang (SMTP-Protokoll), wasmit
einer E-Mail gemacht werden soll:
Zurckweisen mit einem definitiven FehlerZurckweisen mit einem
temporren FehlerMail akzeptieren (kann spter noch bouncen)Kein
Entscheid: weitere Policy-Regeln berprfen
Postfix: smtpd_xxx_restrictions
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Was ist eine SMTP-Policy?
Beispiel SMTP-Session
220 example.com ESMTP PostfixHELO ee.ethz.ch250 example.comMAIL
FROM: 250 OkRCPT TO: 451 Greylisted for 300 secondsQUIT
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Beispiel SMTP-Policies
Policy-Beispiel: Relaying nur fr lokale Clients
Nur lokale Clients drfen Mails schicken, die an
Dritteweitergeleitet werden sollen.
Input aus demMail-System:IP-Adresse der Mail-Client
Policy:Bekannte Adresse? ACCEPT
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Beispiel SMTP-Policies
smtpd_recipient_restrictions
In Postfix sind Policies mit
smtpd_xxx_restrictionskonfiguriert:smtpd_recipient_restrictions
=
reject_non_fqdn_recipientreject_unlisted_recipientpermit_mynetworkspermit_sasl_authenticatedcheck_client_access
hash:/etc/postfix/client_accessreject_unauth_destination
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Beispiel SMTP-Policies
Policy-Beispiel: SPFBekmpfung von Flschungen der
Absender-Adresse:Darf dieser Mail-Client, Mails mit dieser
Absender-Mail-Domainzu verschicken?
Input aus demMail-System:Mail-Domain der Absender (Envelope
Sender)IP-Adresse der Mail-Client
Policy:Aus der DNS (SPF TXT-Eintrge):erlaubte Mail-Clients fr
diese Mail-DomainMail-Client nicht in der Liste? REJECT
Ist mit den eingebauten Restrictions von Postfix nicht
mglich.
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Beispiel SMTP-Policies
Policy-Beispiel: Greylisting
Echte Mail-Servers reagieren auf temporre Fehler indem siespter
erneut Versuch die Mail zu versenden. Idee: einentemporren Fehler
beim ersten Versuch erzeugen. Spammershaben keine echten Mailserver
und kommen daher nicht wieder.
Input aus demMail-System:IP-Adresse der Mail-ClientAbsender
AdresseEmpfnger Adresse
Policy:Triplet neu? DEFER
Nicht mglich mit den eingebauten Restrictions von Postfix.
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Beispiel SMTP-Policies
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Motivation fr ein externer Prozess
Geschichte
Juni 2003: Greylisting-Paper von Evan HarrisJuli 2003: SPF-Talk
von MengWengWongJuli 2003: Ankndigung vonWietse Venema:SMTPD Policy
Delegation
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Motivation fr ein externer Prozess
Warum ein externer Prozess?
Hohe Komplexitt (Implementation und
Konfiguration)(Mail::SPF::Query ist 64KB Perl-Code)Sicherheit:
Keine Abhngigkeit zu externen LibrariesHohe Flexibilitt
verlangtPolicy-Entscheide knnen an einen anderen Server
delegiertwerdenPerformance kann trotzdem gut sein
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Motivation fr ein externer Prozess
Anwendungsbeispiele fr Policy-Daemons
AuthentisierungAuthentisierung der eigenen ClientsSPF
Anti-SPAMGreylistingSpam-Trap Blacklisting
Nicht geeignetCaller-ID / Sender-IDContent-FilterOutbound-Policy
(z.B. SPF/SRS)
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Das Protokoll
Das Protokoll: Postfix
Daemonrequest=smtpd_access_policyprotocol_state=RCPTprotocol_name=SMTPhelo_name=some.domain.tldqueue_id=8045F2AB23sender=foo@[email protected]_address=1.2.3.4client_name=another.domain.tldinstance=123.456.7sasl_method=plainsasl_username=yousasl_sender=size=12345[leere
Zeile]
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Das Protokoll
Das Protokoll: Daemon Postfix
action=defer_if_permit Greylisted[leere Zeile]
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Das Protokoll
Mgliche Antworten (aus accept(5)):
OK
all-numerical (wie OK)4NN text (temporre Fehler)5NN text
(definitive Fehler)REJECT optional textDEFER_IF_REJECT optional
textDEFER_IF_PERMIT optional text
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Das Protokoll
Mgliche Antworten (aus accept(5)):
restriction (entsprechende restriction applizieren)DISCARD
optional textDUNNO
FILTER transport:destinationHOLD optional textPREPEND
headername: headervalueREDIRECT user@domainWARN optional text
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Konfiguration in Postfix
Konfiguration in Postfix
smtpd_recipient_restrictions
=reject_non_fqdn_recipientreject_unlisted_recipientpermit_mynetworkspermit_sasl_authenticatedcheck_client_access
hash:/etc/postfix/client_accessreject_unauth_destinationcheck_policy_service
inet:127.0.0.1:10023
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation mit spawn
Implementation mit spawn
Postfix-quivalent zu inetdWrapper fr Programmen, die mit
stdin/stdout arbeitenProzesse werden nach Bedarf gestartet
(parallel)Prozesse nach maximal 100 (max_use) Anfragen
terminiert
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation mit spawn
Implementation mit spawn: master.cf
# service type priv unpri chroot wakeup maxproc
command127.0.0.1:10023 inet - n n - - spawn
user=nobody argv=/some/where/policy-server
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation mit spawn
Implementation mit spawn: Hauptschleife
while () {if (/(.*?)=(.*)\n/) {
$attr{$1} = $2;} elsif ($_ eq "\n") {
fatal_exit "unrecognized request type"unless $attr{request} eq
"smtpd_access_policy";
$action = smtpd_access_policy(\%attr);print STDOUT
"action=$action\n\n";%attr = ();
}}
(aus Postfixs greylist.pl, vereinfacht)
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation mit spawn
Implementation mit spawn: Vor-/Nachteile
Vorteile:Sehr einfache ImplementationIdeale Integration in
Postfixberwachung durch Postfix
Nachteile:Muss schnell startenViele unabhngige Prozesse
Schwierigkeit bei gemeinsame Daten (greylist.pl ist nicht
zuverlssig)
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation als einzelne Prozess
Wie kann man das Locking Problem lsen?Nur ein ProzessMehrere
ClientsSelect-loopSchwierigkeit: nur Ausschnitte vom gesamten
VerkehrManmuss zuerst den vollstndigen Requestzusammenbauen
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation als einzelne Prozess: Vor-/Nachteile
Vorteile:Schnell unabhngig der Startup-ZeitKein Locking
Nachteile:Skaliert nicht auf mehrere CPUProgrammierung nicht
ganz trivial
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation als einzelne Prozess
Die Implementation mit select ist komplexAbhilfe schafft
Net::Server
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation mit Net::Server
Prozess-Modell ist whlbar und
austauschbar:Inetd/spawnSingleMultiplexing (einzelne Prozess mit
select)Forking, Pre-Forking
OptionenLoggingDaemonifizierungZugriffskontrolle
(allow/deny)Signal-Handlung (inklusive HUP)
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation mit Net::Server
Prozess-Modell whlenApplikation als Subklasse
schreiben$self->process_request und andere bentigteProzeduren
nach Bedarf berschreiben
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Implementation als einzelne Prozess
Implementation mit Net::Server::Multiplex
$self->mux_input statt process_requestInput konsumierenWenn
Input reicht, Request behandeln
sub mux_input(){
my ($self, $mux, $fh, $in_ref) = @_;while ($$in_ref =~
s/^([^\r\n]*)\r?\n//) {
next unless defined $1;my $in = $1;# etwas mit $in tun
}}
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken-Wahl
Welche Datenbank ist am besten geeignet?Welche Vor- und
Nachteile?
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken: Text-Dateien
Vorteile:Einfach zu debuggen / auswerten
Nachteile:PerformanceRandom access (read/write) schwierigLocking
muss selber gemacht werden
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken: Persistente Objekte
Zum Beispiel mit Perls Storable...
Vorteile:Einfache Programmierung
Nachteile:Alles imMemory!Nur ein globales LockKeine Transactions
/ Recovery Prozedur
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken: Berkeley-DBVorteile:
PerformanceAngenehm fr Key/Value (tie im Perl)Transactions und
RecoveryLocking
Nachteile:Locking ist etwas komplex (Deadlock detection)Nur
Key/Value-Modell
Postgrey: Die CPU ist mit 40000 eingehende Mails pro Tag
0.2%ausgelastet (1.2 Ghz UltraSparc IIIi)
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken: SQLiteVorteile:
PerformancePublic Domain!Flexibilitt und Features von
SQLLocking
Nachteile:DBD ist schwieriger als tieGlobales Lock (mit nicht zu
hufige COMMITs aber trotzdemsehr schnell)
Meine Empfehlung ausser es gibt spezielle Bedrfnisse
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Datenbanken
Datenbanken: MySQL / PostgreSQL
Vorteile:PerformanceFlexibilitt und Features von
SQLLockingClient-Server
Nachteile:InstallationKomplexitt des gesamten Systems
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Testen
Testen
Von Handtelnet localhost 10023Copy/Paste einer
Policy-Request
Mit XCLIENTFlschung von Eckdaten einer SMTP-SessionClient muss
freigeschaltet werten:smtpd_authorized_xclient_hosts =
localhost
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Testen
Testen
dws@tardis:~$ telnet localhost 25Trying 127.0.0.1...Connected to
localhost.Escape character is ^].220 smtp.ee.ethz.ch ESMTP
PostfixXCLIENT NAME=test.example.com ADDR=192.168.1.1250 OkMAIL
FROM:250 OkRCPT TO:450 : Recipient address rejected: Greylisted
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Typische Fallen
Falle: Mails mit mehrere Empfnger
Postgrey fgt einen Header ein, falls es ein Delay
verursachthatMehrere Empfngermehrere Header
Lsung:Mit instance die Requests korrelieren und nur einmal
denHeader einfgen
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Typische Fallen
Falle: Crash des Daemon
Postgrey: Crash wenn %n in der Absender-Adresse vorkommtUrsache:
indirekt syslog (wie printf) wie ein putsgebrauchtKonsequenz: 450
Server configuration problemDenial-of-Service!
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Zusammenfassung
Zusammenfassung
Sehrmchtig fr spezielle Anwendungen.
KeinContent-Filter!Aufpassen, wie es in Postfix konfiguriert
wirdImplementation muss robust sein: das ganze Mail-Systemhngt
davon abNet::Server und SQLite sind ntzlich bei
derProgrammierung
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
-
Die Schnittstelle Implementation Fragen und Diskussion
Fragen?
David Schweikert ISG.EE - ETH ZrichPostfix Policy Daemons
Die SchnittstelleWas ist eine SMTP-Policy?Beispiel
SMTP-Policies