mk2014.tex
changeset 11 3d9bb718ac1c
parent 7 7f5ab4add2b7
child 12 e3ac4157aae4
--- a/mk2014.tex	Thu May 08 15:44:04 2014 +0200
+++ b/mk2014.tex	Fri May 09 10:38:05 2014 +0200
@@ -12,6 +12,12 @@
 \author[H. Schlittermann]{Heiko Schlittermann}
 \institute{schlittermann - internet \& unix support, Dresden}
 
+\newcommand{\B}{$\hookleftarrow$}
+\newcommand{\ttinput}[1]{%
+	\begin{alltt}%
+	\input{#1}%
+	\end{alltt}}
+
 
 \begin{document}
 
@@ -23,376 +29,14 @@
 	\tableofcontents
 \end{frame}
 
-\section{Positionierung}
-
-\begin{frame}[<+->][fragile]{Exim}{Entwicklung}
-\begin{itemize}
-	\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 mehr als 90\% der Nachrichten werden sofort weitergeleitet bzw. ausgeliefert
-\begin{verbatim}
-Time spent on the queue: messages with at least one remote delivery
--------------------------------------------------------------------
-Under   1m    15052  99.2%   99.2%
-        5m       20   0.1%   99.3%
-       15m        2   0.0%   99.3%
-       30m       91   0.6%   99.9%
-        1h        9   0.1%  100.0%
-        6h        2   0.0%  100.0%
-Over    1d        1   0.0%  100.0%
-\end{verbatim}
-\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{itemize}
-\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}
-
-\begin{frame}{Arbeitsweise und Anatomie}{Prozesse}
-\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.
-\pause
-\begin{enumerate}
-	\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}
-
-\section{Konfiguration}
-
-\subsection{File}
-
-\begin{frame}[<+->][fragile]{Konfiguration}{File}
-\begin{itemize}
-	\item Debian geht einen sonder(baren) Weg
-	\item \verb=/dev/null= ist eine gültige Konfiguration
-	\item \verb=exim -bV= listet die verwendete Konfigurationsdatei und
-			  einkompilierte Features
-	\item Beispiel-Konfig \verb=example.conf.gz= als Ausgangspunkt
-\end{itemize}
-\end{frame}
-
-\subsection{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
-	\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}
-
-\subsection{Syntax}
-
-\begin{frame}[fragile]{Konfiguration}{Syntax}
-\begin{exampleblock}{Macros}
-\begin{verbatim}
-	CF = /etc/exim4/
-	USER_BASE = ou=users,BASE
-	BASE = dc=example,dc=com
-\end{verbatim}
-\end{exampleblock}
-\pause
-
-\begin{exampleblock}{Bedingte Konfiguration}
-\begin{verbatim}
-	.ifdef SMALL_MEM
-	message_size_limit = 50M
-	.else
-	message_size_limit = 500M
-	.endif
-\end{verbatim}
-\end{exampleblock}
-\pause
-
-\begin{exampleblock}{Versteckte Optionen}
-Wegen \verb=exim -bP …=:
-\begin{verbatim}
-	hide mysql_servers = localhost/mail/exim/secret
-\end{verbatim}
-\end{exampleblock}
-\end{frame}
-
-\begin{frame}[fragile]{Konfiguration}{Options-Typen}
-Es existieren ca. 580 Direktiven (Optionen). Exim kennt mehrere Datentypen.
-\begin{exampleblock}{Bool}
-\begin{verbatim}
-	more = yes
-	more = no
-	more
-	no_more
-\end{verbatim}
-\end{exampleblock}
-
-\begin{exampleblock}{Numerisch: Integer, Fixed-Point, Zeitintervalle}
-\begin{verbatim}
-	message_size_limit = 100k
-	queue_only_load = 1.5
-	retry_data_expire = 4d2h
-\end{verbatim}
-\end{exampleblock}
-\begin{exampleblock}{Zeichenketten}
-\begin{verbatim}
-	primary_hostname = mail.example.com
-\end{verbatim}
-\end{exampleblock}
-\end{frame}
-
-\begin{frame}[fragile]{Konfiguration}{Options-Typen 2}
-\begin{exampleblock}{Listen}
-\begin{verbatim}
-	local_parts = hans : fred : detlef
-	interfaces = <;  192.168.123.123 ; 2001:db8::42
-\end{verbatim}
-\end{exampleblock}
-
-\begin{exampleblock}{Frei definierte Listen}
-\begin{verbatim}
-	domainlist local_domains = example.com : example.org
-	hostlist relay_from_hosts = 127.0.0.1 : fred.example.com
-\end{verbatim}
-\end{exampleblock}
+\section{Exim - Entwicklung und Positionierung}
+\input{frames/exim.tex}
 
