41
Die Schnittstelle Implementation Fragen und Diskussion Postfix Policy Daemons im Eigenbau. Sinn und Implementation. David Schweikert ISG.EE - ETH Zürich 2. Mailserver-Konferenz Magdeburg, 20. Mai 2005 David Schweikert ISG.EE - ETH Zürich Postfix Policy Daemons

Postfix Policy Daemons.pdf

Embed Size (px)

DESCRIPTION

Copyright by David Schweickert.Vortrag von der 2. Mailserver-Konferenz 2005

Citation preview

  • 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