Lorsque l'on met en place de gros serveurs de messagerie, les deux problèmes récurrents sont les suivants :
Vpopmail apporte à ces deux questions une solution élégante, efficace et "facile" à administrer. Bien qu'il soit possible d'utiliser Vpopmail avec postfix, il semble tout de même que le couple Qmail/vpopmail soit le plus harmonieux.
Vpopmail est maintenu par Inter7, que nous aurons encore l'occasion de retrouver plus loin.
Avec Vpopmail, une simple commande permet de créer un nouveau domaine virtuel, ainsi qu'un compte "postmaster" attaché à ce domaine. Une autre simple commande permet de créer un compte dans un domaine donné (et encore une autre permet de détruire un compte donné). Vpopmail va se greffer sur Qmail de façon tellement naturelle que l'ensemble va fonctionner presque "tout seul".
Vpopmail peut stocker les paramètres d'authentification des comptes de plusieurs manières :
Sauf si vous avez à gérer plusieurs centaines de domaines, ou plusieurs centaines de comptes, le format cdb, qui ne fait pas intervenir un composant logiciel supplémentaire fera sans doute l'affaire, c'est ce cas que nous mettrons en pratique.
Nous l'avons vu lors de la première installation de Qmail, cette base de donnée des utilisateurs va servir non seulement pour POP3 et POP3s, mais aussi pour IMAP et IMAPS, et pour l'authentification des clients nomades qui voudront utiliser notre installation pour envoyer leurs messages.
cd /usr/local/src/tar wget http://downloads.sourceforge.net/vpopmail/vpopmail-5.4.17.tar.gz cd .. tar xzf tar/vpopmail-5.4.17.tar.gz cd vpopmail-5.4.17
Il y a quelques questions à se poser avant de se lancer dans la compilation et l'installation de Vpopmail. La première question est :
Où placer les domaines virtuels, avec leurs utilisateurs et leurs "Maildirs" ?
Habituellement, dans /home/vpopmail. Mais ce n'est absolument pas une obligation bien sûr. Dans cet exposé, c'est cependant ce choix qui est fait, c'est d'ailleurs plus ou moins la coutume.
Vpopmail nécessite la création d'un groupe et d'un utilisateur spécifiques, avec des GID et UID spécifiques. Assurez-vous que vous ne provoquerez pas de conflits, puis créez les :
groupadd -g 89 vchkpw useradd -g vchkpw -u 89 -d /home/vpopmail vpopmail
A l'heure où ces lignes sont écrites, la version stable de vpopmail est estampillée 5.4.17, mais il y a déjà une version 5.4.18 en cours de développement, qui apportera semble-t-il quelques fonctionnalités de plus.
Une fois l'archive décompressée, allez dans le répertoire des sources de Vpopmail, ici :
/usr/local/src/vpopmail-5.4.17
Dans ce répertoire, il y a un certain nombre de README, qu'il ne peut qu'être conseillé de lire, et principalement, celui qui est relatif aux "roamingusers" (entendez par là, les utilisateurs nomades). Le problème évoqué ne concerne pas directement Vpopmail, mais plutôt Qmail, et se pose en ces termes :
Un utilisateur "nomade" (ou même un sédentaire), change souvent d'adresse IP. Ce même utilisateur voudrait pouvoir disposer du serveur Qmail pour envoyer ses messages, mais nous savons que ceci est fixé par le "tcpserver". Comment faire alors pour permettre à un utilisateur dont l'adresse IP change, d'accéder à Qmail sans pour autant créer un relais ouvert ?
Une solution, qui n'est certainement pas la meilleure, est d'avoir recours à ce que l'on appelle le "pop before smtp" (ou encore le "smtp after pop"). Le principe est simple, il suffit que l'utilisateur s'authentifie via POP3. Son adresse IP est récupérée, placée dans un fichier texte, puis le .cdb est reconstruit.
Il ne faut pas, bien entendu, que cette adresse IP reste éternellement dans la liste des adresses autorisées, aussi, une tâche "cron" devra faire le ménage régulièrement.
Cette méthode est tout de même très dangereuse. Il suffit qu'un compte POP soit connu d'une personne non autorisée pour que votre serveur devienne un "open-relay".
L'autre solution, que nous adopterons ici, est que l'utilisateur s'authentifie auprès du serveur SMTP via TLS/SSL.
Il y a une grande quantité d'options de compilation, que l'on peut lister par la commande :
./configure --help :
Les options surlignées :
cd /usr/local/src/vpopmail-5.4.17 ./configure --help `configure' configures vpopmail 5.4.13 to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking Speeds up one-time builds --enable-dependency-tracking Do not reject slow dependency extractors --enable-qmaildir=DIR Directory where qmail control and user directories are installed /var/qmail. --enable-qmail-newu=PATH Full path to qmail-newu program. --enable-qmail-inject=PATH Full path to qmail-inject program. --enable-qmail-newmrh=PATH Full path to qmail-newmrh program. --enable-vpopuser=USER User name allocated to vpopmail vpopmail. --enable-vpopgroup=GROUP Group name allocated to vpopmail vchkpw. --enable-roaming-users Enable POP-before-SMTP functionality. --enable-tcprules-prog=PATH Full path to tcprules program /usr/{local/}bin/tcprules. --enable-tcpserver-file=PATH File where tcpserver -x relay information is stored /home/vpopmail/etc/tcp.smtp. --disable-rebuild-tcpserver-file Disable rebuilding of tcpserver relay control file. --enable-relay-clear-minutes=# Expire time for roaming users after pop authentication [180]. --enable-learn-passwords If no password is stored for a user, learn it the first time they authenticate. --disable-md5-passwords Use DES crypt() instead of MD5 encryption for passwords. --disable-file-locking Don't use file locking. --enable-file-sync Enable file sync after each message is delivered. --disable-make-seekable Don't try to make input to vdelivermail seekable. --disable-clear-passwd Don't store a cleartext version of the password in addition to the encrypted version. --disable-users-big-dir Disable hashing of user directories. --enable-sqwebmail-pass Store a copy of the user's password in the the user's maildir for use by pre-v3 sqwebmail. --enable-qmail-ext Enable qmail email address extension support. --enable-ip-alias-domains Enable mapping of default domain via reverse ip lookup table. --enable-domains-dir=TEXT Set domains directory name for ~vpopmail/domains/user/. --enable-incdir=DIR Your MySQL/Oracle 'include' directory. --enable-libdir=DIR Your MySQL/Oracle 'lib' directory. --enable-auth-module=MOD Nominate how to store the vpopmail account information (cdb (default), mysql, pgsql, ldap, oracle, sybase, or activedir). --enable-passwd Enable /etc/passwd (or shadow) accounts in addition to virtual domains. --enable-logging=OPT Log to syslog: n=nothing, e=errors only (default), y=all attempts, p=errors with passwords, v=verbose (all attempts, with passwords). --enable-log-name=TEXT Set syslog name vpopmail. --disable-auth-logging Don't record time and ip of last auth attempt. Valid only for CDB, MySQL, PGSQL, LDAP, ActiveDir. --enable-sql-logging Enable authentication logging to MySQL/Postgres. --enable-mysql-limits Use MySQL to store limits instead of .qmailadmin-limits files. --enable-mysql-replication Enable support for replicated MySQL auth servers. --enable-valias Store email aliases in MySQL. --disable-many-domains Creates a table for each virtual domain instead of storing all users in a single table. Only valid for MySQL and PostgreSQL Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations.
Comme ce sont des options de compilation, il faut bien réfléchir à ce que l'on veut faire et aussi à ce que l'on ne veut pas faire. En effet, un oubli ou une erreur se traduiront obligatoirement par une recompilation.
Voici la liste des options retenues dans cet exposé :
--prefix=/home/vpopmail --enable-logging=v
Allons-y :
./configure \ --prefix=/home/vpopmail \ --enable-logging=v
Si tout se passe bien, en fin de configuration, vous devez obtenir quelque chose de la forme :
vpopmail 5.4.17 Current settings --------------------------------------- vpopmail directory = /home/vpopmail uid = 89 gid = 89 roaming users = OFF --disable-roaming-users (default) password learning = OFF --disable-learn-passwords (default) md5 passwords = ON --enable-md5-passwords (default) file locking = ON --enable-file-locking (default) vdelivermail fsync = OFF --disable-file-sync (default) make seekable = ON --enable-make-seekable (default) clear passwd = ON --enable-clear-passwd (default) user dir hashing = ON --enable-users-big-dir (default) address extensions = OFF --disable-qmail-ext (default) ip alias = OFF --disable-ip-alias-domains (default) auth module = cdb --enable-auth-module=cdb (default) auth inc = -Icdb auth lib = system passwords = OFF --disable-passwd (default) pop syslog = log success and errors including passwords --enable-logging = v auth logging = ON --enable-auth-logging (default)
Une fois la configuration terminée, il faut compiler et installer :
make make install-strip
Un petit moment après, Vpopmail devrait être installé dans /home/vpopmail
ls -l /home/vpopmail total 4 drwxr-xr-x 2 vpopmail vchkpw 4096 2006-01-01 16:55 bin drwxr-xr-x 4 vpopmail vchkpw 36 2006-01-01 16:55 doc drwx------ 2 vpopmail vchkpw 6 2006-01-01 16:55 domains drwxr-xr-x 2 vpopmail vchkpw 58 2006-01-01 16:55 etc drwxr-xr-x 2 vpopmail vchkpw 92 2006-01-01 16:55 include drwxr-xr-x 2 vpopmail vchkpw 26 2006-01-01 16:55 lib
Bon, les binaires ne seront pas dans le PATH. Ca peut s'arranger, mais nous verrons que ce n'est pas si grave. Les commandes de Vpopmail ne servent pas tous les jours et seront manipulées soit par l'administrateur, soit par un script cgi qu'il suffira de construire correctement.
Il est intéressant de voir vchkpw s'exécuter toujours par vpopmail. Mettons-lui un SUID :
chmod u+s /home/vpopmail/bin/vchkpw
Avant de toucher à quoi que ce soit, voyons le contenu de /var/qmail/control :
ls -l /var/qmail/control/ total 28 -rw-r--r-- 1 root root 3 2006-02-25 16:00 concurrencyincoming -rw-r--r-- 1 root root 11 2006-02-25 15:58 defaultdelivery -rw-r--r-- 1 root root 11 2006-02-25 15:56 defaultdomain -rw-r--r-- 1 root root 17 2006-02-25 15:56 locals -rw-r--r-- 1 root root 17 2006-02-25 15:56 me -rw-r--r-- 1 root root 11 2006-02-25 15:56 plusdomain -rw-r--r-- 1 root root 17 2006-02-25 15:56 rcpthosts
Et créons un nouveau domaine :
cd /home/vpopmail/bin ./vadddomain maison.mrs Please enter password for postmaster: enter password again:
La commande vadddomain permet de créer un nouveau domaine virtuel (ici maison.mrs). Dans la foulée, il est demandé un mot de passe pour le "postmaster" de ce domaine. Allons voir...
cd /home/vpopmail/domains/ ls maison.mrs cd maison.mrs/ ls postmaster vpasswd vpasswd.cdb
Nous avons bien un répertoire "maison.mrs" et dedans, un répertoire "postmaster".
cd postmaster/ ls lastauth Maildir cd Maildir/ ls cur new tmp
postmaster dispose d'un répertoire "Maildir" avec déjà tout ce qu'il faut dedans.
Voyons du côté de Qmail si des choses ont changé dans le répertoire de contrôle :
cd /var/qmail/control ls -l total 32 -rw-r--r-- 1 root root 3 2006-02-25 16:00 concurrencyincoming -rw-r--r-- 1 root root 11 2006-02-25 15:58 defaultdelivery -rw-r--r-- 1 root root 11 2006-02-25 15:56 defaultdomain -rw-r--r-- 1 root root 17 2006-02-25 16:22 locals -rw------- 1 root root 0 2006-02-25 16:22 locals.lock -rw-r--r-- 1 root root 17 2006-02-25 15:56 me -rw-r--r-- 1 root root 11 2006-02-25 15:56 plusdomain -rw-r--r-- 1 root root 28 2006-02-25 16:22 rcpthosts -rw------- 1 root root 0 2006-02-25 16:22 rcpthosts.lock -rw-r--r-- 1 root root 22 2006-02-25 16:22 virtualdomains -rw------- 1 root root 0 2006-02-25 16:22 virtualdomains.lock
Visiblement locals et rcpthosts ont été modifiés, virtualdomains a été ajouté. Plutôt bon signe...
cat locals janus.maison.mrs cat rcpthosts janus.maison.mrs maison.mrs cat virtualdomains maison.mrs:maison.mrs
Rien de nouveau dans locals, mais le nouveau domaine apparaît dans les deux autres fichiers.
Maintenant que Vpopmail est en place, nous allons pouvoir en finir avec Qmail.
Commençons par indiquer au tcpserver que la machine locale est autorisée à envoyer des messages :
mkdir /etc/tcp echo '127.0.0.1:allow,RELAYCLIENT=""' > /etc/tcp/smtp echo ':deny' >> /etc/tcp/smtp
En français, cela veut dire que l'adresse "locale" est autorisée à se connecter au serveur, et qu'elle dispose du "flag" RELAYCLIENT, c'est à dire que les messages issus de cette adresses peuvent être relayés vers d'autres domaines, la seconde ligne indique que toutes les autres adresses IP sont refusées.
Il faudra y revenir par la suite, en fonction de ce que nous voulons autoriser ou non.
N'oublions pas que /etc/tcp/smtp n'est qu'un fichier texte qui doit servir à construire une base de données au format cdb. C'est le moment d'utiliser notre script qmailctl :
qmailctl cdb
et vérifions le résultat :
# ls -l /etc/tcp total 8 -rw-r--r-- 1 root root 37 2007-04-17 14:00 smtp -rw-r--r-- 1 root root 2121 2007-04-17 14:00 smtp.cdb
Ca fonctionne.
Nous pouvons maintenant démarrer les services de Qmail :
ln -s /var/qmail/supervise/qmail-send /service
Et vérifier que les services concernés ont bien démarré (il faut attendre quelques secondes, tout de même) :
ps -aef | grep qmail root 10501 5347 0 10:12 ? 00:00:00 supervise qmail-send qmails 10502 10501 0 10:12 ? 00:00:00 qmail-send root 10505 10502 0 10:12 ? 00:00:00 qmail-lspawn ./Maildir/ qmailr 10506 10502 0 10:12 ? 00:00:00 qmail-rspawn qmailq 10507 10502 0 10:12 ? 00:00:00 qmail-clean qmails 10508 10502 0 10:12 ? 00:00:00 qmail-todo qmailq 10509 10502 0 10:12 ? 00:00:00 qmail-clean
Ca fonctionne. Notez que le service de logs a démarré lui aussi. Nous pouvons ajouter le lien pour smtpd :
ln -s /var/qmail/supervise/qmail-smtpd /service
Je vous laisse refaire un ps -aef pour vérifier, si vous êtes d'un naturel incrédule.
Voyons tout de même si le port intéressant (smtp) est bien à l'écoute :
netqmail-1.05# netstat -a | grep :smtp tcp 0 0 *:smtp *:* LISTEN
qmailctl stat /service/qmail-send: up (pid 12322) 1450 seconds /service/qmail-send/log: up (pid 12321) 1450 seconds /service/qmail-smtpd: up (pid 12333) 1115 seconds /service/qmail-smtpd/log: up (pid 12337) 1115 seconds messages in queue: 0 messages in queue but not yet preprocessed: 0
Nous utilisons (et utiliserons) TLS/SSL en divers endroits (éventuellement stunnel pour pop3s, authentification TLS sur qmail-smtpd...), mais TLS/SSL sans certificats, ça risque de moins bien fonctionner...
Le Makefile situé dans /usr/local/src/qmail-1.03-jms1.6cd permet de le réaliser :
cd /usr/local/src/qmail-1.03-jms1.6cd make cert Generating a 1024 bit RSA private key ............++++++ ......++++++ writing new private key to '/var/qmail/control/servercert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:France Locality Name (eg, city) []:Marseille Organization Name (eg, company) [Internet Widgits Pty Ltd]:maison Organizational Unit Name (eg, section) []:r&d Common Name (eg, YOUR name) []:janus.maison.mrs Email Address []:postmaster@maison.mrs
Bien entendu, l'idéal serait, en production, de disposer de "vrais" certificats (garantis par une autorité).
cd /home/vpopmail/bin/
./vadduser prof@maison.mrs
Please enter password for prof@maison.mrs:
enter password again:
cd /home/vpopmail/domains/maison.mrs/
ls
postmaster prof vpasswd vpasswd.cdb
le répertoire du nouvel utilisateur est créé. Voyons vpasswd :
cat /home/vpopmail/domains/maison.mr/vpasswd postmaster:$1$uo.KFcKT$kM3r1DxqSN6CZP0l6TPsu.:1:0:Postmaster:/home/vpopmail/domains/maison.mrs/postmaster:NOQUOTA:password prof:$1$IiZONKsF$bV3K4FcNR0Zw/eF7b2/ZH0:1:0:prof:/home/vpopmail/domains/maison.mrs/prof:NOQUOTA:password
Le "password" en fin de ligne, c'est le mot de passe du compte (peu original et ambigu, je l'avoue). Le mot de passe apparaît en clair, on a compilé Vpopmail avec cette option. On peut faire autrement, mais comme l'on sait que les utilisateurs peuvent oublier leur mot de passe...
Le lecteur attentif aura constaté qu'il n'y a pas de quota sur ces boîtes. Il est possible, bien sûr d'en fixer un, avec la commande :
vsetuserquota [email address] [quota in bytes]
./vsetuserquota prof@maison.mrs 10000000
cat /home/vpopmail/domains/maison.mrs/vpasswd
postmaster:$1$uo.KFcKT$kM3r1DxqSN6CZP0l6TPsu.:1:0:Postmaster:/home/vpopmail/domains/maison.mrs/postmaster:NOQUOTA:password
prof:$1$IiZONKsF$bV3K4FcNR0Zw/eF7b2/ZH0:1:0:prof:/home/vpopmail/domains/maison.mrs/prof:10000000S:password
Dans chaque domaine virtuel créé, nous trouvons un fichier intitulé .qmail-default. Ce fichier contient normalement ceci :
cat .qmail-default | /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox
Ce fichier est bien entendu fondamental. Lorsqu'un message arrive à destination du domaine en question, Qmail transmet à vdelivermail, qui placera le message dans la boîte du destinataire si elle existe (ou vers ce qui sera indiqué dans un fichier .qmail-<user> si il existe), ou retournera le message à l'expéditeur si le destinataire n'existe pas.
Il est par exemple possible de modifier ce fichier comme suit :
| /home/vpopmail/bin/vdelivermail '' delete
Dans ce cas, un message à un destinataire inconnu sera simplement détruit et non renvoyé à l'émetteur. Ce n'est pas très correct. Malheureusement, avec la floraison de spams qui ciblent des destinataires forgés au hasard, et postés depuis un émetteur dont l'adresse est elle même falsifiée, ça évite une série de "bounces" inutiles.
Voyez http://www.inter7.com/vpopmail/doc/vdelivermail.html pour plus de détails sur vdelivermail.
Nous aurons l'occasion de revenir sur ces fichiers de type .qmail-xxx à propos des listes de diffusion et aussi de la gestion des spams.