
diff -r 53887d94881e -r 7f5ab4add2b7 mk2014.tex
--- a/mk2014.tex	Wed May 07 11:54:17 2014 +0200
+++ b/mk2014.tex	Wed May 07 19:11:06 2014 +0200
@@ -15,9 +15,6 @@
 
 \begin{document}
 
-% sicheres logging
-% einmal angenommen - verantwortugn
-
 \begin{frame}
 	\titlepage
 \end{frame}
@@ -28,13 +25,11 @@
 
 \section{Positionierung}
 
-\begin{frame}[<+->][fragile]{Wie positioniert Exim sich gegenüber anderen MTA}
+\begin{frame}[<+->][fragile]{Exim}{Entwicklung}
 \begin{itemize}
-  \item seit 1995 Phil Hazel, seit ca. 2007 ca. 5…8 Aktive
-	\item Lego vs. Playmobil (P. Heinlein)
+	\item \textbf{Ex}perimental \textbf{I}nternet \textbf{M}ailer
+  \item seit 1995 Phil Hazel, seit ca. 2007 ca. 5…8 Aktive Entwickler
 	\item Klassisch Unix: Traditionelle Konfiguration und traditionelles Prozess-Management
-	\item Flexibilität
-	\item Sicherheit (sicher und zuverlässig)
 	\item mehr als 90\% der Nachrichten werden sofort weitergeleitet bzw. ausgeliefert
 \begin{verbatim}
 Time spent on the queue: messages with at least one remote delivery
@@ -47,21 +42,42 @@
         6h        2   0.0%  100.0%
 Over    1d        1   0.0%  100.0%
 \end{verbatim}
-	\item Saubere Dokumentation (spec.txt)
-	\item Dokumentiertes Protokollformat
 \end{itemize}
 \end{frame}
 
+\begin{frame}[<+->][fragile]{Exim}{Position}
+Ja, das ist Religionskrieg :-)
+\pause
+\begin{itemize}
+	\item Lego vs. Playmobil (P. Heinlein)
+	\item Anpassbarkeit 
+		\begin{itemize}
+		\item keine Klassifizierung von Adressen
+		\item keine \verb=mydestinations=
+		\item Router sind Funktionsblöcke
+		\item Intensiver Gebrauch von Expansionsmechanismen zur Laufzeit
+		\end{itemize}
+	\item Stabilität
+	\item Sicherheit
+	\item Definierte Dokumentation (Referenz-Handbuch mit Beispielen)
+	\item Hervorragendes Debugging
+\end{itemize}
+\pause
+Nachteile? Klar - das Abarbeiten der Queue ist nicht sonderlich
+effizient gelöst.
+\end{frame}
+
 \section{Anatomie}
 
-\begin{frame}{Arbeitsweise und Anatomie}{Überblick}
+\begin{frame}[<+->]{Arbeitsweise und Anatomie}{Überblick}
 \begin{itemize}
-\item Binary ist ein ca 1MB großer Universalklumpen
+\item Binary ist ein ca 1\,MB 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)
+\item Ohoh - setuid 0!
 \end{itemize}
 \end{frame}
 
@@ -69,8 +85,9 @@
 \includegraphics[width=0.8\textwidth,angle=270]{procs}
 \end{frame}
 
-\begin{frame}{Arbeitsweise und Anatomie}{IN, OUT, Retry}
-Es gibt im wesentlichen 3 Phasen der Verarbeitung
+\begin{frame}[<+->]{Arbeitsweise und Anatomie}{IN, OUT, Retry}
+Es gibt im wesentlichen 3 Phasen der Verarbeitung.
+\pause
 \begin{enumerate}
 	\item Empfang
 		\begin{itemize}
@@ -91,7 +108,7 @@
 
 \subsection{File}
 
-\begin{frame}[fragile]{Konfiguration}{File}
+\begin{frame}[<+->][fragile]{Konfiguration}{File}
 \begin{itemize}
 	\item Debian geht einen sonder(baren) Weg
 	\item \verb=/dev/null= ist eine gültige Konfiguration
@@ -103,10 +120,11 @@
 
 \subsection{Struktur}
 
