Première approche de Qmail
Installation
Présentation de la solution
Sa simplicité et sa modularité fait de Qmail lui l’un des MTA les plus abouti que l’on puisse rencontrer. Comparé à d’autres MTA tels que Sendmail ou bien Postfix, Qmail se démarque par son concept original mais néanmoins efficace : Qmail est un ensemble de petits programmes effectuant chacun une et une seul tache. La simplicité réside dans le fait que ces programmes communiquent entre eux par le moyen de « pipes » et il est facile d’intégrer un antispam, antivirus ou tout autre filtre fait maison. Le lancement de ces applications en mode non root assure une sécurité à tous les niveaux de Qmail.
Nous installerons Qmail ainsi qu’une collection de logiciels sur une distribution debian etch 4.0 ce qui constituera notre solution.
Daemontools
Les daemontools sont une collection d'outils UNIX pour contrôler et monitorer les services qmail-send, qmail-smtpd et qmail-pop3d ainsi que leurs logs.
Ucspi-tcp
Ucspi-tcp consiste en une suite d'outils permettant la création de démons client-serveur tcp. Tcpserver est une alternative plus sécurisée que inetd. Il a des fonctionnalités intégrées pour des contrôles d'accès par règle et reporte les connexions lorsqu'une charge maximale configurable a été atteinte, contrairement à inetd. Tcpserver est aussi recommandé pour une utilisation avec Qmail
Vpopmail
Vpopmail permet d’héberger de différents domaines virtuel et de comptes de messagerie.
Autorespond
Robot qui permet de répondre au mail a votre place dans le cas où par exemple vous êtes en vacances. Interessant car configurable par Qmailadmin.
Maildrop
C’est un filtreur de mails, il sert à les délivrer ou les rejeter.
Qmail-scanner
Permet de faire l’interface entre l’antivirus et vos mails.
Qmailadmin
Qmailadmin permet quand à lui de paramétrer vpopmail via une interface web, utilisable par les utilisateurs pour configurer leurs comptes mail.
Clamv
Antivirus utilisé pour filtrer les messages utilisés par qmail-scanner.
Qmail-conf
Permet de configurer les services afin de fonctionner avec Daemontools.
Vqadmin
Permet de configurer les domaines, utilisable uniquement par les administrateurs.
Installation de la solution
Pré-requis
Configuration des DNS pour un serveur mail :
linux:~# host -t mx mail.home.lan
home.lan mail is handled by 10 mail.home.lan.
linux:~# host -t mx home.lan
mail.home.lan has address 192.168.0.126
Récupération et compilation des sources
L'auteur de Qmail n'a pas souhaité que des paquets soient 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és.
wget http://mir2.ovh.net/www.qmail.org/netqmail-1.06.tar.gzPour démarrer qmail :
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/
/var/qmail/rc &
Daemon Tools
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 /packageLors de la compilation de daemontools, il est possible d’avoir ce genre d’erreur :
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
Erreur lors de la compil :Pour corriger cette erreur, il faut simplement patcher daemontools avec le patch issu du site de qmail:
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': No such file or directory
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 ”/etc/inittab”.
Ucspi-TCP
Le module UCSPI-TCP va gérer “qmail-smtpd” pour envoyer les mails. 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 et les remplir.
Installation :
Création d'un compte MySQL avec les droits sur la base de données 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, nous le rappellons 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 fait.
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 | tai64nlocalLes logs s'affichent au format TimeStamp mais DaemonTools inclut un outil qui va convertir ce temps au format anglosaxon : “tai64nlocal”.
tail -f /var/qmail/supervise/qmail-smtpd/log/main/current | tai64nlocal
TCP Server
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
Vérification :
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, la libraire AUTHVCHKPW n’est pas fournit, il faut donc faire ceci :
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.cOn lance la compilation et on installe :
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
make
make setup check
Fabrication des certificats :
make certLes certificats ont été rajouté dans ”/var/qmail/control”.
Generating a 1024 bit RSA private key
FR
France
Paris
Qmail
admin
admin
make tmprsadh
Modification du script de lancement de Qmail :
Nous allons tester de nous authentifier auprès du serveur mail :
telnet ip_de_votre_serveur_mail 25Le serveur attend la chaine de caractère qui contient le destinataire, le domaine et le mot de passe du compte mail créé avec VPOPMail.
EHLO serveur-rps.fr
250-serveur-rps.fr
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE 0
250 AUTH LOGIN PLAIN CRAM-MD5
Génération du MDP : perl -MMIME::Base64 -e 'print encode_base64(“\000postmaster\@domaine.com\000votre_mot_de_passe”)' Ou alors un convertisseur en ligne : http://www.motobit.com/util/base64-decoder-encoder.asp
AUTH PLAIN la_cle_retournee_par_le_site
Erreur fréquente :
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 (http://www.qmail.org/qmailqueue-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 /tmpMais une erreur se produit → “Cannot find reformime on your system!”.
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
Toutes les options de compilation sont listées sur cette page.
./configure --spooldir /var/lib/qscan --qmaildir /var/qmail --bindir /var/qmail/bin \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”.
--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
Si vous souhaitez tout de même copier seulement le binaire, voici la manipulation :
• Maildrop :
cd /tmpUne 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”.
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
• 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/binRefaire 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
uudecode=/usr/bin/uudecode
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.smtpOn 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 :
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
qmailctl cdb
qmailctl restart
X-Spam-Status: No, score=3.2 required=5.0
X-Spam-Level: +++
Si l'objet du mail n'est pas réécrit dans SpamAssassin :
nano /var/qmail/bin/qmail-scanner-queue.plRemplacer :
my $spamc_options='-s 256000 -t 30 -c ';
par :
my $spamc_options='-s 256000 -t 30 ';
Commandes à connaître
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
Les services complémentaires
Gestionnaire de maillinglist
Ezmlm est le gestionnaire de mailing de Qmail. Pour l'installer, extraire ezmlm et ezmlm-idx.
Puis copiez le contenu d’ezmlm-idx dans le répertoire d’ezmlm:
tar zxvf ezmlm-0.53.tar.gz
tar zxvf ezmlm-idx-0.40.tar.gz
mv ezmlm-idx-0.40/* ezmlm-0.53/
Patchez ezmlm:
cd ezmlm-0.53
patch < idx.patch
et compilez, installez le tout:
make clean
make
make man
Installation de Qmailadmin
Il nous reste plus qu'à installer l'interface cgi Web de la gestion des comptes mails.
Pour cela:
tar zxvf qmailadmin-1.0.2
cd qmailadmin-1.0.2
./configure --enable-htmldir=/var/www
make
make install
Attention: Remplacez --enable-htmldir=/var/www par le chemin de votre racine web.
Je suppose que vous savez configurer apache pour que le répertoire de cgi soit valide et fonctionnel
Conclusion
Notre solution ainsi mise en place permet d'administrer rapidement et de manière simple un ou plusieurs domaines et bien sûr les utilisateurs, et ceci via le web.
Qmail a des fonctions bien plus avancées, et autorise l'ajout d'utilisation d'antispams et d'antivirus dans une solution déjà en production.