Qmail, Vpopmail / MySQL, Daemontools, UCSPI-TCP, SMTP-AUTH

Je vais détailler l’installation du serveur mail Qmail couplé à Vpopmail et MySQL pour gérer simplement les domaines et les boites mails des utilisateurs. Ensuite, pour éviter que le serveur Mail ne devienne un relais à spam, il est possible d’utiliser une authentification SMTP pour envoyer des mails, ainsi, lorsqu’un utilisateur voudra envoyer un mail il devra être authentifié.

Là où Postfix fonctionne de manière autonome, Qmail se différencie par son fonctionnement sous la forme de module qui en fait un serveur de messagerie très sécurisé !

Installation de Qmail

L’auteur de Qmail n’a pas souhaité que des paquets soit créés, il faut donc compiler directement par les sources. Par contre il existe netqmail qui contient un grand nombre de patchs directement intégré.

wget http://mir2.ovh.net/www.qmail.org/netqmail-1.06.tar.gz
tar -xzf netqmail-1.06.tar.gz
make
make setup check
./config-fast domaine.com

Tous les fichiers de configuration se trouve dans le dossier :

/var/qmail/control/

Pour démarrer qmail :

/var/qmail/rc &

DaemonTools

Documentation : DaemonTools

DaemonTools va vérifier si le service qmail fonctionne, s’il est DOWN il sera relancé. De plus, la gestion des logs est améliorée.

Installation

mkdir -p /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar -xzf daemontools-0.76.tar.gz
mv admin/daemontools-0.76/ daemontools-0.76
rmdir admin/
cd daemontools-0.76
package/install

Personnellement, lors de la compilation de daemontools, j’ai eu droit à cette erreur :

Erreur lors de la compil :
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': No such file or directory

Pour corriger cette erreur, il faut simplement patcher daemontools avec le patch issu du site de qmail :

cd /package
wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
patch -p0 < daemontools-0.76.errno.patch
patching file daemontools-0.76/src/error.h
cd daemontools-0.76
rm -R compile
package/install

Si la compilation se déroule bien, voici ce que vous devriez avoir :

Making compatibility links in /usr/local/bin...
Creating /service...
Adding svscanboot to inittab...
init should start svscan now.

On remarque que la ligne « SV:123456:respawn:/command/svscanboot » a été rajouté dans « vi /etc/inittab« . Doit maintenir le service : scanboot, qui va maintenant svscan.

UCSPI-TCP

Le module UCSPI-TCP va gérer « qmail-smtpd » pour envoyer les mails. Puis il sera interfacé avec MySQL pour la gestion des accès au SMTP et seuls les utilisateurs du domaine pourront envoyer des emails. Documentation.

Comme pour daemontools il faut patcher le ucspi-tcp pour le bon déroulement de l’installation :

cd /tmp
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tar -xzf ucspi-tcp-0.88.tar.gz
wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
cd ucspi-tcp-0.88
patch -p1 < /tmp/ucspi-tcp-0.88.errno.patch
make
make setup check

Vpopmail + MySQL

Vpopmail est très simple à configurer et va créer de lui-même les tables MySQL ainsi que leur remplissage.

Installation

Création d’un compte MySQL avec les droits sur la base de donnée nommée vpopmail :

CREATE DATABASE vpopmail;
GRANT select,insert,update,delete,create,drop ON vpopmail.* TO vpopmailuser@localhost IDENTIFIED BY 'votre_mot_de_passe';
quit;

Puis il faut récupérer le paquet, le décompresser et configurer la compilation pour la prise en charge de MySQL : enable-auth-module=mysql

wget http://garr.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.25.tar.gz
tar xzf vpopmail-5.4.25.tar.gz
cd vpopmail-5.4.25
./configure 
--disable-roaming-users 
--enable-logging=p 
--disable-passwd 
--enable-clear-passwd 
--disable-domain-quotas 
--enable-auth-module=mysql 
--enable-auth-logging 
--enable-sql-logging 
--enable-valias 
--disable-mysql-limits

make
make install-strip

Pour tester, il suffit d’utiliser les commandes fournies par Vpopmail : vadddomain, vadduser, etc.

Par exemple, pour la création du domaine avec le user postmaster@domaine.com (et, je le rappelle la création automatique des tables MySQL): ./vadddomain domaine.com password-postmaster. Voici d’autres commandes :