-\begin{frame}[fragile]{Konfiguration}{Struktur}
+\begin{frame}[<+->][fragile]{Konfiguration}{Struktur}
 Strukturiertes Konfigurationsfile mit mehreren Abschnitten, teilweise
 miteinander verlinkt (Router referenziert Tranports, globaler Teil
 referenziert ACL)
+\pause
 \begin{description}
 	\item[global] Etwa 240 allgemeine Direktiven
 	\item[acl] Access Control Lists für SMTP
@@ -119,7 +137,6 @@
 \end{description}
 \end{frame}
 
-
 \subsection{Syntax}
 
 \begin{frame}[fragile]{Konfiguration}{Syntax}
@@ -130,6 +147,7 @@
 	BASE = dc=example,dc=com
 \end{verbatim}
 \end{exampleblock}
+\pause
 
 \begin{exampleblock}{Bedingte Konfiguration}
 \begin{verbatim}
@@ -140,6 +158,7 @@
 	.endif
 \end{verbatim}
 \end{exampleblock}
+\pause
 
 \begin{exampleblock}{Versteckte Optionen}
 Wegen \verb=exim -bP …=:
@@ -197,18 +216,22 @@
 	Etwa die Hälfte der Konfigurationsdirektiven erlaubt
 	Variablensubstitution (Expansion) zur Laufzeit.
 	Testen kann man diese sehr einfach:
-\begin{verbatim}
-	$ exim -be '$primary_hostname'
+\begin{alltt}
+	$ 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'
+	\pause
+	$ 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}}}}'
+	\pause
+	$ exim -be '$\{lookup passwd\{nobody\}\{$\{extract\{5\}\{:\}\{$value\}\}\}\}'
 	/nonexistent
-	$ exim -be '${lookup{root}lsearch{/etc/aliases}}'
+	\pause
+	$ exim -be '$\{lookup\{root\}lsearch\{/etc/aliases\}\}'
 	heiko
-	$ exim -be '${lookup dnsdb{mx=heise.de}}'
+	\pause
+	$ exim -be '$\{lookup dnsdb\{mx=heise.de\}\}'
 	10 relay.heise.de
-\end{verbatim}
+\end{alltt}
 \end{frame}
 
 \begin{frame}[fragile]{Expansion}{Übersicht}
@@ -327,6 +350,28 @@
 \end{exampleblock}
 \end{frame}
 
+\begin{frame}[fragile]{String-Expansion}{Wenn nichts mehr geht}
+Als letzter Hilfe gibt es die Möglichkeit, Sockets auszulesen, externe
+Kommandos aufzurufen oder Perl-Funktionen zu nutzen.
+\begin{exampleblock}{Sockets}
+\begin{verbatim}
+	condition = ${readsocket{<socket>}{<request>}}
+\end{verbatim}
+\end{exampleblock}
+\begin{exampleblock}{Kommandos}
+\begin{verbatim}
+	domains = ${run{<command>[<arg>]…}}
+\end{verbatim}
+\end{exampleblock}
+\begin{exampleblock}{Perl}
+\begin{verbatim}
+	perl_startup = do '/etc/exim/foo.pl'
+	…
+	domains = ${perl{<sub>}[{<arg>}…]}
+\end{verbatim}
+\end{exampleblock}
+\end{frame}
+
 
 %\begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)}
 %\begin{itemize}
@@ -350,9 +395,11 @@
 %
 
 \section{Routing}
+\subsection{Ablauf}
 
 \begin{frame}[fragile]{Routing}{Allgemein}
 \begin{itemize}
+\item Adresse wird an eine Kette von Routern übergeben (Reihenfolge!)
 \item Router entscheiden über den Fortgang der Bearbeitung
 \item Vorbedingungen entscheiden, ob der Router „befragt“ wird
 \item Router liefern für eine gegebene Adresse
@@ -365,11 +412,31 @@
 		\item[error] Panik
 	\end{description}
 \item werden auch von ACL genutzt (Adressüberpüfung)
+\item Router: dnslookup, manualroute, queryprogram, redirect, accept
 \item einfache Tests sind möglich mit \verb=exim -bt= (Adresstest -
 	Routing) bzw. \verb=exim -bv= (Adressüberprüfung - ACL)
 \end{itemize}
 \end{frame}
 
