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.
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
»
|