#Création d'un compte utilisateur sur un autre domaine virtuel
vadduser ludovic@autre-domaine.com password
#Création d'un alias de postmaster
valias -i postmaster@domaine.com ludovic@domaine.com
#Visualiser les alias / forwards
valias postmaster@domaine.com

Configuration par défaut

nano /var/vpopmail/etc/vlimits.default

Emplacement des mails

/var/vpopmail/domains/

Test des mails :

echo to: postmaster@domaine.com | /var/qmail/bin/qmail-inject
#Vérification
nano /var/vpopmail/domains/domaine.com/postmaster/Maildir/new/

Configuration de Qmail

Pour la configuration de Qmail nous allons utiliser des scripts déjà tout faits.

 cd /tmp
wget http://qmail.jms1.net/scripts/service-qmail-send-run
wget http://qmail.jms1.net/scripts/service-qmail-smtpd-run
wget http://qmail.jms1.net/scripts/service-any-log-run
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log

cp /tmp/service-qmail-send-run /var/qmail/supervise/qmail-send/run
cp /tmp/service-qmail-smtpd-run /var/qmail/supervise/qmail-smtpd/run

chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run

cp /tmp/service-any-log-run /var/qmail/supervise/qmail-send/log/run
cp /tmp/service-any-log-run /var/qmail/supervise/qmail-smtpd/log/run

chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Configuration des scripts

nano /var/qmail/supervise/qmail-smtpd/run -> remplacer "IP=unset" par "IP=0"
nano /var/qmail/supervise/qmail-smtpd/log/run -> service-any-log-run

Les logs seront dans « /var/qmail/supervise/qmail-smtpd/log/main ».

Création du script de lancement de qmail qui va s’occuper la supervision des services

cd /tmp
wget http://www.lifewithqmail.org/qmailctl-script-dt70
cp /tmp/qmailctl-script-dt70 /var/qmail/bin/qmailctl
chmod 755 /var/qmail/bin/qmailctl
ln -s /var/qmail/bin/qmailctl /usr/bin

Affichage des LOGS

tail -f /var/qmail/supervise/qmail-send/log/main/current | tai64nlocal
tail -f /var/qmail/supervise/qmail-smtpd/log/main/current | tai64nlocal

Les logs s’affichent au format TimeStamp mais DaemonTools inclut un outil qui va convertir ce temps au format anglosaxon : « tai64nlocal ».

TCP SERVER

Documentation.

Recevoir les mails de tous

nano /etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT=""
:allow
qmailctl cdb

Tous les emails qui viennent des IP 127.0.0.X sont relayés. Tous les emails venant d’autres ip sont acceptés uniquement si le destinataire est configuré sur la machine (voir le serveur MX). Il n’est pas nécessaire de redémarrer le serveur smtp car le fichier est lu à chaque connexion smtp.

Démarrage de Qmail

Lancement du service qmail : « ln -s /var/qmail/supervise/qmail-send /service » Lancement du SMTP : « ln -s /var/qmail/supervise/qmail-smtpd /service »

ps aux | grep qmail
root 7359 0.0 0.0 1428 300 ? S 13:40 0:00 supervise qmail-send
qmails 7361 0.0 0.0 1608 372 ? S 13:40 0:00 qmail-send
root 7363 0.0 0.0 1572 316 ? S 13:40 0:00 qmail-lspawn ./Maildir/
qmailr 7364 0.0 0.0 1568 304 ? S 13:40 0:00 qmail-rspawn
qmailq 7365 0.0 0.0 1560 320 ? S 13:40 0:00 qmail-clean
root 8082 0.0 0.0 1428 300 ? S 13:41 0:00 supervise qmail-smtpd
root 8126 0.0 0.0 3284 632 pts/1 R+ 13:41 0:00 grep qmail

Vérification du bon fonctionnement :

netstat -a | grep :smtp

Qmail est bien lancé :

qmailctl stat
/service/qmail-send: up (pid 7361) 535 seconds
/service/qmail-send/log: up (pid 7362) 535 seconds
/service/qmail-smtpd: up (pid 16696) 0 seconds
/service/qmail-smtpd/log: up (pid 8085) 515 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0

On remarque que tous les services ont démarré sauf « /service/qmail-smtpd » qui affiche un uptime de 0 seconde. Il faut donc corriger cela :

nano /var/qmail/supervise/qmail-smtpd/run

Il faut remplacer la ligne SMTP_CDB= »/etc/tcp/smtp.cdb » par SMTP_CDB= »/etc/tcp.smtp.cdb »

