mk2014.tex
changeset 3 40a385bb9b7e
parent 2 b2f6ea236243
child 4 ce986267138d
equal deleted inserted replaced
2:b2f6ea236243 3:40a385bb9b7e
    10 \author[H. Schlittermann]{Heiko Schlittermann}
    10 \author[H. Schlittermann]{Heiko Schlittermann}
    11 \institute{schlittermann - internet \& unix support, Dresden}
    11 \institute{schlittermann - internet \& unix support, Dresden}
    12 
    12 
    13 \begin{document}
    13 \begin{document}
    14 
    14 
       
    15 % sicheres logging
       
    16 % einmal angenommen - verantwortugn
       
    17 
    15 \begin{frame}
    18 \begin{frame}
    16 	\titlepage
    19 	\titlepage
       
    20 \end{frame}
       
    21 
       
    22 \begin{frame}{Inhalt}
       
    23 	\tableofcontents
    17 \end{frame}
    24 \end{frame}
    18 
    25 
    19 
    26 
    20 \begin{frame}[<+->][fragile]{Wie positioniert Exim sich gegenüber anderen MTA}
    27 \begin{frame}[<+->][fragile]{Wie positioniert Exim sich gegenüber anderen MTA}
    21 \begin{itemize}
    28 \begin{itemize}
    36         1h        9   0.1%  100.0%
    43         1h        9   0.1%  100.0%
    37         6h        2   0.0%  100.0%
    44         6h        2   0.0%  100.0%
    38 Over    1d        1   0.0%  100.0%
    45 Over    1d        1   0.0%  100.0%
    39 \end{verbatim}
    46 \end{verbatim}
    40 	}
    47 	}
       
    48 	\item Saubere Dokumentation (spec.txt)
       
    49 	\item Dokumentiertes Protokollformat
    41 \end{itemize}
    50 \end{itemize}
    42 \end{frame}
    51 \end{frame}
    43 
    52 
    44 \begin{frame}{Arbeitsweise und Anatomie}{Überblick}
    53 \begin{frame}{Arbeitsweise und Anatomie}{Überblick}
    45 \begin{itemize}
    54 \begin{itemize}
    46 \item Binary: (ca 1MB) großer Universalklumpen
    55 \item Binary ist ein ca 1MB großer Universalklumpen
    47 \item Queue: Verzeichnis, 2 Files je Message
    56 \item Einfache Struktur der operativen Daten - Verzeichnis, 2 Files je
    48 \item IPC: nichts, außer fork(2) oder exec(3)
    57 Message, Spool/Message-Log in 16 Verzeichnissen
    49 \item Shared: „Hint“-Files (z.B. retry info)
    58 \item Dokument
       
    59 \item Keine aufwändigen IPC - nichts, außer fork(2) oder exec(3)
       
    60 \item Wenig gemeinsam genutzte Daten - nur „Hint“-Files (z.B. retry info)
    50 \end{itemize}
    61 \end{itemize}
    51 \end{frame}
    62 \end{frame}
    52 
    63 
    53 \begin{frame}{Arbeitsweise und Anatomie}{Prozesse}
    64 \begin{frame}{Arbeitsweise und Anatomie}{Prozesse}
    54 \includegraphics[width=0.8\textwidth,angle=270]{procs}
    65 \includegraphics[width=0.8\textwidth,angle=270]{procs}
    55 %\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-1}}
    66 \end{frame}
    56 %\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-2}}
    67 
    57 %\llap{\includegraphics[width=0.8\textwidth,angle=270]{procs-3}}
    68 \begin{frame}{Routing}
    58 %\multiinclude[<+->][format=pdf,graphics={width=0.8\textwidth,angle=270}]{procs}
    69 \includegraphics[width=0.8\textwidth,angle=270]{routing}
    59 \end{frame}
    70 \end{frame}
    60 
    71 
    61 \begin{frame}{Arbeitsweise und Anatomie}{IN, OUT, Retry}
    72 \begin{frame}{Arbeitsweise und Anatomie}{IN, OUT, Retry}
       
    73 Es gibt im wesentlichen 3 Phasen der Verarbeitung
    62 \begin{enumerate}
    74 \begin{enumerate}
    63 	\item IN: ACL (Ratelimit, Blacklists, Routing-Test, Content-Scan) Enqueue
    75 	\item Empfang
    64 	\item OUT: Dequeue, Routing, Transport
    76 		\begin{itemize}
    65 	\item Retry: Queuerunner, Dequeue, Routing, Transport
    77 		\item ACL mit Ratelimit, Blacklists, Routing-Test, Content-Scan
       
    78 		\item Ablage im Spool-Verzeichnis
       
    79 	\end{itemize}
       
    80 	\item Start des Sendeprozesses
       
    81 		\begin{itemize}
       
    82 			\item Spoolfile-Lock
       
    83 			\item Routing
       
    84 			\item Transport oder ggf. Abbruch
       
    85 		\end{itemize}
       
    86 	\item Queuerunner startet ggf. weitere Versuche
    66 \end{enumerate}
    87 \end{enumerate}
    67 \end{frame}
    88 \end{frame}
    68 
    89 
    69 \begin{frame}[fragile]{Konfiguration}{Struktur}
    90 \begin{frame}[fragile]{Konfiguration}{Struktur}
    70 \begin{itemize}
    91 Strukturiertes Konfigurationsfile mit mehreren Abschnitten, teilweise
    71 	\item Globaler Teil (ca. 240 Direktiven)
    92 miteinander verlinkt (Router referenziert Tranports, globaler Teil
    72 	\item Access-Control-Lists für SMTP: \verb=begin acl=
    93 referenziert ACL)
    73 	\item Routing-Regeln (ACL und Routing): \verb=begin routers=
    94 \begin{description}
    74 	\item Transport-Definitionen: \verb=begin transports=
    95 	\item[global] Etwa 240 allgemeine Direktiven
    75 	\item Retry-Vorgaben: \verb=begin retry=
    96 	\item[acl] Access Control Lists für SMTP
    76 	\item Envelope/Header-Rewriting: \verb=begin rewrite=
    97 	\item[routers] Routing-Regeln (genutzt auch von ACL)
    77 	\item SMTP-Authentifizierung: \verb=begin authenticators=
    98 	\item[transports] Wie wird SMTP gemacht, oder das Anhängen an Mailboxen
    78 \end{itemize}
    99 	\item[retry] Unter welchen Bedingungen wird wann und wie oft und wie
       
   100 	lange wiederholt
       
   101 	\item[rewrite] Umschreiben von Headern und Envelope
       
   102 	\item[authenticators] SMTP-Authentifizierung
       
   103 \end{description}
    79 \end{frame}
   104 \end{frame}
    80 
   105 
    81 \begin{frame}[fragile]{Konfiguration}{Syntax}
   106 \begin{frame}[fragile]{Konfiguration}{Syntax}
    82 \begin{exampleblock}{Macros}\scriptsize\begin{verbatim}
   107 \begin{exampleblock}{Macros}\scriptsize\begin{verbatim}
    83 	CF = /etc/exim4/
   108 	CF = /etc/exim4/
    95 	smtp_active_hostname = ${lookup{$received_ip_address}lsearch{CF/hostnames}}
   120 	smtp_active_hostname = ${lookup{$received_ip_address}lsearch{CF/hostnames}}
    96 \end{verbatim}\end{exampleblock}
   121 \end{verbatim}\end{exampleblock}
    97 
   122 
    98 \end{frame}
   123 \end{frame}
    99 
   124 
   100 \begin{frame}[fragile]{String-Expansionen / Listen / File- und Datenbank-Lookups}
   125 \begin{frame}[fragile]{Konfiguration}{Expansion}
   101 Etwa die Hälfte der Konfigurationsdirektiven erlaubt
   126 Etwa die Hälfte der Konfigurationsdirektiven erlaubt
   102 Variablensubstitution (Expansion)zur Laufzeit.
   127 Variablensubstitution (Expansion) zur Laufzeit.
   103 Testen kann man diese sehr einfach mit \verb=exim -be '…'=
   128 Testen kann man diese sehr einfach:
   104 \scriptsize
   129 \begin{scriptsize}\begin{verbatim}
   105 \begin{verbatim}
   130 	$ exim -be '$primary_hostname'
   106 	exim -be '$primary_hostname'
   131 	jumper.schlittermann.de
   107 	exim -oMi 1.1.1.1 -oMa 2.2.2.2 -be '$sender_host_address -> $received_ip_address'
   132 	$ exim -be -oMi 1.1.1.1 -oMa 2.2.2.2 '$sender_host_address $received_ip_address'
   108 	exim -be '${lookup{root}lsearch{/etc/aliases}}'
   133 	2.2.2.2 1.1.1.1
   109 	exim -be '${lookup dnsdb{mx=heise.de}}'
   134 	$ exim -be '${lookup passwd{nobody}{${extract{5}{:}{$value}}}}'
   110 \end{verbatim}
   135 	/nonexistent
   111 
   136 	$ exim -be '${lookup{root}lsearch{/etc/aliases}}'
       
   137 	heiko
       
   138 	$ exim -be '${lookup dnsdb{mx=heise.de}}'
       
   139 	10 relay.heise.de
       
   140 \end{verbatim}\end{scriptsize}
       
   141 \end{frame}
       
   142 
       
   143 \begin{frame}[fragile]{Expansion}{Übersicht}
       
   144 Expansion als „working horse“ der Flexibilität
       
   145 \begin{scriptsize}
   112 \begin{description}
   146 \begin{description}
   113 \item[Variablen] \verb=$local_part=, \verb=${local_part}=
   147 \item[Variablen] \verb=$local_part=, \verb=${local_part}=
   114 \item[String-Ops] \verb=${sha1:$local_part}=, \verb=${uc:$domain}=
   148 \item[Operatoren] \verb=${sha1:$local_part}=, \verb=${uc:$domain}=
   115 \item[String-Manipulation] \verb=${sg{$local_part}{.laus}{***}}=
   149 \item[Manipulation] \verb=${sg{$local_part}{.laus}{XXX}}=
   116 \item[Conditional] \verb=${if eq{$local_part}{xxx} {~xxx/.mbox}{/var/mail/$local_part}}=
   150 \item[Bedingungen] \verb=${if eq{$local_part}{x}{~x/.mbox}{/var/mail/$local_part}}=
   117 \item[Lookup single key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}=
   151 \item[Lookup/Key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}=
   118 \item[Lookup query style] \verb+${lookup dnsdb{mx=heise.de}}+
   152 \item[Lookup/Query] \verb+${lookup dnsdb{mx=heise.de}}+
   119 \end{description}
   153 \end{description}
   120 \end{frame}
   154 \end{scriptsize}
   121 
   155 \end{frame}
   122 \begin{frame}[fragile]{String-Expansion}{Variablen}
   156 
       
   157 \begin{frame}[fragile]{Expansion}{Variablen}
   123 Es gibt knapp 200 Variablen, Referenzierung als \verb=$<var>= oder
   158 Es gibt knapp 200 Variablen, Referenzierung als \verb=$<var>= oder
   124 \verb=${<var>}=.
   159 \verb=${<var>}=.
   125 \begin{itemize}
   160 \begin{scriptsize}
   126 \item Empfänger: \verb=$local_part=, \verb=$domain=, \verb=$local_part_prefix=
   161 \begin{description}
   127 \item Sender: \verb=$sender_local_part=
   162 \item[Envelope] \verb=$local_part=, \verb=$domain=, \verb=$local_part_prefix=,
   128 \item Message: \verb=$message_line_count=, \verb=$message_size=, \verb=$message_headers=
   163 	\verb=$sender_local_part=, \verb=$recipients=
   129 \item Content: \verb=$spam_score_int=, \verb=$malware_name=
   164 \item[Message] \verb=$message_line_count=, \verb=$message_size=,
   130 \item Routing: \verb=$original_domain=
   165 \verb=$message_headers=, \verb=$h_subject:=
   131 \item System: \verb=$load_average=, \verb=$log\_space=, \verb=$pid=
   166 \item[Content] \verb=$spam_score_int=, \verb=$malware_name=
   132 \item Operation: \verb=$received_interface_address=, \verb=$tls_out_peerdn=, \verb=$tls_out_bits=
   167 \item[Routing] \verb=$original_domain=
   133 \end{itemize}
   168 \item[System] \verb=$load_average=, \verb=$log_space=, \verb=$pid=
   134 \end{frame}
   169 \item[Operation] \verb=$received_interface_address=, \verb=$tls_out_peerdn=, \verb=$tls_out_bits=
   135 
   170 \end{description}
   136 % items
   171 \end{scriptsize}
   137 % <var> ${<op>:<var>} ${<func>[{arg}…]} ${if <cond>[{arg}…] }
   172 \end{frame}
   138 % operators
       
   139 % 
       
   140 
   173 
   141 \begin{frame}[fragile]{String-Expansion}{String-Operationen}
   174 \begin{frame}[fragile]{String-Expansion}{String-Operationen}
   142 Einfache Manipulation von Zeichenketten sind möglich:
   175 Einfache Manipulation von Zeichenketten sind möglich:
   143 \verb=${<op>:<string>}=
   176 \verb=${<op>:<string>}=
   144 \begin{itemize}
   177 \begin{scriptsize}
   145 \item Konvertierung \verb=${uc:$local_part}=, \verb=${sha1:$domain}=, \verb=${time_eval:2d4h}=
   178 \begin{description}
   146 \item Extraktion \verb=${length_3:$domain}=, \verb=${substr_1_3:$domain}=, \verb=${addresses:$h_from}=
   179 \item[Konvertierung] \verb=${uc:$local_part}=, \verb=${sha1:$domain}=, \verb=${time_eval:2d4h}=
   147 \item Arithmetik \verb=${eval:40 + 2}=, \verb=${40 + 2k}=, \verb=${eval:8 << 2}=
   180 \item[Extraktion] \verb=${length_3:$domain}=, \verb=${substr_1_3:$domain}=, \verb=${addresses:$h_from}=
   148 \item Filesystem \verb=${stat:/etc/hosts}=
   181 \item[Arithmetik] \verb=${eval:40 + 2}=, \verb=${eval:40 + 2k}=, \verb=${eval:8 << 2}=
   149 \end{itemize}
   182 \item[Filesystem] \verb=${stat:/etc/hosts}=
       
   183 \end{description}
       
   184 \end{scriptsize}
   150 \end{frame}
   185 \end{frame}
   151 
   186 
   152 \begin{frame}[fragile]{String-Expansion}{Bedingte Expansion}
   187 \begin{frame}[fragile]{String-Expansion}{Bedingte Expansion}
   153 Expansion kann von Bedingungen abhängig gemacht werden:
   188 Expansion kann von Bedingungen abhängig gemacht werden:
   154 \begin{verbatim}
   189 \begin{verbatim}
   155 	${if <op>[{arg}…]}
   190 	${if <op>[{arg}…]}
   156 	${if <op>[{arg}…] {<value1>}[{<value2>}]}
   191 	${if <op>[{arg}…] {<value1>}[{<value2>}]}
   157 	${if <op>[{arg}…] {<value1>}fail}
   192 	${if <op>[{arg}…] {<value1>}fail}
   158 \end{verbatim}
   193 \end{verbatim}
   159 \begin{itemize}
   194 \begin{itemize}
   160 \item Definedness \verb=defined:tls_cipher=
   195 \item Definiert? \verb=def:tls_cipher=
   161 \item Vergleiche \verb=eq{foo}{bar}=, \verb+=={1}{1}+
   196 \item Vergleiche \verb=eq{foo}{bar}=, \verb+=={1}{1}+
   162 \item …
   197 \item Matching \verb=match{$local_part}{^h\d+}=
   163 \end{itemize}
   198 \item Authentication \verb=pam{$user:$pass}=
   164 \end{frame}
   199 \item Status \verb=first_delivery=
   165 
   200 \item Verknüpfungen \verb=and{{…}{…}{…}}=
   166 \begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)}
   201 \end{itemize}
   167 \begin{itemize}
   202 \end{frame}
   168 \item Eingehende SMTP-Verbindungen (und in Grenzen auch
   203 
   169 	nicht-SMTP)-Verbindungen müssen ACL überwinden.
   204 \begin{frame}[fragile]{String-Expansion}{Listen}
   170 \item Für jede Phase der SMTP-Kommunikation gibt es einen
   205 An vielen Stellen werden Listen verwendet, Trenner in literalen
   171 ACL-Einstiegspunkt, z.B.:\scriptsize\begin{verbatim}
   206 Listen ist „:“, es können aber auch Listen aus Textfiles, DBM-Files und
   172 	acl_smtp_connect = <name of connect acl>
   207 Directories erstellt werden:
   173 	acl_smtp_rcpt = <name of recipient acl>
   208 \begin{itemize}
   174 	acl_smtp_data = <name of recipient acl>
   209 \item Literale Liste: \verb=example.com : foo.bar : example.org=,
   175 \end{verbatim}
   210 	\verb=<; 2001:db8::10 ; 2001:db8::12=
   176 \item ACL entscheidet: accept, reject, defer, warn (noop)
   211 \item Liste aus Datei: \verb=lsearch;/etc/mailnames=,
   177 \item ACL Bedingungen: domains, DNS-BL, Verify (Sender/Empfänger), …, 
   212 	\verb=dbm:/etc/mailnames=
   178  condition
   213 \item Liste aus Verzeichnisinhalt: \verb=dsearch;/etc/vmail/domains=
   179 \item ACL können die interne Behandlung der Nachricht beeinflussen
   214 \end{itemize}
   180 (queue\_only, submission, …)
   215 \end{frame}
   181 \item ACL können Variablen setzen, die später (Router, Transports)
   216 
   182 verwendet werden
   217 \begin{frame}[fragile]{String-Expansion}{Single-Key Lookups}
   183 \end{itemize}
   218 Suche nach einem einzelnen Key, implizit oder explizit
   184 \end{frame}
   219 \begin{verbatim}
   185 
   220 	<item> = <type>;<arg>
   186 \begin{frame}{Router (allg. Optionen und die einzelnen Router accept, dnslookup, manualroute, …)}
   221 	${lookup{<key>}<type>{<arg>}[{<found>}[{<not found}]]}
   187 \end{frame}
   222 	${lookup{<key>}<type>{<arg>}{<found>}fail}
   188 
   223 \end{verbatim}
   189 \begin{frame}{Transports (allg. Optionen und die einzelnen Transports smtp, appendfile, …)}
   224 \begin{itemize}
   190 \end{frame}
   225 \item Lineares File: \verb+domains = lsearch;/etc/mail/domains+
   191 
   226 \item Lineares File: \verb=${lookup{$local_part}lsearch{/etc/aliases}}=
   192 \begin{frame}{Logging (mainlog, rejectlog, paniclog)}
   227 \item Lineares File: \verb=${lookup{$local_part}lsearch{/etc/aliases}{${uc:$value}}}=
   193 \end{frame}
   228 \end{itemize}
   194 
   229 
   195 \begin{frame}{Test und Betrieb}
   230 \begin{exampleblock}{Lookup-Typen}
   196 \end{frame}
   231 lsearch, dsearch, dbm, cdbm, iplsearch, net-iplsearch, wildlsearch, …
   197 
   232 \end{exampleblock}
   198 \begin{frame}{Sicherheitsbetrachtungen (Funktionssicherheit (Verlust von Mails), Einbruchssicherheit, Schreibrechte, Root-Rechte)}
   233 \end{frame}
   199 \end{frame}
   234 
   200 
   235 \begin{frame}[fragile]{String-Expansion}{Query-Style Lookups}
   201 \begin{frame}{Möglichkeiten zur Leistungsverbesserung (Warteschlange, Parallelisierung, Blockierung, Ratelimit)}
   236 Generische Suche in (SQL)-Datenbank, LDAP, DNS, NIS
   202 \end{frame}
   237 \begin{verbatim}
   203 
   238 	${lookup <type>{<arg(s)>}[{<found>}[{<not found>}]]}
   204 \begin{frame}{Ausblick/Offene Punkte: PRDR, DANE, Enhanced Status Codes}
   239 \end{verbatim}
   205 \end{frame}
   240 \begin{itemize}
       
   241 \item DNS: \verb+${lookup dnsdb{a=foobar.de}}+
       
   242 \item LDAP \verb+${lookup ldap{ldap:///o=bar?mailbox?sub?uid=${quote_ldap:$local_part}}}+
       
   243 \item PSQL \verb=${lookup pgsql{SELECT mailbox FROM …}}=
       
   244 \end{itemize}
       
   245 \begin{exampleblock}{Lookup-Typen}
       
   246 	dnsdb, ibase, ldap, mysql, nisplus, oracle, passwd, pgsql, sqlite
       
   247 \end{exampleblock}
       
   248 \end{frame}
       
   249 
       
   250 
       
   251 %\begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)}
       
   252 %\begin{itemize}
       
   253 %\item Eingehende SMTP-Verbindungen (und in Grenzen auch
       
   254 %	nicht-SMTP)-Verbindungen müssen ACL überwinden.
       
   255 %\item Für jede Phase der SMTP-Kommunikation gibt es einen
       
   256 %ACL-Einstiegspunkt, z.B.:\scriptsize\begin{verbatim}
       
   257 %	acl_smtp_connect = <name of connect acl>
       
   258 %	acl_smtp_rcpt = <name of recipient acl>
       
   259 %	acl_smtp_data = <name of recipient acl>
       
   260 %\end{verbatim}
       
   261 %\item ACL entscheidet: accept, reject, defer, warn (noop)
       
   262 %\item ACL Bedingungen: domains, DNS-BL, Verify (Sender/Empfänger), …, 
       
   263 % condition
       
   264 %\item ACL können die interne Behandlung der Nachricht beeinflussen
       
   265 %	(queue\_only, submission, …)
       
   266 %\item ACL können Variablen setzen, die später (Router, Transports)
       
   267 %	verwendet werden
       
   268 %\end{itemize}
       
   269 %\end{frame}
       
   270 %
       
   271 %\begin{frame}{Router (allg. Optionen und die einzelnen Router accept, dnslookup, manualroute, …)}
       
   272 %Router entscheiden über den Fortgang der Bearbeitung
       
   273 %\end{frame}
       
   274 %
       
   275 %\begin{frame}{Transports (allg. Optionen und die einzelnen Transports smtp, appendfile, …)}
       
   276 %\end{frame}
       
   277 %
       
   278 %\begin{frame}{Logging (mainlog, rejectlog, paniclog)}
       
   279 %\end{frame}
       
   280 %
       
   281 %\begin{frame}{Test und Betrieb}
       
   282 %\end{frame}
       
   283 %
       
   284 %\begin{frame}{Sicherheitsbetrachtungen (Funktionssicherheit (Verlust von Mails), Einbruchssicherheit, Schreibrechte, Root-Rechte)}
       
   285 %\end{frame}
       
   286 %
       
   287 %\begin{frame}{Möglichkeiten zur Leistungsverbesserung (Warteschlange, Parallelisierung, Blockierung, Ratelimit)}
       
   288 %\end{frame}
       
   289 %
       
   290 %\begin{frame}{Ausblick/Offene Punkte: PRDR, DANE, Enhanced Status Codes}
       
   291 %\end{frame}
   206 
   292 
   207 \end{document}
   293 \end{document}