-\end{frame}
-
-\subsection{Variablen-Expansion}
-
-\begin{frame}[fragile]{Konfiguration}{Expansion}
-	Etwa die Hälfte der Konfigurationsdirektiven erlaubt
-	Variablensubstitution (Expansion) zur Laufzeit.
-	Testen kann man diese sehr einfach:
-\begin{alltt}
-	$ exim -be '$primary\_hostname'
-	jumper.schlittermann.de
-	\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
-	\pause
-	$ exim -be '$\{lookup passwd\{nobody\}\{$\{extract\{5\}\{:\}\{$value\}\}\}\}'
-	/nonexistent
-	\pause
-	$ exim -be '$\{lookup\{root\}lsearch\{/etc/aliases\}\}'
-	heiko
-	\pause
-	$ exim -be '$\{lookup dnsdb\{mx=heise.de\}\}'
-	10 relay.heise.de
-\end{alltt}
-\end{frame}
-
-\begin{frame}[fragile]{Expansion}{Übersicht}
-Expansion als „working horse“ der Flexibilität
-\begin{description}
-\item[Variablen] \verb=$local_part=, \verb=${local_part}=
-\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{frame}
-
-\begin{frame}[fragile]{Expansion}{Variablen}
-Es gibt knapp 200 Variablen, die Information über Zustände, Limits, …
-enthalten:
-\begin{verbatim}
-	… = $<var>
-	… = ${<var>}
-\end{verbatim}
-\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[Delivery] \verb=$host_address=, \verb=$home=,
-	\verb=$qualify_recipient=
-\item[Operation] \verb=$load_average=, \verb=$log_space=, \verb=$pid=
-	\verb=$received_interface_address=, \verb=$tls_out_peerdn=,
-	\verb=$message_age=
-\end{description}
-\end{frame}
-
-\begin{frame}[fragile]{Expansion}{String-Operationen}
-Einfache Operationen auf Zeichenketten sind möglich:
-\begin{verbatim}
-	… = ${<op>:<string>}
-\end{verbatim}
-\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{frame}
-
-\begin{frame}[fragile]{Expansion}{Bedingte Expansion}
-Expansion kann von Bedingungen abhängig gemacht werden.
-\begin{verbatim}
-	${if <op>:<arg>}
-	${if <op>[{arg}…] {<value1>}[{<value2>}]}
-	${if <op>[{arg}…] {<value1>}fail}
-\end{verbatim}
-\begin{description}
-\item[Negation] \verb=! <op>=
-\item[Verknüpfungen] \verb=and{{…}{…}{…}}=
-\item[Definiert] \verb=def:tls_cipher=
-\item[Vergleiche] \verb=eq{foo}{bar}=, \verb+=={1}{2}+
-\item[Matching] \verb=match{$local_part}{^h\d+}=
-\item[Authentication] \verb=pam{$user:$pass}=
-\item[Status] \verb=first_delivery=
-\end{description}
-\end{frame}
+\section{Arbeitsweise und Anatomie}
+\input{frames/anatomie.tex}
 
-\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{description}
-\item[Literale] \verb=example.com : foo.bar : example.org=,
-	\verb=<; 2001:db8::10 ; 2001:db8::12=
-\item[Datei] \verb=lsearch;/etc/mailnames=,
-	\verb=dbm;/etc/mailnames=
-\item[Verzeichnis] \verb=dsearch;/etc/vmail/domains=
-\end{description}
-\end{frame}
-
-\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{description}
-\item[implizit] \verb+domains = lsearch;/etc/mail/domains+
-\item[Lookup] \verb|${lookup{$local_part}lsearch{/etc/aliases}}|
-\item[Lookup] \begin{verbatim}
-	${lookup{$local_part}lsearch{/etc/aliases}\
-		{$value}\
-		{${lookup{…}}}}
-\end{verbatim}
-\end{description}
-\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}
-\begin{description}
-\item[DNS]  \verb+${lookup dnsdb{a=foobar.de}}+
-\item[LDAP] \begin{verbatim}${lookup ldap{ldap:///o=bar?mailbox
-	?sub?uid=${quote_ldap:$local_part}}}
-\end{verbatim}
-\item[PSQL] \verb=${lookup pgsql{SELECT mailbox FROM …}}=
-\end{description}
-\begin{exampleblock}{Lookup-Typen}
-	dnsdb, ibase, ldap, mysql, nisplus, oracle, passwd, pgsql, sqlite
-\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}
-%\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.:\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}
-%
+% --
+\input{frames/konfiguration.tex}
 
 \section{Routing}
 \subsection{Ablauf}