On affiche à nouveau l’état des services :

 qmailctl stat
/service/qmail-send: up (pid 7361) 1342 seconds
/service/qmail-send/log: up (pid 7362) 1342 seconds
/service/qmail-smtpd: up (pid 25461) 330 seconds
/service/qmail-smtpd/log: up (pid 8085) 1322 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0

Courier POP / IMAP

apt-get install courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-pop

Configuration de l’authentification avec Courier

nano /etc/courier/authdaemonrc

authmodulelist= »authpam » -> authmodulelist= »authvchkpw »

Avec l’installation par paquet ne fournit pas la livraire AUTHVCHKPW donc il faut :

cd /tmp
wget http://www.qmailrocks.org/downloads/qmailrocks.tar.gz
tar xzf qmailrocks.tar.gz
cp qmailrocks/scripts/misc/authvchkpw /usr/lib/courier/courier-authlib/authvchkpw
bzip2 -d qmailrocks/courier-authlib-0.55.tar.bz2
tar xf qmailrocks/courier-authlib-0.55.tar
courier-authlib-0.55
./configure
make
cp /tmp/courier-authlib-0.55/.libs/libauthvchkpw.so /usr/lib/courier-authlib/

Redémarrage des démons

/etc/init.d/courier-authdaemon restart
/etc/init.d/saslauthd restart
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

SMTP AUTH

SMTP AUTH permet à l’utilisateur de s’authentifier pour envoyer des mails à partir de n’importe quelle machine, tout en empêchant les envois de mails non désirés. En effet, il ne faut pas que le serveur soit « Open Relay ».

* Installation de CheckPassword

cd /tmp
wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
tar xzf checkpassword-0.90.tar.gz
cd checkpassword-0.90
make
make setup check

Il faut stopper QMail car les fichiers binaires sont remplacés : « qmailctl stop« .

cd /tmp/netqmail-1.06/other-patches
wget http://shupp.org/patches/netqmail-1.05-tls-smtpauth-20070417.patch
cd /tmp/netqmail-1.06
patch -p0 < other-patches/netqmail-1.05-tls-smtpauth-20070417.patch

Si tout se passe bien :

patching file ./base64.c
patching file ./base64.h
patching file ./case_startb.c
patching file ./conf-cc
patching file ./dns.c
patching file ./FILES.auth
patching file ./hier.c
patching file ./install_auth.sh
patching file ./ipalloc.h
patching file ./Makefile
patching file ./Makefile-cert.mk
patching file ./qmail-control.9
patching file ./qmail-remote.8
patching file ./qmail-remote.c
patching file ./qmail-smtpd.8
patching file ./qmail-smtpd.c
patching file ./README.auth
patching file ./ssl_timeoutio.c
patching file ./ssl_timeoutio.h
patching file ./TARGETS
patching file ./tls.c
patching file ./tls.h
patching file ./update_tmprsadh.sh

On lance la compilation et on installe :

make
make setup check

Fabrication des certificats :

make cert
Generating a 1024 bit RSA private key
FR
France
Paris
Qmail
admin
admin
make tmprsadh

Les certificats ont été rajouté dans « /var/qmail/control ».

Modification du script de lancement de Qmail

Nous allons tester de nous authentifier auprès du serveur mail :

telnet ip_de_votre_serveur_mail 25
EHLO serveur-rps.fr
250-serveur-rps.fr
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE 0
250 AUTH LOGIN PLAIN CRAM-MD5

Le serveur attend la chaine de caractère qui contient le destinataire, le domaine et le mot de passe du compte mail créé avec VPOPMail.

Génération du MDP : perl -MMIME::Base64 -e ‘print enpre_base64(« �00postmaster@domaine.com�00votre_mot_de_passe »)’ Ou alors un convertisseur en ligne : http://www.motobit.com/util/base64-deprer-enprer.asp

AUTH PLAIN la_cle_retournee_par_le_site

Erreur que j’ai eu

454 oops, unable to write pipe and I can't auth -> au lancement -> exec tcpserver -vR

Il faut modifier la ligne :

nano /var/qmail/supervise/qmail-smtpd/run
ARGS=" $LOCAL $CHECKPW $TRUE" par ARGS=" $CHECKPW $TRUE"

On refait l’authentification et une nouvelle erreur apparait :

"535 authentication failed (#5.7.1)"

Dans les logs on remarque une erreur :

# voir les logs :
/var/qmail/supervise/qmail-smtpd/log/main/current
vmysql: can't read settings from /var/vpopmail/etc/vpopmail.mysql

