# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1399322901 -7200 # Node ID 40a385bb9b7ef03451dbd4feb2a0f0e826ff44c7 # Parent b2f6ea2362436b8197f5f73e87b7c3432b436304 [snapshot] diff -r b2f6ea236243 -r 40a385bb9b7e Makefile --- a/Makefile Fri May 02 17:03:05 2014 +0200 +++ b/Makefile Mon May 05 22:48:21 2014 +0200 @@ -1,4 +1,4 @@ -IMAGES = procs.pdf +IMAGES = procs.pdf routing.pdf ALL = mk2014.pdf all: $(ALL) diff -r b2f6ea236243 -r 40a385bb9b7e mk2014.tex --- a/mk2014.tex Fri May 02 17:03:05 2014 +0200 +++ b/mk2014.tex Mon May 05 22:48:21 2014 +0200 @@ -12,10 +12,17 @@ \begin{document} +% sicheres logging +% einmal angenommen - verantwortugn + \begin{frame} \titlepage \end{frame} +\begin{frame}{Inhalt} + \tableofcontents +\end{frame} + \begin{frame}[<+->][fragile]{Wie positioniert Exim sich gegenüber anderen MTA} \begin{itemize} @@ -38,44 +45,62 @@ Over 1d 1 0.0% 100.0% \end{verbatim} } + \item Saubere Dokumentation (spec.txt) + \item Dokumentiertes Protokollformat \end{itemize} \end{frame} \begin{frame}{Arbeitsweise und Anatomie}{Überblick} \begin{itemize} -\item Binary: (ca 1MB) großer Universalklumpen -\item Queue: Verzeichnis, 2 Files je Message -\item IPC: nichts, außer fork(2) oder exec(3) -\item Shared: „Hint“-Files (z.B. retry info) +\item Binary ist ein ca 1MB großer Universalklumpen +\item Einfache Struktur der operativen Daten - Verzeichnis, 2 Files je +Message, Spool/Message-Log in 16 Verzeichnissen +\item Dokument +\item Keine aufwändigen IPC - nichts, außer fork(2) oder exec(3) +\item Wenig gemeinsam genutzte Daten - nur „Hint“-Files (z.B. retry info) \end{itemize} \end{frame} \begin{frame}{Arbeitsweise und Anatomie}{Prozesse} \includegraphics[width=0.8\textwidth,angle=270]{procs} -%\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-1}} -%\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-2}} -%\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-3}} -%\multiinclude[<+->][format=pdf,graphics={width=0.8\textwidth,angle=270}]{procs} +\end{frame} + +\begin{frame}{Routing} +\includegraphics[width=0.8\textwidth,angle=270]{routing} \end{frame} \begin{frame}{Arbeitsweise und Anatomie}{IN, OUT, Retry} +Es gibt im wesentlichen 3 Phasen der Verarbeitung \begin{enumerate} - \item IN: ACL (Ratelimit, Blacklists, Routing-Test, Content-Scan) Enqueue - \item OUT: Dequeue, Routing, Transport - \item Retry: Queuerunner, Dequeue, Routing, Transport + \item Empfang + \begin{itemize} + \item ACL mit Ratelimit, Blacklists, Routing-Test, Content-Scan + \item Ablage im Spool-Verzeichnis + \end{itemize} + \item Start des Sendeprozesses + \begin{itemize} + \item Spoolfile-Lock + \item Routing + \item Transport oder ggf. Abbruch + \end{itemize} + \item Queuerunner startet ggf. weitere Versuche \end{enumerate} \end{frame} \begin{frame}[fragile]{Konfiguration}{Struktur} -\begin{itemize} - \item Globaler Teil (ca. 240 Direktiven) - \item Access-Control-Lists für SMTP: \verb=begin acl= - \item Routing-Regeln (ACL und Routing): \verb=begin routers= - \item Transport-Definitionen: \verb=begin transports= - \item Retry-Vorgaben: \verb=begin retry= - \item Envelope/Header-Rewriting: \verb=begin rewrite= - \item SMTP-Authentifizierung: \verb=begin authenticators= -\end{itemize} +Strukturiertes Konfigurationsfile mit mehreren Abschnitten, teilweise +miteinander verlinkt (Router referenziert Tranports, globaler Teil +referenziert ACL) +\begin{description} + \item[global] Etwa 240 allgemeine Direktiven + \item[acl] Access Control Lists für SMTP + \item[routers] Routing-Regeln (genutzt auch von ACL) + \item[transports] Wie wird SMTP gemacht, oder das Anhängen an Mailboxen + \item[retry] Unter welchen Bedingungen wird wann und wie oft und wie + lange wiederholt + \item[rewrite] Umschreiben von Headern und Envelope + \item[authenticators] SMTP-Authentifizierung +\end{description} \end{frame} \begin{frame}[fragile]{Konfiguration}{Syntax} @@ -97,56 +122,66 @@ \end{frame} -\begin{frame}[fragile]{String-Expansionen / Listen / File- und Datenbank-Lookups} +\begin{frame}[fragile]{Konfiguration}{Expansion} Etwa die Hälfte der Konfigurationsdirektiven erlaubt -Variablensubstitution (Expansion)zur Laufzeit. -Testen kann man diese sehr einfach mit \verb=exim -be '…'= -\scriptsize -\begin{verbatim} - exim -be '$primary_hostname' - exim -oMi 1.1.1.1 -oMa 2.2.2.2 -be '$sender_host_address -> $received_ip_address' - exim -be '${lookup{root}lsearch{/etc/aliases}}' - exim -be '${lookup dnsdb{mx=heise.de}}' -\end{verbatim} +Variablensubstitution (Expansion) zur Laufzeit. +Testen kann man diese sehr einfach: +\begin{scriptsize}\begin{verbatim} + $ exim -be '$primary_hostname' + jumper.schlittermann.de + $ exim -be -oMi 1.1.1.1 -oMa 2.2.2.2 '$sender_host_address $received_ip_address' + 2.2.2.2 1.1.1.1 + $ exim -be '${lookup passwd{nobody}{${extract{5}{:}{$value}}}}' + /nonexistent + $ exim -be '${lookup{root}lsearch{/etc/aliases}}' + heiko + $ exim -be '${lookup dnsdb{mx=heise.de}}' + 10 relay.heise.de +\end{verbatim}\end{scriptsize} +\end{frame} +\begin{frame}[fragile]{Expansion}{Übersicht} +Expansion als „working horse“ der Flexibilität +\begin{scriptsize} \begin{description} \item[Variablen] \verb=$local_part=, \verb=${local_part}= -\item[String-Ops] \verb=${sha1:$local_part}=, \verb=${uc:$domain}= -\item[String-Manipulation] \verb=${sg{$local_part}{.laus}{***}}= -\item[Conditional] \verb=${if eq{$local_part}{xxx} {~xxx/.mbox}{/var/mail/$local_part}}= -\item[Lookup single key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}= -\item[Lookup query style] \verb+${lookup dnsdb{mx=heise.de}}+ +\item[Operatoren] \verb=${sha1:$local_part}=, \verb=${uc:$domain}= +\item[Manipulation] \verb=${sg{$local_part}{.laus}{XXX}}= +\item[Bedingungen] \verb=${if eq{$local_part}{x}{~x/.mbox}{/var/mail/$local_part}}= +\item[Lookup/Key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}= +\item[Lookup/Query] \verb+${lookup dnsdb{mx=heise.de}}+ \end{description} +\end{scriptsize} \end{frame} -\begin{frame}[fragile]{String-Expansion}{Variablen} +\begin{frame}[fragile]{Expansion}{Variablen} Es gibt knapp 200 Variablen, Referenzierung als \verb=$= oder \verb=${}=. -\begin{itemize} -\item Empfänger: \verb=$local_part=, \verb=$domain=, \verb=$local_part_prefix= -\item Sender: \verb=$sender_local_part= -\item Message: \verb=$message_line_count=, \verb=$message_size=, \verb=$message_headers= -\item Content: \verb=$spam_score_int=, \verb=$malware_name= -\item Routing: \verb=$original_domain= -\item System: \verb=$load_average=, \verb=$log\_space=, \verb=$pid= -\item Operation: \verb=$received_interface_address=, \verb=$tls_out_peerdn=, \verb=$tls_out_bits= -\end{itemize} +\begin{scriptsize} +\begin{description} +\item[Envelope] \verb=$local_part=, \verb=$domain=, \verb=$local_part_prefix=, + \verb=$sender_local_part=, \verb=$recipients= +\item[Message] \verb=$message_line_count=, \verb=$message_size=, +\verb=$message_headers=, \verb=$h_subject:= +\item[Content] \verb=$spam_score_int=, \verb=$malware_name= +\item[Routing] \verb=$original_domain= +\item[System] \verb=$load_average=, \verb=$log_space=, \verb=$pid= +\item[Operation] \verb=$received_interface_address=, \verb=$tls_out_peerdn=, \verb=$tls_out_bits= +\end{description} +\end{scriptsize} \end{frame} -% items -% ${:} ${[{arg}…]} ${if [{arg}…] } -% operators -% - \begin{frame}[fragile]{String-Expansion}{String-Operationen} Einfache Manipulation von Zeichenketten sind möglich: \verb=${:}= -\begin{itemize} -\item Konvertierung \verb=${uc:$local_part}=, \verb=${sha1:$domain}=, \verb=${time_eval:2d4h}= -\item Extraktion \verb=${length_3:$domain}=, \verb=${substr_1_3:$domain}=, \verb=${addresses:$h_from}= -\item Arithmetik \verb=${eval:40 + 2}=, \verb=${40 + 2k}=, \verb=${eval:8 << 2}= -\item Filesystem \verb=${stat:/etc/hosts}= -\end{itemize} +\begin{scriptsize} +\begin{description} +\item[Konvertierung] \verb=${uc:$local_part}=, \verb=${sha1:$domain}=, \verb=${time_eval:2d4h}= +\item[Extraktion] \verb=${length_3:$domain}=, \verb=${substr_1_3:$domain}=, \verb=${addresses:$h_from}= +\item[Arithmetik] \verb=${eval:40 + 2}=, \verb=${eval:40 + 2k}=, \verb=${eval:8 << 2}= +\item[Filesystem] \verb=${stat:/etc/hosts}= +\end{description} +\end{scriptsize} \end{frame} \begin{frame}[fragile]{String-Expansion}{Bedingte Expansion} @@ -157,51 +192,102 @@ ${if [{arg}…] {}fail} \end{verbatim} \begin{itemize} -\item Definedness \verb=defined:tls_cipher= +\item Definiert? \verb=def:tls_cipher= \item Vergleiche \verb=eq{foo}{bar}=, \verb+=={1}{1}+ -\item … +\item Matching \verb=match{$local_part}{^h\d+}= +\item Authentication \verb=pam{$user:$pass}= +\item Status \verb=first_delivery= +\item Verknüpfungen \verb=and{{…}{…}{…}}= +\end{itemize} +\end{frame} + +\begin{frame}[fragile]{String-Expansion}{Listen} +An vielen Stellen werden Listen verwendet, Trenner in literalen +Listen ist „:“, es können aber auch Listen aus Textfiles, DBM-Files und +Directories erstellt werden: +\begin{itemize} +\item Literale Liste: \verb=example.com : foo.bar : example.org=, + \verb=<; 2001:db8::10 ; 2001:db8::12= +\item Liste aus Datei: \verb=lsearch;/etc/mailnames=, + \verb=dbm:/etc/mailnames= +\item Liste aus Verzeichnisinhalt: \verb=dsearch;/etc/vmail/domains= \end{itemize} \end{frame} -\begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)} +\begin{frame}[fragile]{String-Expansion}{Single-Key Lookups} +Suche nach einem einzelnen Key, implizit oder explizit +\begin{verbatim} + = ; + ${lookup{}{}[{}[{}{}{}fail} +\end{verbatim} \begin{itemize} -\item Eingehende SMTP-Verbindungen (und in Grenzen auch - nicht-SMTP)-Verbindungen müssen ACL überwinden. -\item Für jede Phase der SMTP-Kommunikation gibt es einen -ACL-Einstiegspunkt, z.B.:\scriptsize\begin{verbatim} - acl_smtp_connect = - acl_smtp_rcpt = - acl_smtp_data = +\item Lineares File: \verb+domains = lsearch;/etc/mail/domains+ +\item Lineares File: \verb=${lookup{$local_part}lsearch{/etc/aliases}}= +\item Lineares File: \verb=${lookup{$local_part}lsearch{/etc/aliases}{${uc:$value}}}= +\end{itemize} + +\begin{exampleblock}{Lookup-Typen} +lsearch, dsearch, dbm, cdbm, iplsearch, net-iplsearch, wildlsearch, … +\end{exampleblock} +\end{frame} + +\begin{frame}[fragile]{String-Expansion}{Query-Style Lookups} +Generische Suche in (SQL)-Datenbank, LDAP, DNS, NIS +\begin{verbatim} + ${lookup {}[{}[{}]]} \end{verbatim} -\item ACL entscheidet: accept, reject, defer, warn (noop) -\item ACL Bedingungen: domains, DNS-BL, Verify (Sender/Empfänger), …, - condition -\item ACL können die interne Behandlung der Nachricht beeinflussen -(queue\_only, submission, …) -\item ACL können Variablen setzen, die später (Router, Transports) -verwendet werden +\begin{itemize} +\item DNS: \verb+${lookup dnsdb{a=foobar.de}}+ +\item LDAP \verb+${lookup ldap{ldap:///o=bar?mailbox?sub?uid=${quote_ldap:$local_part}}}+ +\item PSQL \verb=${lookup pgsql{SELECT mailbox FROM …}}= \end{itemize} +\begin{exampleblock}{Lookup-Typen} + dnsdb, ibase, ldap, mysql, nisplus, oracle, passwd, pgsql, sqlite +\end{exampleblock} \end{frame} -\begin{frame}{Router (allg. Optionen und die einzelnen Router accept, dnslookup, manualroute, …)} -\end{frame} -\begin{frame}{Transports (allg. Optionen und die einzelnen Transports smtp, appendfile, …)} -\end{frame} - -\begin{frame}{Logging (mainlog, rejectlog, paniclog)} -\end{frame} - -\begin{frame}{Test und Betrieb} -\end{frame} - -\begin{frame}{Sicherheitsbetrachtungen (Funktionssicherheit (Verlust von Mails), Einbruchssicherheit, Schreibrechte, Root-Rechte)} -\end{frame} - -\begin{frame}{Möglichkeiten zur Leistungsverbesserung (Warteschlange, Parallelisierung, Blockierung, Ratelimit)} -\end{frame} - -\begin{frame}{Ausblick/Offene Punkte: PRDR, DANE, Enhanced Status Codes} -\end{frame} +%\begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)} +%\begin{itemize} +%\item Eingehende SMTP-Verbindungen (und in Grenzen auch +% nicht-SMTP)-Verbindungen müssen ACL überwinden. +%\item Für jede Phase der SMTP-Kommunikation gibt es einen +%ACL-Einstiegspunkt, z.B.:\scriptsize\begin{verbatim} +% acl_smtp_connect = +% acl_smtp_rcpt = +% acl_smtp_data = +%\end{verbatim} +%\item ACL entscheidet: accept, reject, defer, warn (noop) +%\item ACL Bedingungen: domains, DNS-BL, Verify (Sender/Empfänger), …, +% condition +%\item ACL können die interne Behandlung der Nachricht beeinflussen +% (queue\_only, submission, …) +%\item ACL können Variablen setzen, die später (Router, Transports) +% verwendet werden +%\end{itemize} +%\end{frame} +% +%\begin{frame}{Router (allg. Optionen und die einzelnen Router accept, dnslookup, manualroute, …)} +%Router entscheiden über den Fortgang der Bearbeitung +%\end{frame} +% +%\begin{frame}{Transports (allg. Optionen und die einzelnen Transports smtp, appendfile, …)} +%\end{frame} +% +%\begin{frame}{Logging (mainlog, rejectlog, paniclog)} +%\end{frame} +% +%\begin{frame}{Test und Betrieb} +%\end{frame} +% +%\begin{frame}{Sicherheitsbetrachtungen (Funktionssicherheit (Verlust von Mails), Einbruchssicherheit, Schreibrechte, Root-Rechte)} +%\end{frame} +% +%\begin{frame}{Möglichkeiten zur Leistungsverbesserung (Warteschlange, Parallelisierung, Blockierung, Ratelimit)} +%\end{frame} +% +%\begin{frame}{Ausblick/Offene Punkte: PRDR, DANE, Enhanced Status Codes} +%\end{frame} \end{document} diff -r b2f6ea236243 -r 40a385bb9b7e routing.dia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/routing.dia Mon May 05 22:48:21 2014 +0200 @@ -0,0 +1,1132 @@ + + + + + + + + + + + + + #A4# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #router a# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #router b# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #router c# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #?# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #?# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #?# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Address# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #done# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #done# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #done# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Routing failed# + + + + + + + + + + + + + + + + + + + + + + + +