# Postfix

Postfix è un demone di posta SMTP (categorizzato comunemente come Mail Transfer Agent, o MTA) scritto inizialmente da Wietse Zweitze Venema e distribuito con licenza IBM Public License, attualmente riceve molteplici e svariati contributi dal mondo open source. Attualmente è compilabile ed eseguibile sui sistemi operativi AIX, BSD, HP-UX, IRIX, Linux, macOS, Solaris, Tru64 UNIX e in genere su tutti i sistemi operativi Unix-like dotati di un compilatore ANSI C, librerie di sviluppo compatibili POSIX e che abbia anche le librerie necessarie per gestire i socket BSD.
Nasce alla fine degli anni '90 con lo scopo di fornire un'alternativa a Sendmail che offrisse maggiori garanzie per quanto riguarda la sicurezza.
Fra i pregi di Postfix ci sono l'enorme tolleranza e capacità di contenimento riguardo ai buffer overflow ed è capace di gestire grandi quantità di messaggi di posta elettronica. Attualmente è presente nella quasi totalità delle distribuzioni Linux e scelto come MTA di default su molte di queste.
Dalla versione 2.3 offre il supporto per:
* Transport Layer Security (TLS);
* la possibilità di grey-list e il content filtering avanzato;
* supporto per vari database per le tabelle di configurazione e conversione: Berkeley DB, CDB, DBM, LDAP, MySQL e PostgreSQL;
* supporto per mailbox, maildir e domini virtuali;
* manipolazione degli indirizzi, VERP, autenticazione SASL e molto altro.
Postfix si struttura in diversi demoni che svolgono ognuno una sola funzione, ognuno dei quali eseguito con diritti minimi. Questo garantisce che qualsiasi bug o exploit che coinvolga uno dei "pezzi" di Postfix non comprometta l'intero sistema di delivery delle e-mail. Un solo processo deve avere diritti privilegiati, tutti gli altri hanno diritti minimi e spesso un file di configurazione proprio, pochi di questi ultimi hanno la capacità di scrivere sulle periferiche di memorizzazione di massa.

## Anatomia

Descrittivamente Postfix accetta messaggi in due modi:
* sorgente locale (Sendmail o altro eseguibile che inietta il messaggio sul pickup);
* la rete esterna alla macchina (che sia una rete Intranet o Internet).
Nel secondo caso si ha in ascolto sulla porta TCP 25 il demone smtpd, che si occupa di colloquiare con il mittente per definire come stabilire la trasmissione. Il demone ha alcuni file di configurazione che gli permettono di utilizzare fonti esterne per autorizzare la ricezione, fra cui le DNSBL e una access-list (basabile su IP, domini, autenticazione del mittente tramite nome utente e password). Se smtpd accetta l'e-mail passa al demone cleanup il messaggio, terminando il suo compito. cleanup si occupa di prendere in carico il messaggio e inserirlo nella coda di arrivo. Prima di tale operazione viene analizzato l'indirizzo e-mail del mittente e di destinazione ed eventualmente tradotto tramite virtual e canonical (operazione svolta dal demone rewrite), cioè vengono riscritti i campi FROM e TO (più correttamente RCPT) del messaggio. virtual è un derivato di local; il suo compito è quello di rintracciare tramite delle tabelle un indirizzo di posta elettronica e rimpiazzarlo con l'identificativo di un utente locale (esempio: riscrive il RCPT da utente@example.com a utente permettendo la preparazione al salvataggio dell'e-mail nella maildir/mailbox di "utente"). Questo avviene tendenzialmente alle e-mail in arrivo dall'esterno della macchina. canonical svolge la funzione inversa di virtual, modificando il campo FROM convertendo utente@localhost in utente@example.com, indirizzo a cui il resto del mondo potrà eventualmente rispondere.
La locazione di incoming serve come parcheggio temporaneo mentre la parte di assimilazione di Postfix finisce il proprio incarico. Ogni qualvolta viene alterato il contenuto di incoming viene segnalato al demone qmgr che è necessaria un'opera di smaltimento, il quale si prenderà carico dell'e-mail e proverà a passarla a chi di dovere per portarla alla destinazione finale; se si presentano problemi o difficoltà nello svolgere tale compito allora il messaggio viene posto in una differente coda chiamata deferred e rielaborata in seguito. qmgr controlla la coda "deferred" a intervalli regolari solo se la locazione non è vuota. qmgr verifica innanzitutto la disponibilità immediata della destinazione, utilizzando principalmente il relocated, ovvero un elenco di spostamenti della destinazione (nel caso si tratti di destinazione locale) con segnali interpretati come l'utente pippo@example.com è stato spostato su pluto@example.com. Se invece la destinazione è reale e raggiungibile allora "qmgr" si comporta in base ad alcune condizioni:
* transport tramite resolve stabilisce se l'utente è locale o se l'e-mail deve essere instradata altrove;
* se la destinazione è un utente locale allora viene passata a local;
* se la destinazione risiede su un altro server allora il messaggio viene inviato a pipe o smtp per l'invio alla macchina remota.
local è il demone che si occupa di scrivere fisicamente nella mailbox/maildir il messaggio. Per stabilire in modo univoco la reale destinazione si appoggia su una tabella chiamata alias che è un elenco di equivalenze che permettono di attribuire più indirizzi a un unico utente, oppure fa uso di forward che si occupa di inoltrare l'e-mail in una locazione diversa dalla mailbox/maildir propria dell'utente. smtp si comporta complementarmente a smtpd, però anziché ascoltare sulla porta 25 per l'eventuale arrivo di messaggi si fa carico di inoltrare l'e-mail verso il server di destinazione (o comunque definito come passo successivo per raggiungere poi la destinazione) alla porta 25.
UUCP è un protocollo un po' datato, che svolge le stesse funzioni di smtp però cercando all'altro capo della comunicazione un server in grado di colloquiare con lo stesso linguaggio.

## Configurazione di base

Esistono poi alcuni file di configurazione "globali" all'host (che sia reale o virtuale) in cui è installato il sistema Postfix, fra cui "main.cf". Di norma le impostazioni di default delle forme pacchettizate dalle varie distribuzioni Linux, nelle varie versioni di sistemi operativi BSD suddetto file presenta già parametri idonei a un uso casalingo o amatoriale, rimangono da specificare poche cose, fra cui:
Per ogni altra personalizzazione è raccomandabile usare un motore di ricerca per essere certi di utilizzare la guida più indicata per il sistema operativo in uso.