Visiblement il y a un problème dans les droits, il faut donc corriger cela.

Par défaut :

 ls -l /var/vpopmail/etc/vpopmail.mysql
-rw-r----- 1 vpopmail vchkpw 576 2008-02-11 16:53 /var/vpopmail/etc/vpopmail.mysql
# commande à exécuter pour modifier les propriétaires
chown vpopmail:root /var/vpopmail/etc/vpopmail.mysql
-rw-r----- 1 vpopmail root 576 2008-02-11 16:53 /var/vpopmail/etc/vpopmail.mysql

Il est toujours impossible de se loguer, une nouvelle table est créé dans la BDD MySQL et contient les tentatives de log : « vlog ». Affichage d’une nouvelle erreur : « vchkpw-smtp: vpopmail user not found postmaster@domaine.com:xxx.xxx.xxx.xxx »

Par défaut :

 ls -l /var/vpopmail/bin/vchkpw
-rwx--x--x 1 vpopmail vchkpw 86320 2008-02-11 16:47 /var/vpopmail/bin/vchkpw
# commande à exécuter pour modifier les droits
chmod 751 /var/vpopmail/bin/vchkpw
chmod 4711 /var/vpopmail/bin/vchkpw
-rws--x--x 1 vpopmail root 86320 2008-02-11 16:47 /var/vpopmail/bin/vchkpw

SpamAssassin

Il existe un patch pour permettre à Qmail 1.03 d’utiliser le binaire « qmail-queue » différent de celui qui est intégré par défaut. Mais puisque l’installation de Qmail a été réalisée avec NetQmail, le patch est déjà intégré.

Installation de Qmail-scanner

cd /tmp
wget http://prdownloads.sourceforge.net/qmail-scanner/qmail-scanner-2.02.tgz?download
tar xfzv qmail-scanner-2.02.tgz
cd qmail-scanner-2.02
./configure
Y

Mais une erreur se produit -> « Cannot find reformime on your system! ».

