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