[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


206. Sendmail: introduzione

Sendmail è divenuto lo standard per quanto riguarda i programmi di gestione della posta elettronica in qualità di MTA. La sua adattabilità e la conseguente difficoltà nella definizione della sua configurazione, sono estreme.

Nel capitolo 104 si è già accennato al funzionamento di Sendmail. Questo capitolo espande un po' i concetti, ma si tratta sempre di informazioni limitate; il documento di riferimento per questo resta: Sendmail edito da O'Reilly.

206.1 Destinatari e formati degli indirizzi

Sendmail, per quanto riguarda la composizione degli indirizzi di posta elettronica, utilizza le convenzioni seguenti.

Per Sendmail, il destinatario di un messaggio di posta elettronica può essere anche un file o un programma. In pratica, se l'indirizzo utilizzato inizia con una barra verticale (`|'), si intende trattarsi di una pipeline, all'interno della quale deve essere inviato il messaggio; se invece l'indirizzo inizia con una barra obliqua normale (`/'), si intende trattarsi di un file, e in tal caso questo viene creato o gli viene aggiunto il testo del messaggio.

L'utilizzo di questi indirizzi speciali, riferiti a file o a pipeline, può essere fatto ovunque. Per esempio nel file `~/.forward' o come destinatario di un alias nel file `/etc/aliases'. Queste possibilità, tra le altre cose, sono alla base del funzionamento delle liste di posta elettronica (mailing-list).

206.2 Alias, inclusione e forward

All'interno di un sistema è possibile definire dei recapiti fittizi, definiti alias. La predisposizione di questi viene fatta nel file `/etc/aliases', e prima che questi abbinamenti siano recepiti da Sendmail, occorre rigenerare il file `/etc/aliases.db' con il comando `newaliases'. Attraverso gli alias è possibile:

L'esempio seguente fa in modo che i messaggi inviati all'utente fittizio `Tizio.Tizi' siano girati al nome dell'utente gestito effettivamente nel sistema.

Tizio.Tizi:	tizio

L'esempio seguente riguarda la situazione tipica in cui i messaggi indirizzati a un utente fittizio riferito a una competenza amministrativa vengono girati all'utente reale che svolge quel compito particolare.

postmaster:	daniele

L'esempio seguente mostra un alias per il quale i messaggi vengono rinviati (vengono fatti proseguire, o meglio, secondo la tradizione postale, vengono proseguiti) e duplicati per una serie di utenti che devono essere informati contemporaneamente.

abuse:		daniele, tizio, caio@roggen.brot.dg

L'esempio seguente mostra un alias per il quale tutti i messaggi vengono elaborati da un comando, che li riceve attraverso lo standard input. Questo è il modo tipico attraverso cui si inviano i messaggi a un programma di gestione di una lista di posta elettronica (mailing-list).

lista-pippo:	"| /home/liste/bin/ricezione-messaggi lista-pippo"

L'inclusione è un modo di definire un alias dinamico, riferito a un elenco di indirizzi contenuti in un file di testo normale. La forma

:include:<percorso-assoluto>

equivale a includere tutti gli indirizzi definiti nel file specificato, che deve comprendere necessariamente il percorso assoluto per raggiungerlo. Utilizzando questa forma di definizione degli elenchi di destinatari, si evita di dover modificare ogni volta il file `/etc/aliases', e soprattutto si evita di dover rieseguire il comando `newaliases'.

L'esempio seguente invia i messaggi destinati all'utente fittizio `lista-pippo-inv' a tutto l'elenco contenuto nel file `/home/liste/pippo/iscritti'.

lista-pippo-inv:	:include:/home/liste/pippo/iscritti

Il forward è la gestione di un alias personale (allo scopo di fare proseguire i messaggi verso altre destinazioni), che ogni utente può definire senza dover chiedere la modifica del file `/etc/aliases'. Si possono fare proseguire i messaggi generando il file di testo `~/.forward' che può contenere uno o più indirizzi differenti, comprese le pipeline, i file e le inclusioni. Il risultato che si ottiene è che i messaggi destinati all'utente che ha predisposto questo file nella propria directory personale, vengono rinviati a tutti gli indirizzi contenuti nel file stesso. Generalmente, per la sua natura, il file `~/.forward' viene usato dagli utenti che hanno diversi recapiti e vogliono concentrare la posta elettronica in un solo punto di destinazione. Per questo motivo, nel file `~/.forward' viene indicato quasi sempre un solo indirizzo di posta elettronica.

206.3 Configurazione di Sendmail con il pacchetto di Berkeley

Si è già accennato al fatto che la configurazione di Sendmail, attraverso la modifica diretta del file `/etc/sendmail.cf', sia un'impresa estrema. Fortunatamente, per alleviare queste difficoltà, si sono sviluppati nel tempo diversi programmi in grado di generare automaticamente il file `/etc/sendmail.cf' utilizzando dei segmenti di codice già pronto da combinare opportunamente assieme.

Attualmente, il tipo di configurazione più diffuso è quello predisposto dall'università di Berkeley. Si tratta di una serie di file macro per M4, un macro-compilatore concettualmente analogo al preprocessore del linguaggio C (si veda eventualmente il capitolo 187).

Il pacchetto viene installato da qualche parte, a seconda dell'organizzazione predisposta dalla propria distribuzione GNU/Linux, e probabilmente si tratta della directory `/usr/lib/sendmail-cf/'. Da quella directory, se ne diramano altre contenenti i diversi pezzi di configurazione che possono essere combinati assieme.

206.3.1 Introduzione al sistema

A partire dalla directory di origine del pacchetto di configurazione di Sendmail, si trovano in particolare i file readme che rappresentano tutta la documentazione disponibile, e una serie di directory contenenti a loro volta i file componenti del sistema di macro.

Quando si predispone un file di configurazione nella directory `cf/', la sua compilazione avviene nel modo seguente:

m4 ../m4/cf.m4 <file-di-configurazione> > `file-risultato'

Per esempio, supponendo di avere realizzato il file di configurazione `cf/prova.mc', e di voler generare il file `cf/prova.cf', si procede come segue:

cd /usr/lib/sendmail-cf[Invio]

In questo modo ci si posiziona nella directory principale del pacchetto di configurazione.

cd cf[Invio]

Prima di iniziare la compilazione occorre posizionarsi nella directory contenente il file di configurazione.

m4 ../m4/cf.m4 prova.mc > prova.cf[Invio]

A questo punto il file `cf/prova.cf' è stato generato, ed è sufficiente cambiargli nome e sostituirlo al posto del vecchio `/etc/sendmail.cf'.

Naturalmente, perché Sendmail prenda atto della nuova configurazione, deve essere riavviato (dovrebbe bastare l'invio di un segnale di aggancio, `SIGHUP').

206.3.2 Struttura e contenuto del file di configurazione

Il file di configurazione inizia generalmente con delle annotazioni, che possono riguardare il copyright o lo scopo del file. Osservando i file già esistenti si potrebbe pensare che il simbolo `#' rappresenti l'inizio di un commento; in realtà si tratta di un commento per il file `.cf' che si vuole generare, e all'interno del sistema di macro di M4 è stato ridefinito opportunamente il simbolo di commento in modo che `#' venga trattato come un carattere qualunque senza significati particolari. Questo significa che le espansioni hanno luogo anche all'interno dei commenti per il file `/etc/sendmail.cf'.

Il modo adottato comunemente per eliminare le intestazioni contenenti le informazioni sul copyright e le riserve all'uso dei vari file, è quello di dirigere l'output in modo da perderlo, attraverso la macro `divert(-1)'.

In teorica, l'aspetto normale di un file di configurazione per questo pacchetto dovrebbe essere il seguente:

divert(-1)
#
# Copyright (c) 1983 Eric P. Allman
# Copyright (c) 1988, 1993
#	The Regents of the University of California.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without...
# ...
divert(0)dnl
include(`../m4/cf.m4')
VERSIONID(`@(#)generic-linux.mc	8.3 (Berkeley) 3/23/96')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl

In pratica, questo potrebbe generare un file `.cf' insufficiente al funzionamento corretto di Sendmail.

Si può osservare all'inizio l'inclusione del file `m4/cf.m4' che è il responsabile dell'impostazione di questo sistema di macro.

Quasi tutte le macro specifiche che si utilizzano in questo file (quelle che appaiono in lettere maiuscole), rappresentano in realtà l'inclusione di un file, quello che appare come parametro, proveniente dalla directory corrispondente al nome della macro stessa. Per esempio, `OSTYPE(linux)' rappresenta in pratica l'inclusione del file `ostype/linux.m4'. Nelle sezioni seguenti vengono descritte brevemente alcune di queste macro specifiche.

206.3.2.1 Macro VERSIONID

VERSIONID(<descrizione-della-versione>)

La macro `VERSIONID' permette semplicemente di includere un'annotazione sulla versione della configurazione, nei commenti del file `.cf' generato. È utile per documentare diversi tipi di configurazione, e la forma per definire la versione non è prestabilita.

206.3.2.2 Macro OSTYPE

OSTYPE(<macro-da-includere>)

Attraverso la macro `OSTYPE' si può definire il nome del sistema operativo utilizzato. In pratica, si tratta di indicare il nome (senza estensione) di un file macro contenuto nella directory `ostype/', da includere in quel punto.

Attraverso l'inclusione di questo file, si ottiene la definizione di alcune informazioni importanti riguardo all'installazione di Sendmail nel proprio sistema operativo; per esempio si può definire la collocazione del file contenente gli alias, il programma da usare per la consegna dei messaggi, le opzioni e gli argomenti che questo programma deve avere. Tutte queste informazioni vengono specificate attraverso la definizione di macro specifiche, come se si trattasse della definizione di variabili; Se queste macro non vengono definite in questa occasione, verranno definite in un altro momento, ricevendo un valore predefinito, come documentato regolarmente nei file che accompagnano il pacchetto di configurazione.

L'esempio più semplice possibile del file `ostype/linux.m4' è il seguente,

divert(-1)
#
# ...

divert(0)
define(`LOCAL_MAILER_PATH', /bin/mail)dnl

dove si definisce soltanto che il programma di consegna dei messaggi è `/bin/mail'. In pratica però, normalmente, questo file viene modificato opportunamente da chi allestisce il pacchetto di configurazione per una particolare distribuzione GNU/Linux.

La possibilità che questo file non sia conforme alla distribuzione standard del pacchetto di configurazione di Sendmail, deve essere tenuto in considerazione quando si vuole provare a generare un file `.cf' differente dal `/etc/sendmail.cf' già predisposto dalla propria distribuzione. Infatti, le modifiche che potrebbero essere state apportate possono pregiudicare l'effetto prevedibile delle altre macro.

206.3.2.3 Macro DOMAINS

DOMAINS(<macro-da-includere>)

Attraverso la macro `DOMAINS' si può definire il nome di una configurazione riferita a un dominio particolare. Si ottiene in pratica l'inclusione di un file contenuto nella directory `domains/'.

Il pacchetto di configurazione fornisce in particolare il file `domains/generic.m4', che dovrebbe adattarsi a tutte le situazioni normali. Spesso, questo non viene utilizzato, inserendo direttamente quello che serve nel file di configurazione normale.

Quello che segue è un estratto dal file `domains/generic.m4'.

divert(-1)
#
# ...

divert(0)
VERSIONID(`@(#)generic.m4	8.3 (Berkeley) 3/24/96')
define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl
FEATURE(redirect)dnl
FEATURE(use_cw_file)dnl

206.3.2.4 Macro MAILERS

MAILERS(<macro-da-includere>)

Attraverso la macro `MAILERS' si può definire il nome di una configurazione riferita a un tipo particolare di sistema di invio dei messaggi. Si ottiene in pratica l'inclusione di un file contenuto nella directory `mailers/'.

Normalmente, questa macro viene utilizzata più volte all'interno del file di configurazione, per definire diverse possibilità. Tipicamente si tratta di:

MAILER(local)

che si occupa della gestione dei messaggi all'interno del sistema e viene utilizzato in modo predefinito;

MAILER(smtp)

che si occupa di configurare la gestione dei messaggi attraverso il protocollo SMTP, cioè riguarda la configurazione necessaria all'invio dei messaggi al di fuori del sistema.

Nel primo caso si ha l'inclusione del file `mailers/local.m4', nel secondo di `mailers/smtp.m4'

Dalla macro `MAILER(smtp)' dipende la base del sistema di sicurezza contro gli utilizzi indesiderati del proprio servente SMTP. Infatti, è qui che vengono definite le istruzioni necessarie nel file `.cf' per impedire l'utilizzo da parte di nodi che non facciano parte della zona DNS di competenza. Cioè, quello che si vuole evitare è che un nodo diverso da quelli definiti nella zona per cui è stato previsto un record `MX', possa utilizzare il servente SMTP per raggiungere indirizzi al di fuori del sistema locale (si veda eventualmente quanto discusso nel capitolo precedente).

206.3.2.5 Macro FEATURE

FEATURE(<macro-da-includere>)

Attraverso la macro `FEATURE' si può definire il nome di una configurazione riferita a una particolarità che si vuole includere. Si ottiene in pratica l'inclusione di un file contenuto nella directory `feature/'.

Normalmente, questa macro viene utilizzata più volte all'interno del file di configurazione, e questo preferibilmente prima di `MAILER'.

206.3.2.6 HACK

HACK(<macro-da-includere>)

Attraverso la macro `HACK' si può definire il nome di una configurazione riferita a una particolarità sperimentale che si vuole includere. Si ottiene in pratica l'inclusione di un file contenuto nella directory `hack/'.

Teoricamente, questa macro non dovrebbe essere utilizzata; in pratica succede spesso il contrario a causa delle esigenze di definire dei filtri aggiuntivi contro gli accessi indesiderati.

206.3.3 Esempio di una distribuzione GNU/Linux

A titolo di esempio, viene presentata la configurazione utilizzata dalla distribuzione Red Hat (5.0), e si tratta precisamente del file `cf/redhat.mc'.

divert(-1)
include(`../m4/cf.m4')
define(`confDEF_USER_ID',``8:12'')
OSTYPE(`linux')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(procmail)
MAILER(smtp)
HACK(check_mail3,`hash -a@JUNK /etc/mail/deny')
HACK(use_ip,`/etc/mail/ip_allow')
HACK(use_names,`/etc/mail/name_allow')
HACK(use_relayto,`/etc/mail/relay_allow')
HACK(check_rcpt4)
HACK(check_relay3)

La prima cosa che si osserva è che il file inizia con la macro `divert(-1)', senza commenti da eliminare e senza il consueto `divert(0)' successivo. In questo modo, dal momento che nessuna delle macro utilizzate dopo deve restituire qualcosa, si evita di terminare le varie macro con il solito `dnl'.

Per sicurezza, nel caso servisse, vengono cancellate le macro `UUCP_RELAY' e `BITNET_RELAY'.

Invece di utilizzare una macro `DOMAIN' vengono incluse direttamente le particolarità attraverso l'uso della macro `FEATURE'. In particolare viene definito quanto segue.

Le macro `HACK' inserite alla fine, sono state aggiunte per permettere una migliore gestione dei filtri di accesso al servizio di invio dei messaggi, comprendendo in questo anche la definizione di nodi per i quali il proprio servente SMTP può agire come relay.

Per la precisione, è consentito l'uso dei file descritti nelle sezioni seguenti.

206.3.3.1 /etc/mail/ip_allow

Si tratta di un file di testo contenente un elenco di indirizzi IP (uno per riga) riferiti a nodi particolari o a intere reti. A questi elaboratori viene consentito di utilizzare il servente SMTP come relay. Per esempio,

192.168.1.2
192.168.2

permette l'accesso al nodo 192.168.1.2 e a tutta la rete 192.168.2.

Questo file, al di fuori della configurazione particolare della distribuzione Red Hat, potrebbe chiamarsi `/etc/mail/LocalIP'.

206.3.3.2 /etc/mail/name_allow

Si tratta di un file di testo contenente un elenco di nomi di dominio (uno per riga) riferiti a nodi particolari o a tutti i nodi di un dominio particolare. A questi elaboratori viene consentito di utilizzare il servente SMTP come relay. Per esempio,

roggen.brot.dg
mehl.dg

permette l'accesso al nodo `roggen.brot.dg' e a tutto il dominio `mehl.dg'.

Questo file, al di fuori della configurazione particolare della distribuzione Red Hat, potrebbe chiamarsi `/etc/mail/LocalNames'.

206.3.3.3 /etc/mail/relay_allow

Si tratta di un file di testo contenente un elenco di indirizzi IP o di nomi di dominio (uno per riga) riferiti a nodi particolari o a tutti i nodi di una rete particolare o di un dominio. Questi indirizzi sono ammessi come destinatari di messaggi quando il servente SMTP viene utilizzato come relay. Per esempio,

192.168
roggen.brot.dg
mehl.dg

permette di inviare messaggi alla rete 192.168, al nodo `roggen.brot.dg' e a tutto il dominio `mehl.dg', quando il servente SMTP funziona come relay.

Questo file, al di fuori della configurazione particolare della distribuzione Red Hat, potrebbe chiamarsi `/etc/mail/RelayTo'.

206.3.3.4 /etc/mail/deny

Il file di testo `/etc/mail/deny' viene utilizzato per annotare un elenco di indirizzi di posta elettronica, nomi di dominio e indirizzi IP di mittenti indesiderati. A fianco di ogni indirizzo, separato da un carattere di tabulazione (<HT>), si indica il messaggio di errore che si vuole sia restituito all'MTA che ha contattato il servente per l'inoltro del messaggio.

Segue un esempio molto semplice di questo file.

spam@marameo.dg	"Spiacente sig. Spam, non accettiamo messaggi da Lei."
spam.brot.dg	"Dal Vostro host non accettiamo email."
spammer.dg	"Non vogliamo spam, grazie."
192.168.13.13	"Dal Vostro host non accettiamo email."
192.168.17	"Non vogliamo spam, grazie."

Questo file non può essere usato così com'è; occorre generare un file adatto a Sendmail. Si utilizza in pratica il comando seguente:

makemap -v hash /etc/mail/deny < /etc/mail/deny

Quello che si ottiene è il file `/etc/mail/deny.db'.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]