Attachment 'exim4.conf.v494.txt'
Download 1 ### Confiugrazione per Exim4
2 ### Realizzata da Kurgan (kurgan at kurgan dot org)
3 ### versione del 21/06/2023 (THE NEVER ENDING WAR EDITION)
4 ### Compatibile Debian 11 e Devuan Chimaera
5 ### Exim versione 4.94 o superiore.
6 ### NON COMPATIBILE CON EXIM PRECEDENTI
7
8
9 # Per loggare ma non bloccare quando si usa una variabile "tainted"
10 # Questa funzione verrà disabilitata in Exim in futuro, ora la uso per evitare che si blocchi tutto
11 # se per errore ho lasciato da qualche parte una variabile tainted.
12 # nel caso succeda, troverete un alert nel paniclog.
13 # vedi anche: http://exim.org/exim-html-current/doc/html/spec_html/ch-domain_host_address_and_local_part_lists.html#SECTlistresults
14 allow_insecure_tainted_data =yes
15
16
17
18
19 ##
20 ## MODIFICARE QUESTE IMPOSTAZIONI PER LA VOSTRA INSTALLAZIONE
21 ##
22
23 # Indirizzo mail del postmaster per tutti i domini gestiti dal server.
24 # NON USARE un utente che sia "postmaster@<uno dei domini locali>
25 # altrimenti si crea un loop.
26 POSTMASTER=postmaster@ilvostrodominio.tld
27
28
29 # dove si trovano i files delle mailbox
30 MAIL=/var/vmail
31
32
33 # dove si trova la configurazione di exim4
34 EXIM4=/etc/exim4
35
36
37 # Dove si trovano le chiavi per DKIM
38 DKIM_PATH = EXIM4/dkim
39
40
41 # dove si trovano i files di configurazione degli utenti dei domini virtuali
42 VIRTUALS=/etc/vmail
43
44
45 # white e black list degli host da cui accettare connessioni SMTP
46 # Gli indirizzi in whitelist saltano TUTTI I CONTROLLI. Fate attenzione.
47 WHITELIST=EXIM4/white.list
48 BLACKLIST=EXIM4/black.list
49
50
51 # whitelist dedicata SOLO al greylisting. Se si usa il greylisting
52 # (vedi sotto) allora i netblock in questa lista non sono soggetti
53 # al greylisting. Serve per non avere ritardi mostruosi sulle email
54 # provenienti da sistemi che hanno decine di server SMTP e li ruotano,
55 # tipo i soliti maledetti google e microsoft.
56 # vedi: https://kb.kurgan.org/LinuxDebian/GreyListd
57 NOGREYLIST=EXIM4/nogrey.list
58
59
60 # gli alias per i soli utenti di sistema della macchina
61 SYS_ALIASES=/etc/aliases
62
63
64 # Il livello di spam oltre il quale spamassassin rifiuta lo spam a livello smtp
65 # in qualsiasi caso (moltiplicato per 10!) (metterlo a 65534 e` come dire
66 # che lo spam riconosciuto come tale per contenuto non viene mai rifiutato
67 # a livello SMTP ma viene sempre accettato e marcato)
68 SPAM_SCORE_DENY=100
69
70
71 # Il livello di spam oltre il quale marco il messaggio come spam pero` lo accetto
72 # comunque (lo rifiuto pero` se il livello supera "SPAM_SCORE_DENY" indicato sopra)
73 # La marcatura setta acl_m5 a 1 e consente poi di filtrare il messaggio in un filtro
74 SPAM_SCORE_MARK=50
75
76
77 # Voglio che il check del mittente setti un warning o rifiuti la mail in caso
78 # di mittente inesistente? (usare "warn", "refuse" o "none" per disattivarlo)
79 # il check del mittente e` considerato pratica erronea, anche se funziona,
80 # quindi e` meglio disattivarlo per essere dei "buoni cittadini di internet"
81 SPAM_CHECK_SENDER_ADDRESS=none
82
83
84 # Voglio verificare che il DOMINIO del mittente esita? A differenza del check
85 # precedente, questo non effettua nessuna connessione al mail server del mittente
86 # ma si basa solo sul DNS. Questo check non è "pratica non gradita" e quindi
87 # lo posso usare senza problemi.
88 # (usare "warn", "refuse" o "none" per disattivarlo)
89 SPAM_CHECK_SENDER_DOMAIN=refuse
90
91
92 # Configurazione delle blacklist per INDIRIZZO IP
93 # Voglio che il check delle RBL setti un warning o rifiuti la mail in caso
94 # il cui l'ip del mittente sia in una RBL? (usare "warn" o "refuse" o "none")
95 SPAM_CHECK_RBL=refuse
96
97
98 # Configurazione delle blacklist per INDIRIZZO IP
99 # Quali RBL uso per il check precedente (barracudacentral vuole una registrazione ma funziona lo stesso a quanto pare)
100 # per spamhaus questa nuova configurazione che comprende "!&0.255.255.0" ha lo scopo di ignorare
101 # le risposte che contengono qualsiasi bit settato a 1 nel secondo e terzo gruppo. Di fatto accetta solo 127.0.0.XXX
102 # Il motivo è che spamhaus quando decide che sei cattivo e usi il servizio a sbafo ti risponde semmpre 127.255.255.x
103 # e in quel caso è meglio che lo spam passi piuttosto che bloccare tutto indistintamente.
104 # SPAM_RBL_DNSLIST=zen.spamhaus.org : b.barracudacentral.org
105 SPAM_RBL_DNSLIST=zen.spamhaus.org!&0.255.255.0 : b.barracudacentral.org
106
107
108 # Configurazione delle blacklist per DOMINIO DEL MITTENTE (MAIL FROM)
109 # Uso della RBL "DBL" di Spamhaus che si basa sui nomi di dominio e non sugli
110 # indirizzi IP: (usare "warn", "refuse" o "none" per disattivarlo)
111 SPAM_CHECK_DOMAIN=refuse
112
113
114 # Configurazione delle blacklist per DOMINIO DEL MITTENTE (MAIL FROM)
115 # Elenco delle RBL che uso per il controllo del dominio del mittente:
116 # Notare che qui devo indicare ogni lista con la stringa "/$sender_address_domain" in coda.
117 # Se ho diverse entry, le separo con un ":", ad esempio come segue:
118 # SPAM_DBL_LIST=lista1/$sender_address_domain : lista2/$sender_address_domain
119 # Vedi immediatamente sopra per il motivo del "!&0.255.0.0" aggiunto. In questo caso le risposte corrette sono
120 # 127.0.1.X e gli errori sono sempre 127.255.255.X.
121 SPAM_DBL_DNSLIST=dbl.spamhaus.org!&0.255.0.0/$sender_address_domain
122
123
124
125 # Abilita la funzionalita` di greylisting usando greylistd. (usare "enabled" o "disabled")
126 # Richiede che graylistd sia installato e configurato. Se non usate Debian,
127 # controllate i permessi e il path del socket di graylistd.
128 GREYLISTING=disabled
129
130
131 # Scelta del trasporto da usare per il delivery locale agli utenti dei domini virtuali.
132 # Se si vogliono usare i filtri sieve, occorre usare il delivery che passa per Dovecot LDA
133 # Altrimenti si puo` usare il delivery interno di exim.
134 # Le scelte possibili sono:
135 # - virtual_user_delivery per quello interno di Exim
136 # - virtual_user_dovecot_delivery per l' LDA di Dovecot con il supporto per Sieve
137 # vedasi https://kb.kurgan.org/LinuxDebian/Dovecot-Sieve
138 # VIRTUAL_DELIVERY = virtual_user_delivery
139 VIRTUAL_DELIVERY = virtual_user_dovecot_delivery
140
141
142
143 # Rate limit: per limitare il rischio di spam da parte di un account compromesso
144 # vengono applicati dei rate limit al numero di email inviate per periodo di tempo,
145 # a mezzo delle ACL "ratelimit". Qui sono hardcoded i default, che possono poi essere
146 # modificati (per gli utenti autenticati) nel file di definizione degli utenti.
147
148 # Per gli utenti autenticati: 40 email ogni 5 minuti
149 RATELIMIT_LIMIT=40
150 RATELIMIT_TIME=5m
151
152
153 # Per gli host che possono fare relay e non sono utenti autenticati. (Se sono autenticati
154 # si applica la regola precedente in ogni caso). Se serve che un host superi questi valori
155 # mettere l'host in whitelist.
156 RATELIMIT_HOST_LIMIT=40
157 RATELIMIT_HOST_TIME=5m
158
159 # Per l'allarme in caso di superamento del rate limit: indirizzo email a cui mandare un allarme
160 RATELIMIT_ALARM_RECEIVER=indirizzo@email.tld
161
162
163
164 # Variabile interna per definire il numero di campi separati da ":" nel file degli utenti
165 # La versione "minimale" prevede 3 campi: username:password:parametri (opzionali) e
166 # quindi il numero di ":" per arrivare ai parametri opzionali e` 2.
167 # Se uso la modifica per le quote, dovecot mi obbliga a 8 campi, di cui sono usati solo
168 # il primo, il secondo, e l'ottavo. In questo caso il numero di ":" diventa 7.
169 # Questo parametro non va modificato se non si sa cosa si sta facendo.
170
171 # Usare "2" per un file utenti cosi` fatto:
172 # username:password:parametri opzionali
173 # Usare "7" per un file utenti cosi` fatto:
174 # username:password::::::parametri opzionali
175 USERFILE_FIELDS=2
176
177
178 #
179 # Disabilitare il supporto per ipv6 e` suggerito per riuscire
180 # a mandare email a gmail, almeno per il momento.
181 # Se mandi da ipv6 sei molto più mal visto. Occorre avere SPF, DKIM, DMARC, e RDNS anche per v6.
182 #
183 disable_ipv6=true
184
185
186 # Porte sulle quali ascolta l' SMTP.
187 # Uso la 25 e la 587 (submit) e la 465 per smtps.
188 #
189 daemon_smtp_ports=25 : 587 : 465
190 tls_on_connect_ports = 465
191
192
193 # Se il vostro mail server e` dietro ad un NAT e` meglio inserire qui l' IP pubblico
194 # del NAT, in modo da evitare che il mail server si mandi la mail da solo creando un loop.
195 # questo problema si verifica tipicamente sull' MX secondario quando il primario e` down.
196 #
197 #hosts_treat_as_local = 1.2.3.4
198
199
200 # hostname della macchina e dominio locale
201 # Il dominio locale idealmente non va usato per gli utenti
202 # ma solo per servizio. Notare: il dominio locale è "host.dominio.tld" e non
203 # dominio.tld, quindi va benissimo avere "mail.test.com" per servire le email
204 # degli utenti del dominio "test.com" (che non e` uguale a "mail.test.com)
205 # entrambi questi parametri ha senso che sian impostati al valore dell'hostname della macchina.
206 #
207 primary_hostname = hostname.ilvostrodominio.tld
208 qualify_domain = hostname.ilvostrodominio.tld
209
210
211 # domini per i quali faccio relay ma non sono locali (lasciare vuoto, ovvero non scrivere nulla
212 # dopo il carattere "=", per non fare relay per nessun dominio a parte i locali)
213 # esempio: domainlist relay_to_domains = dominio1.com : dominio2.it
214 domainlist relay_to_domains =
215
216
217 # host per i quali faccio relay (i miei client in LAN)
218 hostlist relay_from_hosts = 127.0.0.1/32 : ::::1
219
220
221 # se questo file e` presente, exim blocca il delivery contestuale alla ricezione.
222 # lo uso come "stop" in caso di allarme sul rate limit. In realta` non e`
223 # uno stop quanto un delay, perche` ad ogni queue run comunque la mail esce.
224 # se volessi un vero stop dovrei fermare exim.
225 queue_only_file = /tmp/exim_queue_only
226
227
228 # Configurazione dello scanner antivirus. Indica che scanner uso
229 # e come contattarlo. Qui uso clamd (daemon di clamav) su socket locale.
230 av_scanner = clamd:/var/run/clamav/clamd.ctl
231
232 # Se spamd usa il socket e non la porta tcp, questa riga va scommentata. Se
233 # volete usare la porta tcp di default su localhost potete commentare questa riga.
234 spamd_address = /var/run/spamd.ctl
235
236
237 # trusted_users contiene anche www-data se si usa una webmail che ne ha bisogno.
238 # altrimenti si puo` anche togliere
239 never_users = root
240 trusted_users = mail : www-data
241
242 # Disattivo le richieste ident, tanto quasi nessuno le onora.
243 # rfc1413_hosts = *
244 rfc1413_query_timeout = 0s
245
246
247 # limiti sul file system per non ingrippare la macchina, e sulle dimensioni delle mail
248 # e dei bounce
249 check_spool_space = 100M
250 return_size_limit = 10k
251 message_size_limit = 100M
252
253
254 # limiti sulle sessioni smtp.
255 smtp_accept_max_per_connection = 100
256 smtp_accept_queue = 150
257
258
259 # configurazioni dei retry delle mail fallite e dell'eliminazione di quelle che non si
260 # riescono a consegnare
261 ignore_bounce_errors_after = 2d
262 timeout_frozen_after = 7d
263 auto_thaw = 12h
264
265
266 # Logging verboso
267 # log_selector = +address_rewrite +all_parents +delivery_size +received_recipients +received_sender +subject
268
269 # logging molto verboso (da usarsi al posto di quella di prima)
270 log_selector = +all -arguments
271
272
273
274 # Configurazione SSL server (per smtps o STARTTLS)
275
276 # dove si trovano i certificati SSL
277 SSL_CERT_PATH = /etc/letsencrypt
278
279 # Quale certificato uso per default se non c'e` SNI (hostname nella richiesta di connessione)
280 # verrà composto un nome file tipo SSL_CERT_PATH/SSL_CERT_DEFAULT.cert per il certificato e
281 # .key per la chiave.
282 # Usare l'hostname principale del vostro mail server (mail.pippo.com per esempio)
283 SSL_CERT_DEFAULT=hotstname.dominio.tld
284
285 # scommentare tutte le righe per attivare SSL dopo aver generato i cert validi necessari
286 #tls_certificate = ${if exists{SSL_CERT_PATH/${lc:$tls_sni}.cert} {SSL_CERT_PATH/${lc:$tls_sni}.cert}{SSL_CERT_PATH/SSL_CERT_DEFAULT.cert}}
287 #tls_privatekey = ${if exists{SSL_CERT_PATH/${lc:$tls_sni}.key} {SSL_CERT_PATH/${lc:$tls_sni}.key}{SSL_CERT_PATH/SSL_CERT_DEFAULT.key}}
288 #tls_advertise_hosts = *
289 #tls_try_verify_hosts = *
290
291
292
293 # siccome ci sono host remoti che non rispettano gli standard, mi piego
294 # a non rispettarli nemmeno io, consentendo l'invio di mail a un MX
295 # indicato nel DNS con l' ip e non con l'hostname.
296 allow_mx_to_ip = true
297
298
299
300
301 ##################################################################
302 ##################################################################
303 ## Fine della parte di configurazione che va modificata ##
304 ## per installare Exim. Da qui in poi dovrebbe andare bene ##
305 ## cosi` come e`. ##
306 ##################################################################
307 ##################################################################
308
309
310 # Tento di nascondere che MTA uso, magari aiuta contro eventuali
311 # attacchi zero-day.
312 smtp_banner="ESMTP server ready"
313
314
315 # Exim 4.86.2-2 e successivi, introducono questi due parametri. Se non li valorizzo
316 # (anche vuoti) Exim scrive warning dappertutto. Questa configurazione funziona anche
317 # con l'environment piallato totalmente, comunuqe ci mettiamo una cosa sensata.
318 # (non tiene nulla dell'environment del chiamante, e ci mette il path standard)
319 add_environment = <; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
320 # add_environment = <; PATH=/bin:/usr/bin
321 keep_environment =
322
323
324 # Configurazione delle ACL
325 acl_smtp_rcpt = acl_check_rcpt
326 acl_smtp_data = acl_check_contents
327 acl_smtp_mime = acl_check_mime
328
329
330 # I virtuali sono definiti come nomi di files in una directory. Il dominio e` locale
331 # se esiste nella directory VIRTUALS un file che si chiama come il dominio.
332 # Qui non occorre specificare il nome della macchina, che viene preso gia`
333 # in considerazione (nei posti giusti) usando quello indicato prima in
334 # "$primary_hostname". Lo stesso vale per "localhost".
335
336 domainlist local_domains = dsearch;VIRTUALS/users
337
338
339
340
341 ######################################################################
342 # ACL CONFIGURATION #
343 # Specifies access control lists for incoming SMTP mail #
344 ######################################################################
345
346 # NOTA: un "accept" o un "deny" che matchano le condizioni
347 # provocano l'accettazione o il rifiuto della mail immediatamente,
348 # quindi tutte le condizioni che seguono in ordine di apparizione
349 # vengono totalmente ignorate.
350
351 begin acl
352
353
354 # Questa ACL viene verificata al momento in cui il remoto mi manda il comando "RCPT TO"
355 acl_check_rcpt:
356
357 # Deny if the local part contains @ or % or / or | or !. These are rarely
358 # found in genuine local parts, but are often tried by people looking to
359 # circumvent relaying restrictions.
360 deny local_parts = ^.*[@%!/|]
361
362 # salvo in due variabili domain e local_part del destinatario, mi serviranno
363 # nella acl successiva per decidere se fare o meno il controllo dello spam.
364 # per farlo uso una acl "warn" alla quale dico di settare due variabili senza
365 # fare alcuna altra azione.
366 # UNTAINT: Dovendo usare acl_m1 in seguito per fare dei lookup su file, devo
367 # renderla non tainted. Il trucco e` validare il dominio contro la lista
368 # local_domains, e settare acl_m1 a $domain_data
369 # Nota: se il dominio non e` locale o relay_to non ho bisogno di queste variabili,
370 # non le uso in nessuna acl nel caso in cui il dominio non sia locale)
371 # Quindi se non le setto (per domini non locali) non succede niente.
372 # Nota bene: acl_m0 che viene da local_part rimante TAINTED
373 warn
374 domains = +local_domains : +relay_to_domains : $primary_hostname : localhost : lsearch;VIRTUALS/domain_aliases
375 set acl_m0 = $local_part
376 set acl_m1 = $domain_data
377
378
379
380 # Whitelist / Blacklist
381 accept hosts = ${if exists{WHITELIST}{WHITELIST}{}}
382 set acl_c0 = no_spam_check
383
384 deny hosts = ${if exists{BLACKLIST}{BLACKLIST}{}}
385
386
387
388 # Rate limt per gli utenti autenticati: si applica solo agli utenti
389 # autenticati, da qualsiasi host provengano (conta lo username,
390 # non l'host di provenienza)
391 # Legge, se ci sono, due parametri ratelimit_limit e ratelimit_time
392 # dal file degli utenti e applica questi limiti Se non ci sono usa
393 # i valori hard-coded all'inizio del file di configurazione.
394 # la mostruosa stringa qui sotto si traduce di fatto in una chiamata
395 # a ratelimit cosi` fatta:
396 # ratelimit = limite / tempo / strict / $authenticated_id.
397 # La complessita` sta nel fatto di leggere i valori per limite e tempo
398 # dal file degli utenti per ogni utente e gestire il fallback al default
399 # in assenza di questi valori.
400 # Questa ACL blocca l'invio di ulteriore mail fino a che non si scende
401 # sotto il rate limit impostato, inoltre manda una mail usando
402 # lo script indicato nella riga "continue" ad un indirizzo codificato
403 # all'inizio del file di configurazione (RATELIMIT_ALARM_RECEIVER).
404 # Lo script puo` anche creare un file che inibisce il delivery delle email,
405 # file che andra` cancellato a mano dopo essere intervenuti sul
406 # problema. Questo file pero` non impedisce il delivery ogni tot minuti
407 # che fa exim (vedi /etc/default/exim4) e quindi non impedisce l'eventuale
408 # delivery dello spam ma lo ritarda solo di un poco.
409 # UNTAINT: setto e uso acl_m6 che e` UNTAINTED partendo da authenticated_id
410 # e confrontandolo con i domini virtuali.
411 deny authenticated = *
412 set acl_m6 = ${lookup {${domain:$authenticated_id}} dsearch,filter=file {VIRTUALS/users}}
413 ratelimit = ${extract{ratelimit_limit} {${extract{USERFILE_FIELDS}{:} {${lookup {${local_part:$authenticated_id}} lsearch {VIRTUALS/users/$acl_m6}}} }}{$value}{RATELIMIT_LIMIT} } / ${extract{ratelimit_time} {${extract{USERFILE_FIELDS}{:} {${lookup {${local_part:$authenticated_id}} lsearch {VIRTUALS/users/$acl_m6}}} }}{$value}{RATELIMIT_TIME} } / strict / $authenticated_id
414 log_message = RATELIMIT AUTH: $authenticated_id $sender_host_address - $sender_rate/$sender_rate_period (max $sender_rate_limit)
415 message = Utente bloccato per eccessivo invio di email. Rivolgesri all'amministratore del sistema
416 continue = ${run{/bin/bash -c "EXIM4/ratelimitalert.sh RATELIMIT_ALARM_RECEIVER $authenticated_id $sender_host_address $sender_rate $sender_rate_period $sender_rate_limit"}}
417
418
419
420 # Rate limt per gli host nella LAN: si applica agli host che possono fare relay
421 # e non usano autenticazione. Se invece usano l'autenticazione, allora questa
422 # non si applica e si applica la precedente.
423 # Se occorre che un host non sia limitato da questa regola, va messo in whitelist.
424 # Se dovesse servire in futuro rendero` questa regola configurabile per ogni host
425 # in modo diverso, ma per ora non ne ho voglia.
426 deny hosts = +relay_from_hosts
427 !authenticated = *
428 ratelimit = RATELIMIT_HOST_LIMIT / RATELIMIT_HOST_TIME / strict / $sender_host_address
429 log_message = RATELIMIT HOST: $sender_host_address - $sender_rate/$sender_rate_period (max $sender_rate_limit)
430 message = Host bloccato per eccessivo invio di email. Rivolgesri all'amministratore del sistema
431 continue = ${run{/bin/bash -c "EXIM4/ratelimitalert.sh RATELIMIT_ALARM_RECEIVER '' $sender_host_address $sender_rate $sender_rate_period $sender_rate_limit"}}
432
433
434
435 # Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by
436 # testing for an empty sending host field.
437 # Qui dovro` ragionare sul rate limit.
438 # la riga control=submission aggiunge headers se mancano nel messaggio (data e id)
439 # ed ha senso metterla perché molti programmi non mettono tutti gli header correttamente.
440 accept hosts = :
441 control = submission/sender_retain
442
443
444 # Se la mail viene dagli host dai quali accetto il relay (tipicamente la mia LAN)
445 # la accetto e setto una variabile per evitare di fare il check dello spam
446 # sui messaggi che vengono dalla mia rete.
447 accept hosts = +relay_from_hosts
448 set acl_c0 = no_spam_check
449 control = submission/sender_retain
450
451
452 # Accept mail to postmaster and other administrative addresses in any local domain,
453 # regardless of the source, and without verifying the sender.
454 accept local_parts = postmaster : bayes : revoke
455 domains = +local_domains : +relay_to_domains : $primary_hostname : localhost : lsearch;VIRTUALS/domain_aliases
456
457
458 # Se il destinatario e` listato nel file VIRTUALS/allowed_recipients allora
459 # lo accetto comunque, ignorando tutti i controlli sul mittente.
460 accept recipients = ${if exists{VIRTUALS/allowed_recipients}{VIRTUALS/allowed_recipients}{}}
461 set acl_c0 = no_spam_check
462
463
464 # Se la mail viene da un client autenticato, la accetto comunque.
465 # Inoltre imposto una variabile che usero` per saltare la scansione antispam della mail
466 # proveniente da una connessione autenticata, che ritengo sicura.
467 accept authenticated = *
468 set acl_c0 = no_spam_check
469 control = submission/sender_retain
470
471
472 # Rifiuta se non c'e' l'HELO
473 deny message = HELO/EHLO required by SMTP RFC
474 condition = ${if eq{$sender_helo_name}{}{yes}{no}}
475
476 # Rifiuta se l'IP in HELO e' uguale al mio...
477 deny message = My IP detected in HELO
478 condition = ${if eq{$sender_helo_name}{$interface_address}{yes}{no}}
479
480 # Rifiuta se l'hostname usato in HELO e' il mio
481 deny message = Forged hostname detected in HELO
482 !authenticated = *
483 condition = ${if match_domain{$sender_helo_name}{+local_domains}{yes}{no}}
484
485 # Solo un destinatario se il mittente e' nullo
486 deny message = Only one recipient accepted for NULL sender
487 senders = :
488 condition = ${if >{$rcpt_count}{1} {1}}
489
490
491 # Blacklist per indirizzo IP del mittente:
492 # RBL Check (se non e` nella lista degli host da cui faccio relay, ovvero la mia LAN,
493 # allora controllo presso i vari provider di RBL e poi rejecto con un messaggio personalizzabile)
494 deny hosts = ! +relay_from_hosts
495 condition = ${if eq {SPAM_CHECK_RBL} {refuse} {true}{false}}
496 dnslists = SPAM_RBL_DNSLIST
497 log_message = RBL check: IP address $sender_host_address found in black list at $dnslist_domain with result $dnslist_value
498 message = rejected because $sender_host_address is in a black list at $dnslist_domain
499
500
501 # Blacklist per indirizzo IP del mittente:
502 # Altro tipo di RBL check, come prima ma la mail viene accettata comunque, con un
503 # warning in un header e l'impostazione della variabile acl_m5, utile se si vuole
504 # usare il router che salva lo spam in un folder imap separato.
505 warn message = X-Warning: $sender_host_address is in a black list at $dnslist_domain
506 condition = ${if eq {SPAM_CHECK_RBL} {warn} {true}{false}}
507 hosts = ! +relay_from_hosts
508 log_message = RBL check: IP address $sender_host_address found in black list at $dnslist_domain with result $dnslist_value
509 dnslists = SPAM_RBL_DNSLIST
510 set acl_m5 = 1
511
512
513 # Blacklist per DOMINIO del mittente:
514 # RBL Check (se non e` nella lista degli host da cui faccio relay, ovvero la mia LAN,
515 # allora controllo presso i vari provider di RBL e poi rejecto con un messaggio personalizzabile)
516 deny hosts = ! +relay_from_hosts
517 condition = ${if eq {SPAM_CHECK_DOMAIN} {refuse} {true}{false}}
518 dnslists = SPAM_DBL_DNSLIST
519 log_message = RBL check: domain $sender_address_domain found in black list at $dnslist_domain with result $dnslist_value
520 message = rejected because the domain $sender_address_domain is in a black list at $dnslist_domain
521
522
523 # Blacklist per DOMINIO del mittente:
524 # Altro tipo di RBL check, come prima ma la mail viene accettata comunque, con un
525 # warning in un header e l'impostazione della variabile acl_m5, utile se si vuole
526 # usare il router che salva lo spam in un folder imap separato.
527 warn message = X-Warning: domain $sender_address_domain is in a black list at $dnslist_domain
528 condition = ${if eq {SPAM_CHECK_DOMAIN} {warn} {true}{false}}
529 hosts = ! +relay_from_hosts
530 log_message = RBL check: domain $sender_address_domain found in black list at $dnslist_domain with result $dnslist_value
531 dnslists = SPAM_DBL_DNSLIST
532 set acl_m5 = 1
533
534
535 # Verifico se il dominio del mittente esiste verificando semplicemente se ha un record DNS
536 # Se il domnio non esiste, rifiuto la mail. Nota: non verifico se esiste l'indirizzo email
537 # ma solo il dominio del mittente. Questa pratica è "safe" e la posso usare senza patemi.
538 deny condition = ${if eq {SPAM_CHECK_SENDER_DOMAIN} {refuse} {true}{false}}
539 !verify = sender
540
541
542 # Variante del controllo precedente che imposta un header se il dominio del mittente non esiste
543 warn condition = ${if eq {SPAM_CHECK_SENDER_DOMAIN} {warn} {true}{false}}
544 !verify = sender
545 message = X-Warning: sender domain verify failed: $acl_verify_message
546 hosts = ! +relay_from_hosts
547 log_message = sender domain verify failed: $acl_verify_message
548 set acl_m5 = 1
549
550
551 # Verifico se il mittente esiste facendo una chiamata al suo mail server e fingendo di
552 # volergli mandare una mail. Se il mittente non esiste, rifiuto la mail. Se il suo mail server
553 # non risponde, la accetto lo stesso. Questa pratica non è considerata civile quindi meglio
554 # non usarla.
555 deny condition = ${if eq {SPAM_CHECK_SENDER_ADDRESS} {refuse} {true}{false}}
556 !verify = sender/callout=10s,connect=5s/defer_ok
557
558
559 # Variante del controllo precedente che imposta un header se il mittente non esiste (2010-01-13)
560 # imposta anche la variabile acl_m5 per indicare che un controllo antispam ha dato esito positivo
561 # Questa pratica non è considerata civile quindi meglio non usarla.
562 warn condition = ${if eq {SPAM_CHECK_SENDER_ADDRESS} {warn} {true}{false}}
563 !verify = sender/callout=10s,connect=5s/defer_ok
564 message = X-Warning: sender address verify failed: $acl_verify_message
565 hosts = ! +relay_from_hosts
566 log_message = sender address verify failed: $acl_verify_message
567 set acl_m5 = 1
568
569
570 # implementazione delle greylist a mezzo del demone greylistd.
571 # Se la mail non e` stata rifiutata prima, arriva qui e viene verificata la greylist prima
572 # di venire eventualmente accettata dalle ACL che seguono.
573 # notare che non considero il singolo host, ma la net /24 a cui esso appartiene.
574 # questo e` un rilassamento del controllo per evitare di ritardare all'infinito mail che vengono
575 # da sistemi che hanno diversi server smtpche lavorano in parallelo.
576 # Se l'host si trova nella lista NOGREYLIST allora il controllo viene saltato e la mail accettata
577 # immediatamente.
578 defer message = Sender is greylisted. Please try again later.
579 !authenticated = *
580 condition = ${if eq {GREYLISTING} {enabled} {true}{false}}
581 !hosts = ${if exists{NOGREYLIST}{net-iplsearch;NOGREYLIST}{}}
582 condition = ${if eq {grey}\
583 {${readsocket{/var/run/greylistd/socket}\
584 {${mask:$sender_host_address/24} \
585 $sender_address \
586 $local_part@$domain}\
587 {5s}{}{}}}\
588 {true}{false}}
589 log_message = Greylisted $sender_host_address $sender_address $local_part@$domain
590
591
592 # Accept if the address is in a local domain, but only if the recipient can
593 # be verified. Otherwise deny. The "endpass" line is the border between
594 # passing on to the next ACL statement (if tests above it fail) or denying
595 # access (if tests below it fail).
596 accept domains = +local_domains : $primary_hostname : localhost : lsearch;VIRTUALS/domain_aliases
597 endpass
598 message = unknown user
599 verify = recipient
600
601 # Accetto la mail se sono un MX secondario, ma tento di verificarla presso il primario.
602 # Se il primario non risponde, la accetto (defer_ok), mentre se risponde verifico se
603 # il destinatario esiste o meno. Se non esiste, la rifiuto. Questo evita di affogare
604 # il secondario nello spam che il primario ha rifiutato.
605 accept domains = +relay_to_domains
606 endpass
607 message = unrouteable address or unknown user
608 verify = recipient/callout=5s/defer_ok
609
610
611 # If control reaches this point, the domain is neither in +local_domains
612 # nor in +relay_to_domains.
613
614 # Reaching the end of the ACL causes a "deny", but we might as well give
615 # an explicit message.
616 deny message = relay not permitted
617
618
619
620 # Questa ACL viene verificata dopo aver ricevuto il body (DATA), quindi di fatto subito prima della
621 # fine della connessione SMTP.
622 acl_check_contents:
623
624 # check virus. Lascio che il messaggio passi se il virus scanner non funziona (defer_ok)
625 # I contenuti mime del messaggio sono gia` stati decodificati nella acl "acl_check_mime".
626 # DISATTIVAZIONE: il controllo antivirus e` sempre attivo a meno che nel file degli utenti
627 # del dominio non sia specificato "virus=off" fra i paramentri dopo la password.
628 # Se il messaggio e` mandato dai miei utenti (acl_c0 e` impostata a "no_spam_check") allora
629 # non eseguo il controllo AV
630 deny message = This message contains a virus ($malware_name) and has been rejected
631 condition = ${if !eq {$acl_c0} {no_spam_check} }
632 condition = ${if or{ {!exists{VIRTUALS/users/$acl_m1}} {!eq {${extract{virus} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} {off}}} {true} {false} }
633 malware = */defer_ok
634
635
636 # Check spam: Se il messaggio non e` stato mandato dai miei utenti, e
637 # se non e` troppo grosso per scannarlo, lo scanno e mi segno i punteggi
638 # dentro delle variabili
639 warn
640 condition = ${if !eq {$acl_c0} {no_spam_check} }
641 spam = mail:true/defer_ok
642 logwrite = SpamScore $spam_score
643 set acl_m2 = $spam_score_int
644 set acl_m3 = $spam_report
645 set acl_m4 = [SPAM]($spam_score) $rh_Subject
646
647
648 # Check spam: se a livello di sistema e` impostata una soglia di "spammosita`"
649 # oltre la quale lo spam viene rifiutato, lo rifiuto a livello smtp
650 deny
651 condition = ${if !eq {$acl_c0} {no_spam_check} }
652 condition = ${if > {$spam_score_int}{SPAM_SCORE_DENY} {true}{false}}
653 log_message = Message refused by system configuration (spam score $spam_score_int is too high)
654 message = This message is considered to be spam based on its contents
655
656
657 # Check spam: se a livello di sistema e` impostata una soglia di spammosita` per il marking,
658 # marco il messaggio con un header e setto la acl_m5 a 1 per indicare che un controllo
659 # antispam ha dato esito positivo (2010-01-15)
660 warn
661 condition = ${if !eq {$acl_c0} {no_spam_check} }
662 condition = ${if > {$spam_score_int}{SPAM_SCORE_MARK} {true}{false}}
663 log_message = Message marked as spam by system configuration (spam score $spam_score_int is too high)
664 set acl_m5 = 1
665
666
667 # Check spam: se il destinatario ha impostato il parametro spam_smtp_deny,
668 # leggo il punteggio e decido se rifiutare la mail (in base al punteggio)
669 # Se spam_smtp_deny non e` impostato, salto questo controllo
670 deny
671 condition = ${if !eq {$acl_c0} {no_spam_check} }
672 condition = ${if exists{VIRTUALS/users/$acl_m1} {true}{false} }
673 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} }
674 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} }
675 log_message = Messagre refused by recipient (user) configuration (spam score too high)
676 message = This message is considered to be spam based on its contents
677
678
679 # Check spam: come sopra, pero` nel file degli alias e non nel file
680 # degli utenti. Teoricamente dovrei verificare se esite un alias
681 # con lo stesso indirizzo di un utente, e nel caso applicare solo il
682 # check dell'alias e non quello dell'utente, al momento li
683 # applico entrambi, col risultato che il piu` restrittivo decide la sorte
684 # del messaggio.
685 deny
686 condition = ${if !eq {$acl_c0} {no_spam_check} }
687 condition = ${if exists{VIRTUALS/aliases/$acl_m1} {true}{false} }
688 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/aliases/$acl_m1}}} }} }} }
689 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/aliases/$acl_m1}}} }} }} }
690 log_message = Messagre refused by recipient (alias) configuration (spam score too high)
691 message = This message is considered to be spam based on its contents
692
693
694 # Check spam: come sopra, pero` nel file dei domain alias.
695 # in questo caso pero` e` possibile indicare solo un valore
696 # per tutti gli utenti del dominio aliasato
697 deny
698 condition = ${if !eq {$acl_c0} {no_spam_check} }
699 condition = ${if exists{VIRTUALS/domain_aliases} {true}{false} }
700 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m1} lsearch {VIRTUALS/domain_aliases}}} }} }} }
701 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m1} lsearch {VIRTUALS/domain_aliases}}} }} }} }
702 log_message = Messagre refused by recipient (domain alias) configuration (spam score too high)
703 message = This message is considered to be spam based on its contents
704
705
706 # Alla fine accetto tutto quello che e` passato fino a qui.
707 accept
708
709
710 # Questa ACL si applica ai contenuti MIME. In pratica qui non faccio nessun
711 # controllo sul contenuto, ma mi limito a decodificarlo in modo da poter
712 # poi eseguire il controllo antivirus sui contenuti decodificati.
713 acl_check_mime:
714 warn decode = default
715 accept
716
717
718
719 ######################################################################
720 # ROUTERS CONFIGURATION #
721 # Specifies how addresses are handled #
722 ######################################################################
723 # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
724 # An address is passed to each router in turn until it is accepted. #
725 ######################################################################
726
727 begin routers
728
729 # This router routes addresses that are not in local domains by doing a DNS
730 # lookup on the domain name. These are sent via SMTP.
731 # Any domain that resolves to 0.0.0.0 or to a loopback interface address
732 # (127.0.0.0/8) is treated as if it had no DNS entry.
733 # If the DNS lookup fails, no further routers are tried because of
734 # the no_more setting, and consequently the address is unrouteable.
735 # TAINT OK
736 dnslookup:
737 driver = dnslookup
738 domains = ! +local_domains : ! $primary_hostname : ! localhost : ! lsearch;VIRTUALS/domain_aliases
739 transport = remote_smtp
740 ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
741 no_more
742
743
744 # gestione autoreply
745 # Se esiste un file VIRTUALS/autoreply/domain/user allora fa un autoreply per questo utente
746 # usando come testo della risposta il contenuto del file
747 # TAINT OK
748 autoreply:
749 driver = accept
750 #domains = +local_domains
751 domains = dsearch;VIRTUALS/autoreply
752 condition = ${if exists{VIRTUALS/autoreply/$domain_data/$local_part} {true}{false} }
753 # TAINT il dsearch detainta local_part
754 local_parts = ${lookup {$local_part} dsearch,ret=key{VIRTUALS/autoreply/$domain_data} }
755 no_verify
756 no_expn
757 unseen
758 transport = autoreply
759 senders = ! ^.*-request@.*:\
760 ! ^bounce-.*@.*:\
761 ! ^.*-bounce@.*:\
762 ! ^owner-.*@.*:\
763 ! ^postmaster@.*:\
764 ! ^abuse@.*:\
765 ! ^webmaster@.*:\
766 ! ^listmaster@.*:\
767 ! ^mailer-daemon@.*:\
768 ! ^root@.*
769
770
771 # gestione dei files .forward per gli utenti locali della macchina
772 # TAINT OK
773 userforward:
774 driver = redirect
775 check_local_user
776 condition = ${if exists{$home/.forward} {true}{false} }
777 domains = ${primary_hostname} : localhost
778 file = $home/.forward
779 no_verify
780 no_expn
781 check_ancestor
782 # allow_filter
783 file_transport = address_file
784 pipe_transport = address_pipe
785 reply_transport = address_reply
786
787
788 # alias di sistema presi da /etc/aliases, solo per l'hostname locale
789 # TAINT OK
790 system_aliases:
791 driver = redirect
792 allow_fail
793 allow_defer
794 domains = ${primary_hostname} : localhost
795 data = ${lookup {$local_part} lsearch{SYS_ALIASES} }
796 file_transport = address_file
797 pipe_transport = address_pipe
798
799
800 # delivery della mail per gli utenti locali della macchina
801 localuser:
802 driver = accept
803 domains = ${primary_hostname} : localhost
804 check_local_user
805 transport = local_delivery
806
807 # alias di sistema presi da /etc/aliases, solo per l'hostname locale
808 # Questa volta cerco con l' asterisco, in modo che se alla fine del file aliases metto una voce
809 # che dice "*:indirizzo", un qualsiasi indirizzo che non sia stato trovato prima (ne` fra gli alias
810 # ne` fra gli utenti) venga diretto all'indirizzo indicato dopo l'asterisco.
811 # questo sistema bruttino di fare due volte la ricerca degli alias serve per consentire di avere
812 # un ordine preciso: prima gli alias (Senza asterisco) poi gli utenti, e per finire l'alias con
813 # l'asterisco (se c'e`)a
814 # TAINT OK
815 system_aliases_wildcard:
816 driver = redirect
817 allow_fail
818 allow_defer
819 domains = ${primary_hostname} : localhost
820 data = ${lookup {$local_part} lsearch*{SYS_ALIASES} }
821 file_transport = address_file
822 pipe_transport = address_pipe
823
824
825 # Redirect di tutte le mail indirizzate ai vari postmaster, sia
826 # dei domini locali (virtuali), sia a quello della macchina
827 # Queste vanno tutte a qualcuno che sappia cosa farne.
828 domain_postmaster:
829 driver = redirect
830 local_parts = postmaster
831 domains = +local_domains : ${primary_hostname} : localhost
832 check_ancestor
833 retry_use_local_part
834 data = POSTMASTER
835
836 ##### ATTENZIONE: questo pezzo e` incompleto e non va usato se non viene prima sistemato #####
837 ## Istruiamo spamassassin. Le mail indirizzate a bayes e revoke vanno mandate a
838 ## un trasporto speciale che addestra il filtro bayesiano e riporta a razor
839 #bayes_report:
840 # driver = accept
841 # local_parts = bayes : revoke
842 # domains = +local_domains
843 # transport = bayes_update
844
845
846 # gli indirizzi real-email@domain non passano per l'espansione degli alias
847 # TAINT OK
848 real_virtual_user:
849 driver = accept
850 local_part_prefix = real-
851 domains = +local_domains
852 # TAINT - popoliamo local_part_data
853 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
854 condition = ${lookup {$local_part} lsearch{VIRTUALS/users/$domain_data} }
855 retry_use_local_part
856 transport = VIRTUAL_DELIVERY
857
858
859
860 # alias virtuali, redirect ad altri indirizzi e/o pipe verso comandi
861 # TAINT OK
862 virtual_aliases:
863 driver = redirect
864 allow_defer
865 allow_fail
866 domains = +local_domains
867 condition = ${if exists{VIRTUALS/aliases/$domain_data} {true}{false} }
868 pipe_transport = address_pipe
869 file_transport = address_file
870 data = ${extract{1}{:} {${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain_data}} } }}
871 user=${extract{pipe_user} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain_data}} }}}} {$value} {Debian-exim}}
872 group=${extract{pipe_group} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain_data}} }}}} {$value} {Debian-exim}}
873
874
875
876
877 # Prima del delivery finale agli utenti virtuali applico eventuali
878 # regole per lo spam definite nel file VIRTUALS/users/$domain
879 # per l'utente in questione. (i prossimi due router)
880
881 # Questo router mette lo spam nel gufo se cosi` e`
882 # richiesto dalla configurazione utente. Attenzione che
883 # qui si perdono i messaggi se si sbaglia configurazione
884 virtual_spam_owl:
885 driver = redirect
886 domains = +local_domains
887 no_verify
888 # TAINT - popoliamo local_part_data
889 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
890 condition = ${if exists{VIRTUALS/users/$domain_data} {true}{false} }
891 condition = ${if > {$spam_score_int} {${extract{spam_blackhole} {${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain_data}}} }}{$value}{65535} }} }
892 data=:blackhole:
893
894 # Questo router modifica il subject se richiesto
895 # nella configurazione dell'utente. Per velocita`
896 # faccio in modo di non ripassare tutti i router da capo
897 # ma di passare direttamente al successivo (redirect_router)
898 virtual_spam_add_subject:
899 driver = redirect
900 domains = +local_domains
901 no_verify
902 # TAINT - popoliamo local_part_data
903 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
904 condition = ${if exists{VIRTUALS/users/$domain_data} {true}{false} }
905 condition = ${if > {$spam_score_int} {${extract{spam_subject} {${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain_data}}} }}{$value}{65535} }} }
906 headers_remove = Subject
907 headers_add = Subject: $acl_m4
908 data = $local_part_data@$domain_data
909 redirect_router = virtual_filter
910
911
912
913 # Delivery dello spam in una cartella IMAP apposta (2010-01-15)
914 # Questo, se l'utente ha il parametro spam_folder settato e la variabile acl_m5 e` uguale a 1
915 # (quindi la mail in questione ha fatto scattare almeno uno dei controlli antispam)
916 # salva la mail in un folder che ha il nome indicato nel parametro spam_folder
917 # (piu` esattamente chiama un trasporto apposta che provvedera` all'uopo)
918 virtual_spam_folder:
919 driver=accept
920 domains = +local_domains
921 # TAINT - popoliamo local_part_data
922 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
923 condition = ${if exists{VIRTUALS/users/$domain_data} {true}{false} }
924 condition = ${if and{ { !eq{}{${lookup {$local_part} lsearch{VIRTUALS/users/$domain_data}}}} {={$acl_m5}{1}} {={1}{ ${extract{spam_folder} { ${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain_data}}} }}{1}{0}} }} } }
925 headers_remove = X-Spam-Score:X-Spam-Report
926 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
927 transport = virtual_user_spam_delivery
928
929
930
931
932 # Filtri per gli utenti dei domini virtuali.
933 # Questo router applica un filtro alle mail in transito per l'utente
934 # se esiste un file VIRTUALS/filters/$domain/$local_part
935 # Questo sistema non e` sicuro se i filtri possono essere impostati da qualcuno che
936 # ha cattive intenzioni. Idealmente i files dei filtri dovrebbero essere creati solo
937 # dal sysadmin su richiesta degli utenti.
938 virtual_filter:
939 user=mail
940 group=mail
941 driver = redirect
942 domains = +local_domains
943 # TAINT - popoliamo local_part_data
944 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
945 condition = ${if exists{VIRTUALS/filters/$domain_data/$local_part} {true}{false} }
946 file = VIRTUALS/filters/$domain_data/$local_part_data
947 headers_remove = X-Spam-Score:X-Spam-Report
948 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
949 no_verify
950 allow_filter
951 allow_freeze
952 directory_transport = address_directory
953 file_transport = address_file
954 pipe_transport = address_pipe
955 reply_transport = autoreply
956
957
958 # Delivery agli utenti dei domini virtuali
959 # TAINT: la riga local_parts serve a popolare local_part_data
960 # in modo che poi il trasporto abbia le variabili untainted da usare
961 # TAINT OK
962 virtual_user:
963 driver = accept
964 domains = +local_domains
965 condition = ${if exists{VIRTUALS/users/$domain_data} {true}{false} }
966 local_parts = ${lookup {$local_part} lsearch,ret=key{VIRTUALS/users/$domain_data} }
967 headers_remove = X-Spam-Score:X-Spam-Report
968 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
969 retry_use_local_part
970 transport = VIRTUAL_DELIVERY
971
972
973 # Questo router cerca un indirizzo del tipo "user-ggmmaaaa@domain.tld" e se lo trova lo ridirige a
974 # user@domain.tld senza il "-ggmmaaaa". Serve a fornire ad ogni utente un indirizzo mail "temporaneo"
975 # valido solo per la data odierna, utile per iscriversi a quei servizi che poi magari ti spammano
976 # a morte, perche` da domani questo non e` piu` valido.
977 # TAINT: testato OK
978 auto_daily_alias:
979 driver = redirect
980 domains = +local_domains
981 check_ancestor
982 condition = ${if eq {${substr{-9}{10}{$local_part}}} {-${substr{6}{2}{$tod_logfile}}${substr{4}{2}{$tod_logfile}}${substr{0}{4}{$tod_logfile}}} {true}{false}}
983 data = ${substr{-9}{$local_part}}@$domain
984
985
986 # alias virtuali, redirect ad altri indirizzi e/o pipe verso comandi
987 # questa volta anche con l'asterisco, come per gli aliases locali
988 # TAINT dovrebbe essere OK come virtual_aliases
989 virtual_aliases_wildcard:
990 driver = redirect
991 allow_defer
992 allow_fail
993 domains = +local_domains
994 condition = ${if exists{VIRTUALS/aliases/$domain_data} {true}{false} }
995 pipe_transport = address_pipe
996 file_transport = address_file
997 data = ${extract{1}{:} {${lookup {$local_part} lsearch*{VIRTUALS/aliases/${domain_data}} } }}
998 user=${extract{pipe_user} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain_data}} }}}} {$value} {Debian-exim}}
999 group=${extract{pipe_group} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain_data}} }}}} {$value} {Debian-exim}}
1000
1001
1002
1003
1004 # alias dei domini. Se esiste un file che si chiama VIRTUALS/domain_aliases
1005 # questo consente di ridirigere tutta la mail per un dominio su un'altro.
1006 # la sintassi del file domain_aliases e` "dominio_origine:dominio_destinazione[:variabili]"
1007 # (una coppia per riga). In questo modo quando riceviamo una mail per
1008 # utente@dominio_origine, prima viene verificato se esiste l'utente nel
1009 # dominio originale. Se l'utente non esiste, o se proprio non esiste il file
1010 # degli utenti del dominio originale, allora la mail viene ridiretta a
1011 # utente@dominio_destinazione.
1012 domain_aliases:
1013 driver = redirect
1014 condition = ${if and{ {exists{VIRTUALS/domain_aliases}} {!eq {${lookup {$domain} lsearch{VIRTUALS/domain_aliases}}} {}}}{true}{false}}
1015 data = ${quote:$local_part}@${extract{1}{:} {${lookup {$domain} lsearch{VIRTUALS/domain_aliases}}}}
1016
1017
1018
1019 ######################################################################
1020 # TRANSPORTS CONFIGURATION #
1021 ######################################################################
1022 # ORDER DOES NOT MATTER #
1023 # Only one appropriate transport is called for each delivery. #
1024 ######################################################################
1025
1026 begin transports
1027
1028 # Delivery via SMTP all' MX del dominio remoto
1029 remote_smtp:
1030 driver = smtp
1031 dkim_canon = relaxed
1032 dkim_selector = dkim
1033 dkim_domain = ${lc:$sender_address_domain}
1034 # TAINT facendo un lookup dsearch il risultato è non tainted
1035 dkim_private_key = ${lookup {${lc:$sender_address_domain}-private.pem} dsearch,ret=full {DKIM_PATH}}
1036 # fallback_hosts = your.provider.smtp.server
1037 ### hosts_avoid_esmtp = *
1038 # interface = 89.40.12.236
1039
1040 # Delivery locale per gli utenti fisici della macchina. (files in /var/mail)
1041 local_delivery:
1042 driver = appendfile
1043 file = /var/mail/$local_part_data
1044 group=mail
1045 delivery_date_add
1046 envelope_to_add
1047 return_path_add
1048
1049 # Pipe ad un programma, per i vari files di forward
1050 address_pipe:
1051 driver = pipe
1052 return_output
1053
1054 # Scrittura su un file, per i vari files di forward
1055 address_file:
1056 driver = appendfile
1057 delivery_date_add
1058 envelope_to_add
1059 return_path_add
1060
1061 # Scrittura su una maildir, per i vari files di forward
1062 address_directory:
1063 driver=appendfile
1064 delivery_date_add
1065 envelope_to_add
1066 return_path_add
1067 maildir_format
1068
1069 # Reply a mezzo email, per i vari files di forward. Questo NON va usato per vacation
1070 # perche` non ha protezioni tipo once o simili.
1071 address_reply:
1072 driver = autoreply
1073
1074 # Insegnamento a spamassassin
1075 # Mai testato e mai usato. Al momento lo commento e lo tengo buono per il futuro.
1076 # Come sistema di insegnamento a spamassassin, usiamo quello via IMAP.
1077 #spam_update:
1078 # driver = pipe
1079 # user = mail
1080 # group = mail
1081 # return_output
1082 # command = spamassassin if{ eq {$local_part_data}{revoke} {-k}{-r}}
1083
1084
1085 # Delivery locale agli utenti virtuali (il trasporto fondamentale)
1086 # Questa e` la versione che NON USA Dovecot LDA e quindi NON funziona con SIEVE.
1087 # TAINT: questo richiede domain_data e local_part_data, che se non ho fatto errori
1088 # sono settati dai router che possono richiamare questo trasporto.
1089 virtual_user_delivery:
1090 driver = appendfile
1091 directory = MAIL/$domain_data/$local_part_data
1092 maildir_format
1093 user = mail
1094 group = mail
1095 mode = 0600
1096 directory_mode = 0700
1097
1098
1099 # Delivery locale agli utenti virtuali con Dovecot LDA e supporto SIEVE
1100 # vedasi https://mater.kurgan.org/kb/LinuxDebian/Dovecot-Sieve
1101 # TAINT: qui non ho problemi perche` exim non sa che usero` i valori per scrivere su un file
1102 # in quanto io tecnicamente li passo a Dovecot.
1103 virtual_user_dovecot_delivery:
1104 driver = pipe
1105 command = /usr/lib/dovecot/dovecot-lda -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
1106 message_prefix =
1107 message_suffix =
1108 delivery_date_add
1109 envelope_to_add
1110 return_path_add
1111 log_output
1112 user = mail
1113 temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
1114
1115
1116
1117 # Delivery locale agli utenti virtuali della mail che e` considerata spam
1118 # Questo viene chiamato se si decide di accettare lo spam anziche` rimbalzarlo
1119 # e fa delivery in un folder imap apposito, specificato nella configurazione
1120 # dell'utente alla voce "spam_folder". Viene chiamato dal router "virtual_spam_folder".
1121 # TAINT: dovrebbe essere OK, i valori sono popolati dal router che lo chiama
1122 virtual_user_spam_delivery:
1123 driver = appendfile
1124 directory = MAIL/$domain_data/$local_part_data/.${extract{spam_folder} { ${extract{USERFILE_FIELDS}{:} {${lookup {$local_part_data} lsearch {VIRTUALS/users/$domain_data}}} }}{$value}{}}
1125 # directory = MAIL/$domain/$local_part/.testspam
1126 maildir_format
1127 user = mail
1128 group = Debian-exim
1129 mode = 0600
1130 directory_mode = 0700
1131
1132
1133
1134
1135 # Trasporto di replay con funzione di limitazione con file once.
1136 # funziona per il router autoreplay oppure se chiamato in un filtro.
1137 # imposta il subject a un valore standard, e il testo al contenuto del file di autoreply oppure
1138 # ad un valore standard se questo file non esiste. I valori possono essere overridati nel filtro.
1139 # TAINT: OK
1140 autoreply:
1141 driver = autoreply
1142 to = ${sender_address}
1143 from = "${local_part}@${domain}"
1144 subject = "Autoreply from: ${local_part}@${domain}"
1145 text = ${if exists{VIRTUALS/autoreply/$domain_data/$local_part_data}{${readfile{VIRTUALS/autoreply/$domain_data/$local_part_data}{\n}}}{"This autoreply text should always be overridden"}}
1146 user = mail
1147 group = mail
1148 once = MAIL/$domain_data/${local_part_data}_autoreply.once
1149 once_file_size = 10k
1150 once_repeat = 1d
1151
1152
1153
1154
1155
1156 ######################################################################
1157 # RETRY CONFIGURATION #
1158 ######################################################################
1159
1160 begin retry
1161
1162
1163 # Regle di retry.
1164 # Se ho un errore 4xx (segno di una greylist) allora riprovo spesso
1165 # Se ho errori diversi, riprovo in modo meno insistente
1166
1167 # ATTENZIONE: perche` questi retry cosi` veloci (2 minuti) funzionino
1168 # occorre che Exim esegua il "queue run" spesso. Se lo fa solo ogni 30
1169 # minuti allora ovviamente la mail partira` ogni 30 minuti e non piu`
1170 # spesso.
1171
1172 # Domain Error Retries
1173 # ------ ----- -------
1174 * rcpt_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
1175 * mail_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
1176 * data_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
1177 * * F,2h,15m; F,23h,1h; G,3d,1h,1.1
1178
1179
1180
1181 ######################################################################
1182 # REWRITE CONFIGURATION #
1183 ######################################################################
1184
1185 # There are no rewriting specifications in this default configuration file.
1186 begin rewrite
1187
1188 ######################################################################
1189 # AUTHENTICATION CONFIGURATION #
1190 ######################################################################
1191
1192 begin authenticators
1193
1194
1195 ###
1196 ### Autenticazione su file di testo
1197 ###
1198
1199 #cram:
1200 # driver = cram_md5
1201 # public_name = CRAM-MD5
1202 # server_secret = ${lookup{$auth1}lsearch{EXIM4/passwd.smtp}{$value}fail}
1203 # server_set_id = $1
1204
1205
1206 #plain:
1207 # driver = plaintext
1208 # public_name = PLAIN
1209 # server_prompts = :
1210 # server_condition = "\
1211 # ${if and {{!eq{$2}{}}{!eq{$3}{}} \
1212 # {eq{$3}{${extract{1}{:} \
1213 # {${lookup{$2}lsearch{EXIM4/passwd.smtp}{$value}}}}}}}{1}{0}}"
1214 # server_set_id = $2
1215
1216 #login:
1217 # driver = plaintext
1218 # public_name = LOGIN
1219 # server_prompts = "Username:: : Password::"
1220 # server_condition = "\
1221 # ${if and {{!eq{$1}{}}{!eq{$2}{}} \
1222 # {eq{$2}{${extract{1}{:} \
1223 # {${lookup{$1}lsearch{EXIM4/passwd.smtp}{$value}}}}}}}{1}{0}}"
1224 # server_set_id = $1
1225
1226
1227 ###
1228 ### Autenticazione su Dovecot
1229 ###
1230
1231 # questo sistema richiede che Dovecot sia configurato per fornire autenticazione sul socket
1232 # definito qui in "server_socket" e che supporti tutti i metodi di autenticazione definiti
1233 # qui in alla voce "public_name".
1234
1235
1236 dovecot_cram:
1237 driver = dovecot
1238 public_name = CRAM-MD5
1239 server_socket = /var/run/dovecot/auth-client
1240 server_set_id = $auth1
1241
1242 dovecot_plain:
1243 driver = dovecot
1244 public_name = PLAIN
1245 server_socket = /var/run/dovecot/auth-client
1246 server_set_id = $auth1
1247
1248 dovecot_login:
1249 driver = dovecot
1250 public_name = LOGIN
1251 server_socket = /var/run/dovecot/auth-client
1252 server_set_id = $auth1
1253
1254 dovecot_ntlm:
1255 driver = dovecot
1256 public_name = NTLM
1257 server_socket = /var/run/dovecot/auth-client
1258 server_set_id = $auth1
1259
1260
1261
1262
1263 ######################################################################
1264 # CONFIGURATION FOR local_scan() #
1265 ######################################################################
1266
1267 # If you have built Exim to include a local_scan() function that contains
1268 # tables for private options, you can define those options here. Remember to
1269 # uncomment the "begin" line. It is commented by default because it provokes
1270 # an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
1271 # set in the Local/Makefile.
1272
1273 # begin local_scan
1274
1275 # End of Exim configuration file
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.