qmail: un server di posta con la q minuscola

di Marco Biagiotti

Installazione, personalizzazione e configurazione di un completo server di posta in un sistema Linux

qmail: un server di posta con la q minuscola

qmail (con la "q" minuscola!) è un Internet Mail Transfer Agent (MTA) per sistemi Unix (Linux, Hp-ux, SCO, *BSD) nato come sostituto sicuro di sendmail per opera del professore di matematica (ora all'Università dell'Illinois a Chicago) Dan J. Bernstein (DJB, cr.yp.to) rinomato esperto di IT, famoso anche per i suoi studi sulla crittografia e sui SYN Flood.
DJB ha creato questo programma basato principalmente sul Simple Mail Transfer Protocol (SMTP) con gli obiettivi di sicurezza, performance, affidabilità e snellezza che non erano contemplati nel diffuso sendmail.
I molteplici bug che hanno da sempre caratterizzato quest'ultimo, software nato con gli albori di Internet quando ancora la sicurezza non era un aspetto tenuto in particolare considerazione da parte dei programmatori, ha spinto DJB ad elaborare un programma così solido da essere oggetto di un concorso: chiunque avesse trovato un bug in qmail sarebbe stato ricompensato da DJB con $1000; dal 15 giugno 1998, data del rilascio della versione 1.03 di qmail, questa somma è ancora nelle tasche del professore!
Forse anche a causa di questo concorso, qmail è coperto da copyright e non è distribuito con una dichiarazione dei diritti dell'utente (cr.yp.to) anche se è permessa la distribuzione dei sorgenti.
In sostanza qmail può essere utilizzato per qualsiasi scopo ed i suoi sorgenti possono essere distribuiti così come sono e quindi senza modifiche se non attraverso patch: è per questo motivo che è sempre opportuno ricompilarlo; in definitiva si tratta di un classico esempio di software opensource ma non GPL.
E' doveroso sottolineare come il fatto che l'ultima versione di qmail risalga al 1998 non significhi che il programma sia superato (prevedendo una forte modularità, può essere implementato nelle funzionalità in vario modo), ma che l'elevato livello di sicurezza non rende necessari interventi correttivi.
Affidarsi a qmail nella realizzazione di un server di posta elettronica consente di ottenere enormi vantaggi in termini di sicurezza (basta pensare che, a differenza di sendmail, non necessita dei privilegi di root), di performance (grazie alla consegna parallela dei messaggi), affidabilità (una volta accettato il messaggio non può andare perduto) e modularità (qmail è piccolo e snello ma puo' essere potenziato attraverso programmi accessori); per maggiori informazioni sulle funzionalità e sui vantaggi non può esserci di meglio del sito cr.yp.to.
Tali importanti caratteristiche hanno fatto si' che qmail, dall'ottobre 2001 sia il secondo server SMTP in termini di diffusione ed il primo in quanto a velocita' di crescita.
In base alla classica filosofia del mondo Unix, qmail ha una singola e ben definita funzione mentre tutte le funzioni complesse ed accessorie sono espletate da altri tool tra i quali assumono particolare importanza:
- ucspi-tcp: un veloce demone che sostituisce inetd e xinetd e che consente il rifiuto di email attraverso l'utilizzo di siti RBL;
- daemontools: tools per la gestione avanzata dei demoni e dei loro log;
- checkpassword: tool per l'autenticazione POP3.

qmail
www.qmail.org: qmail a 360 gradi


qmail & friends su Linux
Nel proseguo dell'articolo è presentata l'installazione e la configurazione di qmail e di alcune sue patch ed estensioni in un sistema Linux (le differenze per sistemi BSD non dovrebbero essere particolarmente notevoli).
Il primo passo da compiere per realizzare un servizio mail all'interno di un server Linux consiste, evidentemente, nel reperimento dei sorgenti di qmail e di altri utili software che ne implementano il funzionamento attraverso il sito dedicato www.qmail.org e relativi link ad altri siti ivi presenti.
In particolare sono necessari i sorgenti e relative patch di seguito riportati:

qmail
- qmail-1.03.tar.gz: il file contente i sorgenti di qmail (cr.yp.to);
- qmail-1.03-toaster-2.7.+
patch: una digest patch che ne raccoglie altre di notevole importanza (smtp-auth, TLS, qmail-queue, mfcheck, oversize dns, Tarpit, qregex, Big Concurrency, qmail-maildir++; maggiori informazioni sulle singole patch sono disponibili nella patch stessa) disponibile al seguente indirizzo www.tnpi.biz;
- qmail-1.03.errno.patch: patch necessaria per la compilazione di qmail con le ultime versioni di glibc (moni.csi.hu).

ucspi-tcp
- ucspi-tcp-0.88.tar.gz: il file contenente i sorgenti di uscpi-tcp (cr.yp.to);
- ucspi-tcp-0.88.errno.+
patch: patch necessaria per la compilazione di ucspi-tcp con le ultime versioni di glibc (moni.csi.hu).

daemontools
- daemontools-0.76.tar.gz: il file contenente i sorgenti di daemontools (cr.yp.to);
- daemontools-0.76.errno.+
patch: patch necessaria per la compilazione di daemontools con le ultime versioni di glibc (moni.csi.hu).

* checkpassword
- checkpassword-0.90.tar.gz: il file contenente i sorgenti di checkpassword (cr.yp.to);
- checkpassword-0.90.errno.+
patch: patch necessaria per la compilazione di checkpassword con le ultime versioni di glibc (moni.csi.hu).


Prima di procedere alla configurazione dei sorgenti di qmail e dei software "accessori" occorre spostare e decomprimere i file scaricati:

# umask 022
# mkdir /package
# mv qmail-1.03.tar.gz /var/tmp/
# mv qmail-1.03-toaster-2.7.+
patch /var/tmp/
# mv qmail-1.03.errno.patch /var/tmp/
# mv ucspi-tcp-0.88.tar.gz /var/tmp/
# mv ucspi-tcp-0.88.errno.patch /var/tmp/
# mv daemontools-0.76.tar.gz /package/
# mv daemontools-0.76.errno.+
patch /package/
# mv checkpassword-0.90.tar.gz /var/tmp/
# mv checkpassword-0.90.errno.+
patch /var/tmp/
# chmod 1755 /package/
# cd /var/tmp/
# tar xzvpf qmail-1.03.tar.gz
# tar xzvpf ucspi-tcp-0.88.tar.gz
# tar xzvpf checkpassword-0.90.tar.gz +

# cd /package/
# tar xzvpf daemontools-0.76.tar.gz
# cd /home/admin/
# cd /var/tmp/
# mv qmail-1.03-toaster-2.7.+
patch qmail-1.03
# cp qmail-1.03.errno.patch qmail-1.03
# cd qmail-1.03
# mkdir /var/qmail


qmail per poter funzionare correttamente ha bisogno di utenti e gruppi dedicati; per creare i corretti utenti e gruppi si consiglia di agire manualmente sui file "/etc/passwd" ed "/etc/group" ed inserire le seguenti linee:

- /etc/passwd
alias:*:7790:2108::/var/+
qmail/alias:/bin/true
qmaild:*:7791:2108::/var/+
qmail:/bin/true
qmaill:*:7792:2108::/var/+
qmail:/bin/true
qmailp:*:7793:2108::/var/+
qmail:/bin/true
qmailq:*:7794:2107::/var/+
qmail:/bin/true
qmailr:*:7795:2107::/var/+
qmail:/bin/true
qmails:*:7796:2107::/var/+
qmail:/bin/true

- /etc/group
qmail:*:2107:
qnofiles:*:2108:

Eseguite le precedenti modifiche è opportuno impostare lo stato di immutabilita' per i file relativi agli utenti ed ai gruppi di sistema:

# chattr +i /etc/passwd
# chattr +i /etc/shadow
# chattr +i /etc/group
# chattr +i /etc/gshadow

Configurazione dei sorgenti, compilazione ed installazione
Giunti a questo punto occorre applicare le varie patch precedentemente analizzate, modificare alcuni file per permettere la corretta impostazione della compilazione e procedere alla compilazione di qmail e dei vari "software" accessori.

qmail

# cd qmail-1.03
# patch -p0 < qmail-1.03-toaster-2.7.+
patch
# patch -p1 < qmail-1.03.errno.patch

# more conf-cc
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -DTLS -I/usr/include/openssl -I/usr/kerberos/include

This will be used to compile .c files.

# more conf-ld
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -s

This will be used to link .o files into an executable.

Adesso è il momento di compiere la configurazione dei sorgenti vera e propria:

# make setup check
# ./config
Your hostname is dominio.
soft error
Sorry, I couldn't find your host's canonical name in DNS.
You will have to set up control/me yourself.

Nel caso in cui sia riscontrato tale problema si consiglia di utilizzare il comando "config-fast" cosi' come segue:

# ./config-fast mail.dominio.it
Your fully qualified host name is mail.dominio.it.
Putting mail.dominio.it into control/me...
Putting dominio.it into control/defaultdomain...
Putting dominio.it into control/plusdomain...
Putting mail.dominio.it into control/locals...
Putting mail.dominio.it into control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to mail.dominio.it.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!


ucspi-tcp

Anche per l'importante strumento ucspi-tcp è fondamentale apportare alcune modifiche ai sorgenti:

# cd /var/tmp
# cp ucspi-tcp-0.88.errno.patch ucspi-tcp-0.88
# cd ucspi-tcp-0.88
# patch -p0 < ucspi-tcp-0.88.errno.+
patch

# more conf-cc
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer

This will be used to compile .c files.

# more conf-ld
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -s

This will be used to link .o files into an executable.

A seguito di tali modifiche occorre procedere alla compilazione ed all'installazione:
# make
# make setup check


daemontools

Analoghe modifiche iniziali ai sorgenti sono indispensabili anche per daemontools:

# cd /package/admin/+
daemontools-0.76/
# cp /package/daemontools-0.76.+
errno.patch ./
# patch -p1 < daemontools-0.76.errno.+
patch

# more src/conf-cc
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings

This will be used to compile .c files.

# more src/conf-ld
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -s

This will be used to link .o files into an executable.

Non appena eseguite le succitate modifiche è possibile procedere all'installazione:

# chattr -i /etc/inittab
# ./package/install
# chattr +i /etc/inittab


checkpassword

Analoghe modifiche iniziali ai sorgenti sono indispensabili anche per checkpassword:

# cd /var/tmp
# cp checkpassword-0.90.errno.+
patch checkpassword-0.90
# cd checkpassword-0.90
# patch -p0 < checkpassword-0.90.errno.+
patch

# more conf-cc
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer

This will be used to compile .c files.

# more conf-ld
gcc -O3 -march=i686 -mcpu=i686 -funroll-loops -fomit-frame-pointer -s

This will be used to link .o files into an executable.

E' possibile adesso procedere alla compilazione ed all'installazione:
# make
# make setup check


Configurazione del servizio

A questo punto il software necessario è installato ed è il momento di procedere alla corretta configurazione del servizio (gran parte degli script che seguono sono tratti dall'ottima e completa guida "Life with qmail" disponibile all'indirizzo www.lifewithqmail.org).

Per prima cosa occorre creare le directory necessarie ad ospitare i file di configurazione e di log:

# mkdir -p /var/log/qmail/bin
# mkdir -p /var/log/qmail/smtpd
# mkdir -p /var/log/qmail/pop3d
# mkdir -p /var/qmail/supervise/+
qmail-smtpd/log
# mkdir -p /var/qmail/supervise/+
qmail-pop3d/log
# mkdir -p /var/qmail/supervise/+
qmail-send/log

In secondo luogo è necessario creare i file che servono a configurare correttamente il servizio di posta seguendo gli esempi di seguito proposti:

/var/qmail/rc
#!/bin/sh

# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/+
defaultdelivery`"

/var/qmail/bin/qmailctl
#!/bin/sh

# For Red Hat chkconfig
# chkconfig: - 80 30
# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/+
usr/bin:/usr/local/bin:/+
usr/local/sbin
export PATH

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
start)
echo "Starting qmail"
if svok /service/qmail-send ; then
svc -u /service/qmail-send
else
echo qmail-send supervise not running
fi
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd
else
echo qmail-smtpd supervise not running
fi
if svok /service/qmail-pop3d ; then
svc -u /service/qmail-pop3d
else
echo qmail-pop3d supervise not running
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
echo " qmail-smtpd"
svc -d /service/qmail-smtpd
echo " qmail-send"
svc -d /service/qmail-send
echo " qmail-pop3d"
svc -d /service/qmail-pop3d
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
svstat /service/qmail-pop3d
svstat /service/qmail-pop3d/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/+
qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /service/qmail-send
echo "Pausing qmail-smtpd"
svc -p /service/qmail-smtpd
echo "Pausing qmail-pop3d"
svc -p /service/qmail-pop3d
;;
cont)
echo "Continuing qmail-send"
svc -c /service/qmail-send
echo "Continuing qmail-smtpd"
svc -c /service/qmail-smtpd
echo "Continuing qmail-pop3d"
svc -c /service/qmail-pop3d
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /service/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /service/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /service/qmail-smtpd
echo "* Restarting qmail-pop3d."
svc -t /service/qmail-pop3d
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp.cdb
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat < stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue+
|flush|reload|stat|pause|co+
nt|cdb|queue|help}"
exit 1
;;
esac

exit 0

/var/qmail/supervise/+
qmail-send/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

/var/qmail/supervise/+
qmail-send/run
#!/bin/sh
exec /var/qmail/rc

/var/qmail/supervise/+
qmail-smtpd/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

/var/qmail/supervise/+
qmail-smtpd/run
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/+
concurrencyincoming`
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" ]; then
echo QMAILDUID, NOFILESGID, or MAXSMTPD is unset in
echo /var/qmail/supervise/+
qmail-smtpd/run
exit 1
fi
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -H -P -R -l 0 -x /etc/tcp.smtp.cdb \
-c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /usr/local/bin/rblsmtpd \
-r relays.ordb.org /var/qmail/bin/qmail-smtpd 2>&1

/var/qmail/supervise/+
qmail-pop3d/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
/var/log/qmail/pop3d

/var/qmail/supervise/+
qmail-pop3d/run
#!/bin/sh
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \
mail.dominio.it /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d \
Maildir 2>&1


Terminata la creazione di tali file occorre impostarne i corretti privilegi:

# chmod 755 /var/qmail/rc
# chmod 755 /var/qmail/bin/qmailctl
# chmod 755 /var/qmail/supervise/+
qmail-send/run
# chmod 755 /var/qmail/supervise/+
qmail-send/log/run
# chmod 755 /var/qmail/supervise/+
qmail-smtpd/run
# chmod 755 /var/qmail/supervise/+
qmail-smtpd/log/run
# chmod 755 /var/qmail/supervise/+
qmail-pop3d/run
# chmod 755 /var/qmail/supervise/+
qmail-pop3d/log/run
# chown qmaill /var/log/qmail /var/log/qmail/smtpd
# chown qmaill /var/log/qmail/pop3d

Eseguiti tali comandi è necessario creare i file di controllo per i messaggi in arrivo e per quelli da consegnare ed impostare i corretti privilegi:

# echo ./Maildir >/var/qmail/control/+
defaultdelivery
# echo 40 > /var/qmail/control/+
concurrencyincoming
# chmod 644 /var/qmail/control/+
defaultdelivery
# chmod 644 /var/qmail/control/+
concurrencyincoming

A questo punto è necessario pensare anche allo script di gestione dello stato del servizio ossia del file "/etc/rc.d/init.d/qmail"; a tale scopo occorre creare dei link simbolici e settare le opzioni di avvio del servizio attraverso i seguenti comandi:

# ln -s /var/qmail/bin/qmailctl /usr/bin
# ln -s /var/qmail/bin/qmailctl /etc/rc.d/init.d/qmail
# /sbin/chkconfig --add qmail
# /sbin/chkconfig --level 345 qmail on


Adesso il servizio è pronto per essere attivato attraverso la creazione di alcuni link simbolici; per il momento, tuttavia, la nostra configurazione non è ancora terminata per cui, non appena sono stati creati i link, è necessario arrestare il servizio:

# ln -s /var/qmail/supervise/+
qmail-send \
/var/qmail/supervise/+
qmail-smtpd /service
# ln -s /var/qmail/supervise/+
qmail-pop3d /service
# qmailctl stop
Stopping qmail...
qmail-smtpd
qmail-send
qmail-pop3d


A questo punto è necessario impostare il servizio in modo che, per ovvi motivi di sicurezza, permetta il relaying solamente al server che lo ospita, ossia al dominio:

# echo '127.:allow,+
RELAYCLIENT=""' >>/etc/tcp.smtp
# qmailctl cdb
Reloaded /etc/tcp.smtp.


Per garantire l'interoperabilità di alcuni software con qmail senza apportare sostanziali modifiche è consigliabile creare alcuni link simbolici che permettano al sistema di "trovare" i binari di "sendmail" considerato come sistema di posta di default per la maggior parte delle distribuzioni:

# ln -s /var/qmail/bin/sendmail /usr/lib
# ln -s /var/qmail/bin/sendmail /usr/sbin

Fine prima parte
Continua con la seconda parte: Potenziare qmail con vpopmail »

AUTORE DEL TESTO
Marco Biagiotti
OPENSOURCE

Pubblicato il: 24/02/2005