--- 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=$<var>= oder
\verb=${<var>}=.
-\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
-% <var> ${<op>:<var>} ${<func>[{arg}…]} ${if <cond>[{arg}…] }
-% operators
-%
-
\begin{frame}[fragile]{String-Expansion}{String-Operationen}
Einfache Manipulation von Zeichenketten sind möglich:
\verb=${<op>:<string>}=
-\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 <op>[{arg}…] {<value1>}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}
+ <item> = <type>;<arg>
+ ${lookup{<key>}<type>{<arg>}[{<found>}[{<not found}]]}
+ ${lookup{<key>}<type>{<arg>}{<found>}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 = <name of connect acl>
- acl_smtp_rcpt = <name of recipient acl>
- acl_smtp_data = <name of recipient acl>
+\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 <type>{<arg(s)>}[{<found>}[{<not found>}]]}
\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 = <name of connect acl>
+% acl_smtp_rcpt = <name of recipient acl>
+% acl_smtp_data = <name of recipient acl>
+%\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}