Toutes les options de compilation sont listées [[http://qmail-scanner.sourceforge.net/configure-options.php|sur cette page]].

./configure --spooldir /var/lib/qscan --qmaildir /var/qmail --bindir /var/qmail/bin 
--qmail-queue-binary /var/qmail/bin/qmail-queue --admin postmaster --domain serveur-rps.fr 
--add-dscr-hdrs yes --lang fr_FR --debug yes --scanners fast_spamassassin

Il faut donc récupérer « reformime ». Il est possible de le faire en compilant MailDrop puis en copiant le binaire dans le répertoire. Par contre, il est possible d’avoir des problèmes lors d’une mise à jour par paquet donc je vous conseille d’installer mail drop par paquet « apt-get install maildrop ».

Si vous souhaitez tout de même copier seulement le binaire, voici la manipulation :

  • Maildrop
cd /tmp
wget http://prdownloads.sourceforge.net/courier/maildrop-2.0.4.tar.bz2
bzip2 -d maildrop-2.0.4.tar.bz2
tar xf maildrop-2.0.4.tar
cd maildrop-2.0.4
./configure
make

Une nouvelle erreur apparait : (Perl-compatible regular expression library) n’est pas présent -> « configure: error: pcre.h not found – install PCRE from www.pcre.org ».

  • PCRE
cd /tmp
wget http://kent.dl.sourceforge.net/sourceforge/pcre/pcre-7.6.tar.gz
tar xzf pcre-7.6.tar.gz
cd pcre-7.6
./configure
make
make install
  • Récupération de reformime
cd maildrop-2.0.4
./configure
make

Recompilation de maildrop pour créer Reformime :

cd /tmp/maildrop-2.0.4
./configure
make

Copie du binaire « reformime » dans /usr/local/bin

cp /tmp/maildrop-2.0.4/rfc2045/reformime /usr/local/bin

Refaire le ./configure avec « –install 1″ à la fin pour éxécuter l’installation.

On reprend la configuration de qmail-scanner :

./configure --spooldir /var/lib/qscan --qmaildir /var/qmail --bindir /var/qmail/bin 
--qmail-queue-binary /var/qmail/bin/qmail-queue --admin postmaster --domain serveur-rps.fr 
--add-dscr-hdrs yes --lang fr_FR --debug yes --scanners fast_spamassassin
The following binaries and scanners were found on your system:
mimeunpacker=/usr/local/bin/reformime
uudepre=/usr/bin/uudepre

Content/Virus Scanners installed on your System
max-scan-size=100000000
fast_spamassassin=/usr/bin/spamc

If that looks correct, I will now generate qmail-scanner-queue.pl
for your system...
Continue? ([Y]/N)
Y

Testing suid nature of /usr/bin/perl...
Whoa - broken perl install found.
Cannot even run a simple script setuid

You will either have to correct this
or use the C-wrapper within the ./contrib dir

Error was:
Can't do setuid (cannot exec sperl)

See FAQ for further details
  • perl-suid

Il faut installer le paquet manquant :

apt-get install perl-suid

Ajout de « –install 1″ dans le « ./configure » pour que tout s’installe correctement.

Modification du fichier TCP.SMTP

Lors que le serveur reçoit un mail, le fichier « //tcp.smtp// » est appelé. C’est donc ce fichier qui va appelé Qmail Scanner avec SpamAssassin

nano /etc/tcp.smtp
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
qmailctl cdb
qmailctl restart

On vérifie le bon fonctionnement en envoyant un mail ou un SPAM qui traine dans une boite mail et on regarde les entêtes, on doit trouver :

X-Spam-Status: No, score=3.2 required=5.0
X-Spam-Level: +++

Si l’objet du mail n’est pas reécrit dans SpamAssassin :

nano /var/qmail/bin/qmail-scanner-queue.pl

Remplacer :

my $spamc_options='-s 256000 -t 30 -c ';

par :

my $spamc_options='-s 256000 -t 30 ';

Commandes à connaitre

Etat des services de qmail-send et qmail-smtp : qmailctl stat

Nombre de mail en attente : qmail-qstat

Entête des mails en attente : qmail-qread

Configuration sommaire : qmail-showctl

Pour toute modification de /etc/tcp.smtp il faut faire : qmailctl cdb

Fonctionnement en relai

Dans l’exemple précédent, tout Qmail est installé sur la même machine, et il se peut que le serveur sature avec la réception des mails, le traitement antispam puis le délivrement dans la boite mail.

Il est donc possible d’avoir un serveur en amont nommé relai qui va recevoir les mails puis appliqué SpamAssassin et enfin délivré dans les boites mails.

La configuration des relais est identique au serveur de boites mails, il faut :

  • DaemonTools
  • UCSPI-TCP
  • NetQmail
  • SpamAssassin

Il n’y a pas besoin de :

  • Courier
  • VPOPMail

Voici les IP que j’ai imaginé pour le réseau :

Serveur MX 1 -> 192.168.0.50
Serveur MX 2 -> 192.168.0.51
Serveur Boites mails -> 192.168.0.1
Domaine -> serveur-rps.fr

Sur les relais MX 1 et MX 2, il faut relayer les mails vers le serveur qui contient les boites mails. Ensuite, lorsqu’un utilisateur enverra un mail, le mail sera transféré à l’un des relais et c’est l’un des relais qui enverra le mail.

MX 1

Routage des mails reçus vers le serveur de boites mails :

nano /var/qmail/control/smtproutes
serveur-rps.fr:192.168.0.1

Autorisation du serveur de boites mails à envoyer des mails avec le relai MX :

 nano /etc/tcp.smtp
:allow
192.168.0.1:allow,RELAYCLIENT=""
qmailctl cdb

Autorisation du relai pour qui relai le domaine :

 nano /var/qmail/control/rcpthosts
serveur-rps.fr

MX 2

La configuration est identique au MX 1.

 nano /var/qmail/control/smtproutes
serveur-rps.fr:192.168.0.1
 nano /etc/tcp.smtp
:allow
192.168.0.1:allow,RELAYCLIENT=""
qmailctl cdb
 nano /var/qmail/control/rcpthosts
serveur-rps.fr

Boites Mails

Autorisation des relais pour relayer les mails :

 nano /etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT=""
192.168.0.50:allow,RELAYCLIENT=""
192.168.0.51:allow,RELAYCLIENT=""
qmailctl cdb

Lors de l’envoi d’un mail par un utilisateur du serveur de boites mails, il faut que le serveur de boites envoi le mail en utilisant l’un des deux relais MX :

 nano /var/qmail/control/smtproutes
:192.168.0.50
:192.168.0.51

Test d’envoi et de réception

D’après les logs, il est tout à fait possible de suivre le bon cheminement d’un mail : Relai MX -> Serveur de Boites mails.

Documentation

Life with qmail