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