+\subsection{Konfiguration}
+
+\begin{frame}[fragile]{Routing}{Konfiguration}
+Für jeden Router-Block
+\begin{itemize}
+\item Treiber
+\item Vorbedingungen (\verb=check_local_user=, \verb=domains=, \verb=condition=, …)
+\item Generische Optionen (\verb=caseful_local_part=, \verb=local_part_prefix=, …)
+\end{itemize}
+%\scriptsize
+\verbatiminput{routers.conf}
+\end{frame}
+
+\begin{frame}{Routing}{Schema}
+\includegraphics[width=0.8\textwidth,angle=270]{routing}
+\end{frame}
+
+\subsection{Test}
+
 \begin{frame}[fragile]{Routing}{Test}
 \begin{verbatim}
 	$ exim -bt hans@example.com
@@ -391,14 +458,6 @@
 \end{verbatim}
 \end{frame}
 
-\begin{frame}[fragile]{Routing}{Konfiguration}
-\verbatiminput{routers.conf}
-\end{frame}
-
-\begin{frame}{Routing}{Schema}
-\includegraphics[width=0.8\textwidth,angle=270]{routing}
-\end{frame}
-
 \begin{frame}[fragile]{Routing}{Remote}
 \scriptsize
 \begin{alltt}
@@ -420,19 +479,175 @@
 \end{alltt}
 \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}
