
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=$<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}




