L'uso di questo sito
autorizza anche l'uso dei cookie
necessari al suo funzionamento.
(Altre informazioni)

Tuesday, May 20, 2014

Sendmail e procmail mailer per il filtraggio della posta in uscita

Ok, questa è più o meno la ricetta 6.8 dal sendmail cookbook, annotata. Però contiene anche la parte di procmail, è testata e funziona - e farlo senza guida richiede una giornata e giù di lì, quindi... enjoy.

Sommario

  • Creare la configurazione di sendmail per utilizzare mailertable e il mailer procmail, come segue.
/etc/mail/sendmail.mc
dnl Enable support for the mailertable
FEATURE(`mailertable')
dnl Add procmail to the list of available mailers
MAILER(procmail)
  • Inserire regole locali per permettere il reinvio di posta senza loop (attenzione al TAB tra '>' e '$')
/etc/mail/sendmail.mc
LOCAL_CONFIG
# Add .PROCMAIL to the pseudo-domain list
CP.PROCMAIL
LOCAL_RULE_0
# Strip .PROCMAIL and send via esmtp
R$+ < @ $+ .PROCMAIL . >        $#esmtp $@ $2 $: $1<@$2>
  • Usare mailertable per inviare la posta di domini specifici (o tutti i domini) al mailer procmail (l'ultima linea si applica a tutta la posta):
/etc/mail/mailertable
example.com       procmail:/etc/mail/procmailrcs/spam-filter
wrotethebook.net  procmail:/etc/mail/procmailrcs/spam-filter
fake.ora.com      procmail:/etc/mail/procmailrcs/uce-filter
.                 procmail:/etc/mail/procmailrcs/any.rc
  • Nel direttorio /etc/mail/procmailrcs creare i file per filtrare la posta, ricordandosi di estendere gli indirizzi dei destinatari finali con lo pseudodominio .PROCMAIL

Discussione ed esempi

Il mailer procmail e mailertable

La macro MAILER(procmail) aggiunge la definizione del procmail mailer. Questo è completamente separato ed indipendente dalla feature local_procmail (che si può usare per filtrare la posta in ingresso)
La macro MAILER(procmail) non aggiunge codice alla configurazione, e per usare il mailer stesso bisogna usare mailertable o aggiungere regole a sendmail.cf
/etc/mail/mailertable
example.com       procmail:/etc/mail/procmailrcs/spam-filter
.                 procmail:/etc/mail/procmailrcs/any.rc
Delle 2 regole nell' esempio qui sopra, la prima passa lapost diretta ad example.com alle regole contenuti in spam-filter, la seconda passa tutta l'altra posta alle regole in any.rc.

# sendmail -bv crooks@example.com
crooks@example.com... deliverable: mailer procmail, host /etc/mail/procmailrcs/spam-filter, user crooks@example.com
# sendmail -bv spammers@wrotethebook.net
spammers@wrotethebook.net... deliverable: mailer procmail, host /etc/mail/procmailrcs/any.rc, user spammers@wrotethebook.net

sendmail chiama procmail dal mailer mailer nel modo seguente

procmail -Y -m $h $f $u

Il flag -Y selezione il formato Berkeley Unix mailbox; il flag -m invoca procmail come un filtro di posta di uso generale. $h contiene il path del file di regole, $f è il valore dell'envelope sender (mittente) del messaggio, $u quello dell'envelope recipient (destinatario) del messaggio: nel file rc essi possono essere referenziati come le variabili $1 e $2.

Regole locali

Se l'intento è tornare ad inviare la posta dopo il filtraggio, bisogna proteggersi dai loop che si possono provocare rientrando nel mailer procmail inavvertitamente; per fare ciò, aggiungiamo lo pseudodominio .PROCMAIL all'indirizzo del destinatario utilizzando le regole di procmail: in questo modo il messaggio no sarà mai selezionato tra quelli di mailertable. Ecco le regole da aggiungere in fondo a /etc/mail/sendmail.mc (attenzione al TAB tra '>' e '$'):
/etc/mail/sendmail.mc

LOCAL_CONFIG
# Add .PROCMAIL to the pseudo-domain list
CP.PROCMAIL
LOCAL_RULE_0
# Strip .PROCMAIL and send via esmtp
R$+ < @ $+ .PROCMAIL . >        $#esmtp $@ $2 $: $1<@$2>

  • La macro LOCAL_CONFIG delimita una sezione che sarà aggiunta a sendmail.cf verbatim;
  • CP.PROMAIL inserisce .PROCMAIL nell classe P degli pseudodomini che sendmail non cercherà di risolvere via DNS.
  • La macro LOCAL_RULE_0 dà inizio alla sezione di codice da aggiungere al ruleset 0—more - anche detto il parse ruleset; questo codice farà parte del ParseLocal ruleset (anche detto ruleset 98). L'intento del parse ruleset è risolvere l'indirizzo di consegna nella tripla di consegna della posta.
  • Il comando R riconosce indirizzi della forma user@domain.PROCMAIL, riscrivendoli in una tripla con mailer “esmtp”, host uguale a “domain” e destinatario “user@domain”. Dopo aver rigenerato la configurazione, si dovrà vedere:

# sendmail -bv crooks@example.com.PROCMAIL
crooks@example.com.PROCMAIL... deliverable: mailer esmtp, host example.com, user 
crooks@example.com

Regole di procmail


Passiamo ora ad un esempio completo. Lo scopo (discutibile) è la creazione di un'isanza di sendmail che inoltri tutti i messaggi che transitano per la macchina a indirizzi terzi.
  • Il file /etc/mail/sendmail.mc è come sopra
  • Mailertable:
/etc/mail/mailertable
.                 procmail:/etc/mail/procmailrcs/any.rc
il direttorio /etc/mail/procmailrcs ha diritti 755, proprietario root.root; i file in esso contenuti, 644, root.root
  • Utilizziamo regole a carattere generale per organizzare l'ambiente.
/etc/mail/promailrcs/000_setup

# Per debugging (usare =no e =no per spegnerle)
VERBOSE=on
LOGABSTRACT=all
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
LOGFILE=/var/log/proc_log   #recommended
#per non confondersi
OSENDER=$1
ORECIPIENT=$2
#Viene scritta nel logfile alla fine.
TRAP="echo '---------- End of procmailer ------' "
#
# Controllo antiloop: usiamo cintura e bretelle - di qui non si dovrebbe passare mai
:0 w
* 1^0 ^X-Our-Anti-Loop: SET
! -f $OSENDER $ORECIPIENT.PROCMAIL
000_setup dev'essere incluso prima di iniziare la manipolazione della posta. Setta alcune direttive standard, assegna le variabili $1 e $2 ad altre due variabili più mnemonice (OSENDER, ORECIPIENT) e controlla l'esistenza di un header che viene settato anche all'uscita - terminando in questo caso il processing replicando quello che avrebbe dovuto fare la regola finale, che nel file 999_end:
/etc/mail/promailrcs/999_end
#
# Controllo antiloop
:0 w
| (formail \
  -A"X-Our-Anti-Loop: SET" \
  ) | $SENDMAIL -oi -f $OSENDER $ORECIPIENT.PROCMAIL
inoltra il messaggio al destinatario finale, dopo aver concatenato lo pseudo dominio .PROCMAIL per attivare le regole inserite poco sopra in sendmail.cf.
  • In any.rc si includono all'inizio e alla fine i file di cui sopra: tra i due si effettua l'inoltro in copia:
/etc/mail/promailrcs/any.rc

# Setup generale
INCLUDERC=/etc/mail/procmailrcs/000_setup
#
#flag 'c' creates a carbon copy for processing
#Evita i duplicati per indirizzi multipli
:0 Whc
| formail -D 16384 /tmp/idcache
#
#flag 'c' creates a carbon copy for processing
#flag 'e' executes only if previous command failed.
#espiones must contain addresses that are either local or .PROCMAIL terminated
:0 ec
| (formail -A"X-Our-Processed: SET" ) | $SENDMAIL -oi -f $OSENDER espiones
#clean up and forward
INCLUDERC=/etc/mail/procmailrcs/999_end
Il file 000_setup (q.v.) sistema l'ambiente; la seconda regola controlla che l'ID del messaggio corrente non sia in un file di cache (e lo aggiunge se manca). Questo server ad evitare di inviare agli “espiones” tante copie del messaggio quanti sono i destinatari (nel from:, o nel cc: o nel bcc:). Infine viene aggiunto un header che consenta l'identificazione di questo passaggio (a fini di debug).
  • I messaggi saranno inviati in copia ad un alias; gli indirizzi non locali vanno essi stessi protetti:
/etc/aliases
      espiones: foo@bar.com.PROCMAIL, baz@sna.fu.PROCMAIL, snafu
L'unico alias non protetto dall'estensione .PROCMAIL è snafu, che viene riconosciuto come locale e quindi non attiva mailertable. 

No comments: