Dans ce billet je vais expliquer comment installer qmail sous Ubuntu dans « les règles de l’art« .
Qu’est ce que je veux dire par la ?
Ubuntu (et Debian) propose une méthode d’installation basée sur le paquet qmail-src, d’un autre coté DJB (le créateur de qmail) à préconisé une méthode et bien entendu les deux sont différentes. Dans ce tuto je vais utiliser la méthode de DJB.
Dans cette partie, je ne vais pas traiter de la mise ne place d’un service de messagerie complet (ça viendra), mais juste la mise en place de qmail en tant que MTA et sa configuration minimale. Typiquement ce genre d’installation sera utilisée sur un serveur qui a surtout besoin d’envoyer des mails mais qui ne gère pas de boite mails (un serveur web par exemple, dans mon cas ça va être pour un serveur de mailing-list)
Pré-requis
On va considérer que vous avez:
- Un serveur sous Ubuntu (server ou pas) connecté au net.
- Le minimum vital d’installé (divers outils d’admin et de dev entre autre un compilateur…).
De mon coté je vais utiliser une machine virtuelle sous openvz, avec un Ubuntu minimal.
On va avoir besoin des éléments suivant:
- netqmail: netqmail est la version de qmail maintenue par les gourous de qmail. Concrètement il y a juste quelque retouches par rapport au qmail d’origine pour que le code reste compatible avec les distribs « modernes ».
- ucspi-tcp : ce « module » va gérer la partie tcp de notre installation en particulier pas le biais de tcp-server.
- daemontools: qui va veiller a ce que nos différents éléments soient UP
Installation de ucspi-tcp
On ne vas pas se casser la tête, on va se contenter d’utiliser le gestionnaire de paquets:
apt-get install ucspi-tcp
Installation de daemontools
On ne vas pas se fatiguer inutilement ici non plus:
apt-get install daemontools daemontools-run
Installation de netqmail
Téléchargement des sources
Quoi ? Quel scandale ! On va utiliser des sources, compiler, installer…. ! Et puis il faudra recommencer a chaque fois qu’une faille sera découverte ? Quelle horreur !!!
Alors oui on va se taper du make, mais rassurez vous il y a très peu de chance pour que vous ayez à mettre a jour vos binaires qmail-* pour des questions de sécu: qmail est fiable performant et secure par défaut et le restera.
On se déplace dans le répertoire /usr/local/src et on download les sources de qmail/netqmail:
cd /usr/local/src/;
wget http://www.qmail.org/netqmail-1.06.tar.gz;
gunzip netqmail-1.06.tar.gz;
tar xpf netqmail-1.06.tar;
Création du répertoire accueillant qmail
mkdir -p /var/qmail
Création de l’utilsateur de de son groupe
cd netqmail-1.06
cp INSTALL.ids IDS
On va éditer le fichier IDS pour decommenter la partie qui nous concerne, a savoir ce qu’il y a sous l’intitulé Linux et commenter ou supprimer tout le reste :
$ cat IDS
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
Il nous suffit a présent d’exécuter ce script pour créer utilisateur et groupe:
sh IDS
Compilation et configuration de base
On va compiler les sources et déployer les binaires. Attention il est très important avant d’aller plus loin de vérifier que le nom d’hôte de la machine soit correctement configurée. Le script d’installation va récupérer le hostname pour la config de base de qmail.
cd /usr/local/src/netqmail-1.06;
make setup check;
./config;
On va créer le script /var/qmail/rc et y mettre
#!/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`"
Il nous faut maintenant le rendre exécutable, créer le répertoire de logs et définir le format de mailbox a utiliser
chmod 755 /var/qmail/rc;
mkdir /var/log/qmail;
echo ./Mailbox >/var/qmail/control/defaultdelivery;
Création du script de gestion de qmail
Ce script va permettre de lancer/arreter qmail. On le crée dans /var/qmail/bin/qmailctl
nano /var/qmail/bin/qmailctl
Puis on y colle:
#!/bin/sh
# 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 /etc/service/qmail-send ; then
svc -u /etc/service/qmail-send /etc/service/qmail-send/log
else
echo "qmail-send supervise not running"
fi
if svok /etc/service/qmail-smtpd ; then
svc -u /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
else
echo "qmail-smtpd 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 /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
echo " qmail-send"
svc -d /etc/service/qmail-send /etc/service/qmail-send/log
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /etc/service/qmail-send
svstat /etc/service/qmail-send/log
svstat /etc/service/qmail-smtpd
svstat /etc/service/qmail-smtpd/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /etc/service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /etc/service/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /etc/service/qmail-send
echo "Pausing qmail-smtpd"
svc -p /etc/service/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /etc/service/qmail-send
echo "Continuing qmail-smtpd"
svc -c /etc/service/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /etc/service/qmail-send /etc/service/qmail-send/log
echo "* Restarting qmail-smtpd."
svc -u /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
;;
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 <<HELP
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|cont|cdb|queue|help}"
exit 1
;;
esac
exit 0
On fixe les droits du script pour qu’il soit exécutable et on crée un lien vers /usr/bin ce qui va nous permettre de lancer ce script sans avoir a entrer son chemin complet.
chmod 755 /var/qmail/bin/qmailctl;
ln -s /var/qmail/bin/qmailctl /usr/bin;
On va devoir à présent créer les supervises scripts, ces scripts vont être utilisés par daemontools pour superviser qmail.
Dans ce qui suit comme c’est un peu laborieux et répétitif je vais me contenter pour chacun d’un « nano le script » et en dessous son contenu.
Avant tout on va créer les répertoires de log:
mkdir -p /var/qmail/supervise/qmail-send/log;
mkdir -p /var/qmail/supervise/qmail-smtpd/log;
Et c’est parti pour les scripts…
nano /var/qmail/supervise/qmail-send/run
#!/bin/sh
exec /var/qmail/rc
Pour qmail-smtpd:
nano /var/qmail/supervise/qmail-smtpd/run
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo "No /var/qmail/control/rcpthosts!"
echo "Refusing to start SMTP listener because it'll create an open relay"
exit 1
fi
exec /usr/bin/softlimit -m 4000000 \
/usr/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
On va configurer des maintenant le concurrencincoming qui définit le nombre maximum de transactions SMTP entrantes. On va pour le moment se contenter de 20.
echo 20 > /var/qmail/control/concurrencyincoming;
chmod 644 /var/qmail/control/concurrencyincoming;
Pour les logs qmail-smtpd:
nano /var/qmail/supervise/qmail-smtpd/log/run
Qui doit contenir
#!/bin/sh
exec /usr/bin/setuidgid qmaill /usr/bin/multilog t /var/log/qmail/qmail-smtpd
Les logs qmail-send a présent:
nano /var/qmail/supervise/qmail-send/log/run
#!/bin/sh
exec /usr/bin/setuidgid qmaill /usr/bin/multilog t /var/log/qmail/qmail-send
La partie « pénible » se termine, il nous faut a présent fixer les droits sur ces scripts:
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;
On créé les repertoires pour les logs:
mkdir -p /var/log/qmail/qmail-smtpd;
mkdir -p /var/log/qmail/qmail-send;
chown qmaill /var/log/qmail/qmail-send /var/log/qmail/qmail-smtpd;
Bien on va à présent définir les autorisations de relais. Par défaut qmail accepte uniquement le relais pour les domaine qu’il gère, autrement dit uniquement pour le domaine que vous avez définis comme hostname du serveur. Comme cette installation de qmail va aussi servir de SMTP pour les applications locales, donc qui « attaquent » le SMTP sur le port 127.0.0.1, on va autoriser cette IP a relayer:
echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp;
qmailctl cdb;
Le système ou une application peut avoir besoin d’envoyer des mails en utilisant le binaire sendmail, on va donc faire en sorte que notre configuration supporte cette fonctionnalité. qmail intègre un binaire sendmail, qui implémente les même commandes/options que le binaire sendmail d’origine.
ln -s /var/qmail/bin/sendmail /usr/lib;
ln -s /var/qmail/bin/sendmail /usr/sbin;
Configuration des alias
Dans cette installation nous n’allons pas créer de boite locale, tous les mails devront donc etre redirigés vers un autre compte. Dans mon cas je vais tout rediriger vers techAprotecmail.com (A=@).
echo "&tech@protecmail.com" > /var/qmail/alias/.qmail-root;
echo "&tech@protecmail.com" > /var/qmail/alias/.qmail-postmaster;
ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon;
ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse;
chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster;
Lancement de qmail et vérifications
Voici venu le moment critique ou l’on va savoir si tout fonctionne correctement…. ou pas.
Comme on l’a vu, les process liés à qmail sont gérés par daemontools via les scripts « supervise », il nous faut donc créer les liens necessaires pour que daemontools soit en mesure de les exploiter. Attention dans une installation classique les supervises scripts doivent être linkés vers /services. Dans notre cas, on a utilisé les paquets Ubuntu pour daemontool et ce dernier à une configuration différentes et utilise /etc/service, on va garder cette config.
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /etc/service
On lance qmail (en fait daemontools doit avoir fait son boulot et qmail devrait être lancé):
qmailctl start
On vérifie que qmail tourne correctement grâce a la commande :
$ qmailctl stat
/etc/service/qmail-send: up (pid 864) 5 seconds
/etc/service/qmail-send/log: up (pid 875) 5 seconds
/etc/service/qmail-smtpd: up (pid 867) 5 seconds
/etc/service/qmail-smtpd/log: up (pid 865) 5 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0
Bon c’est bien beau tout ça, mais pour le systeme il n’y a pas de MTA installé puisque l’on n’a pas utilisé le gestionnaire de paquets pour installer qmail. Il faut donc gruger un peu et faire croire au systeme qu’il y a un MTA.
Comme ma rencontre avec Ubuntu|Debian est assez récente, j’ai préféré utiliser mon Joker « Appel a un ami » pour touver le truc car mes recherches chez l’ami google n’étaient pas très concluantes. En l’occurrence Stéphane (que je vous conseille par ailleurs si vous avez besoin d’infogérance pour vos serveurs) m’a donné le truc. En gros on fait un paquet virtuel, ainsi le systeme va croire qu’un MTA est installé.
apt-get install equivs
cd /tmp
cp /usr/share/doc/equivs/examples/mail-transport-agent.ctl .
equivs-build mail-transport-agent.ctl
dpkg -i /tmp/mta-local_1.0_all.deb
On va installer un petit binaire qui va nous permettre d’envoyer des mails en ligne de commande (on pourrait utiliser qmail-inject ou sendmail, mais je pense que la commande mail est plus repandue et donc plus habituelle)
apt-get install bsd-mailx
On fait un test d’envois en local pour voir si ça redirige correctement vers une boite externe (ou pourrait se contenter de faire un test vers une adresse dsitante, mais la on fait d’une pierre deux coups):
echo "un test de MTA" | mail -s"MTA" root
Normalement vous devriez recevoir le mail sur l’adresse configurée dans .qmail-root. Si ce n’est pas le cas consultez vos logs (/var/log/qmail).
Voila c’est tout pour aujourd’hui. Ce howto se verra complété dans un avenir plus ou moins proche par un autre tuto décrivant la mise ne place d’un gestionnaire de mailing list. Et comme on aime les outils de DJB ce sera ezmlm.