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.
  • [get | view] (2023-08-14 10:54:33, 53.0 KB) [[attachment:exim4.conf.v494.txt]]
  • [get | view] (2024-12-01 17:26:30, 56.1 KB) [[attachment:exim4.conf.v496.txt]]
  • [get | view] (2018-07-30 19:28:41, 6.9 KB) [[attachment:sa-stats.pl]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.