Vpopmail
 27/04/2007
 Christian CALECA 
Liste des cours

Accueil ] [ Daemontools et ucspi-tcp ] [ Qmail & co. ] [ Vpopmail ] [ Essais divers ] [ courier-imap ] [ POP3 ] [ outils admin ] [ Ezmlm-idx ] [ qmailadmin ] [ Filtrage des mails ] [ Livraison locale ] [ Conclusions ]


Présentation rapide

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.

Domaines virtuels

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

Authentification des utilisateurs

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.

Installation

Travaux préliminaires

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

Note

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.

Configuration de la compilation

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

Un premier domaine virtuel

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.

Qmail, démarrage de l'usine

Maintenant que Vpopmail est en place, nous allons pouvoir en finir avec Qmail.

TCPSERVER

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.

Démarrage du système

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

Notes importantes...

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é).

Ajoutons un utilisateur

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

Un peu de mécanique.

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.


Précédente ] [ Accueil ] [ Suivante ]