-%
+\section{Transport}
+
+\begin{frame}[fragile]{Transports}
+Die Router referenzieren ggf. einen „transport“.
+\begin{itemize}
+\item Reihenfolge egal
+\item Generische Optionen: \verb=headers_remove=,
+\verb=envelope_to_add=, \verb=transport_filter=, \verb=user=
+\item Treiber hat weitere Optionen
+\item Transports: appendfile, autoreply, lmtp, pipe, smtp
+\item Default TLS, wenn STARTTLS geboten wird
+\end{itemize}
+\begin{alltt}
+\input{transports.conf}
+\end{alltt}
+\end{frame}
+
+\section{Access Control Lists}
+\subsection{Konfiguration}
+
+\begin{frame}[<+->][fragile]{Acess Control Lists}
+Für jede Phase der SMTP-Kommunikation gibt es einen ACL-Einstiegspunkt. 
+Abarbeitung der Regeln bis zur Entscheidung.
+\pause
+\begin{description}
+\item[accept] alles gut, keine weiteren Regeln
+\item[deny] permanenter Fehler und passender Text dazu
+\item[require] permanenter Fehler oder nächste Regel
+\item[warn] Protokollierung und nächste Regel
+\item[defer] temporärer Fehler
+\end{description}
+\pause
+Verweis auf Blöcke im ACL-Abschnitt der Konfiguration
+\begin{verbatim}
+	acl_smtp_connect = acl_check_connect
+	acl_smtp_rcpt = acl_check_rcpt
+	acl_smtp_data = acl_check_data
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]{Access Control Lists}{Konfiguration}
+\tiny
+\verbatiminput{acl.conf}
+\end{frame}
+
+\subsection{Features}
+
+\begin{frame}[<+->][fragile]{Access Control Lists}{Features}
+\begin{itemize}
+	\item Zugriff auf alles, was an Information verfügbar ist
+	\item Ratelimit mit beliebigen Keys
+	\item Überprüfung von Adressen \verb+verify = recipient+
+	\item Callout zur Überprüfung \verb+verify = recipient/callout=use_sender,defer_ok+
+	\item DNS-Blacklists \verb+dnslists = sbl.spamhaus.org+
+	\item Verschlüsselte Verbindung \verb+encrypted = *+
+	\item Content-Scan \verb+malware = *+, \verb+spam = …+
+	\item Header-Syntax \verb+verify = header_syntax+
+	\item Reverse-DNS \verb+verify = reverse_host_lookup+
+	\item ACL-Variablen für spätere Verarbeitung \verb+set acl_m_foo = bar+
+	\item Sub-ACL \verb+acl = foo_acl+
+	\item Generische Bedingung \verb+condition =+
+\end{itemize}
+\end{frame}
+
+\section{Logging}
+
+\begin{frame}[fragile]{Logging}
+Sicherheit heißt auch Logging. Auskunft über das Verarbeiten der
+Nachricht. Gesteuert wird u.a. über \verb=log_selector=, \verb=log_write=,
+\verb=debug_print=.
+\begin{description}
+\item[mainlog] alle relevanten Transaktionen, dokumentiertes,
+	maschinenlesbares Format
+\item[rejectlog] Details zu abgewiesenen Nachrichten
+\item[paniclog] Konfigurationsfehler, schwere Probleme
+\item[messagelog] Transaktionen zu einer spezifischen Nachricht
+\item[syslog] Fallback, wenn nicht mal mehr paniclog geht
+\end{description}
+\scriptsize
+\begin{alltt}
+\input{msglog.tt}
+\end{alltt}
+\end{frame}
+
+\begin{frame}[fragile]{Logging}{mainlog}
+\scriptsize
+\verbatiminput{mainlog.tt}
+\end{frame}
+
+\begin{frame}[fragile]{Logging}{rejectlog}
+\scriptsize
+\verbatiminput{rejectlog.tt}
+\end{frame}
+
+\section{Test und Betrieb}
+\subsection{Konfiguration}
+
+\begin{frame}[fragile]{Test und Betrieb}{Konfiguration}
+Viele Möglichkeiten, die bestehende Konfiguration zu überprüfen:
+\begin{alltt}
+	$ exim -bV -C test.conf
+	Configuration file is test.conf
+	$ exim -bP primary\_hostname
+	mail.example.com
+	$ exim -bP routers
+	… (ca 200 Zeilen)
+\end{alltt}
+\end{frame}
+
+\begin{frame}[fragile]{Test und Betrieb}{Routing, Expansion}
+\begin{verbatim}
+	$ exim -d-all+route -bt hans@example.com
+	…
+	$ exim -d-all+expand -be '$lookup{root}lsearch{/etc/aliases}}'
+	search_open: lsearch "/etc/aliases"
+	search_find: file="/etc/aliases"
+		key="root" partial=-1 affix=NULL starflags=0
+	LRU list:
+		:/etc/aliases
+		End
+	internal_search_find: file="/etc/aliases"
+		type=lsearch key="root"
+	file lookup required for root
+		in /etc/aliases
+	lookup yielded: heiko
+	heiko
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]{Test und Betrieb}{ACL}
+Fake-SMTP-Session mit \verb=exim -bh 1.1.1.1=, aber einfacher noch mit swaks.
+\scriptsize
+\begin{verbatim}
+	$ swaks --pipe 'exim -bh 1.1.1.1' --from … --to …
+	=== Trying pipe to exim -bh 1.1.1.1…
+	=== Connected to exim -bh 1.1.1.1.
+	>>> looking up host name for 1.1.1.1
+	…
+	<-  **** SMTP testing session as if from host 1.1.1.1
+	<-  **** This is not for real!
+	…
+	>>> processing "deny"
+	>>> deny: condition test succeeded in ACL "acl_check_rcpt"
+	LOG: [1967] H=(jumper.schlittermann.de) [1.1.1.1]
+	F=<hs@schlittermann.de> rejected RCPT <hans@example.com>: relay not
+	permitted
+	<** 550 relay not permitted
+	 -> QUIT
+	 <-  221 jumper.schlittermann.de closing connection
+\end{verbatim}
+\end{frame}
+
+\section{Ausblick}
+
+\begin{frame}[<+->]{Was fehlt}
+Noch einige Dinge vergessen?
+\begin{itemize}
+	\item TLS
+	\item Header-Rewriting
+	\item Retry-Rules
+	\item SMTP-Authentication
+	\item Cut-Through-Routing, PRDR, DANE, Enhanced Status Codes
+\end{itemize}
+\end{frame}
+
+\begin{frame}{DANKE}
+DANKE
+\end{frame}
+
 %\begin{frame}{Möglichkeiten zur Leistungsverbesserung (Warteschlange, Parallelisierung, Blockierung, Ratelimit)}
 %\end{frame}
 %




