Installation d'un serveur Postfix et Courier-Imap

Ce document présente l'installation d'un serveur Postfix utilisé avec une base d'utilisateurs virtuels gérée par Courier-utils. L'accès aux boîtes se fait en Imap avec Courier-Imap. Tous les courriels sont visés par le couple antispam-antivirus formé par SpamAssassin et ClamAV. L'authentification sur le serveur se fera grâce Cyrus SASL 2.

Cyrus-SASL

Installation

Cyrus-SASL utilise différents backends pour faire son travail d'authentification. Utilisant Courier-Imap et une base userdb, nous allons utiliser le backend authdaemond. Pour cela nous devons indiquer les bonnes options de compilations au Makefile du port du logiciel qui n'a pas ce backend par défaut

Extrait du Makefile :

CONFIGURE_ARGS+=        --with-saslauthd="/var/sasl2" \
                        --with-authdaemon \
                        --with-authdaemond="/var/run/courier-imap" \
                        --enable-gssapi="/usr" \
                        --with-gss_impl="heimdal" \
                        --enable-login \
                        --enable-plain \
                        --enable-static \
                        --disable-sample

J'ai rajouté les deux lignes contenant "authdaemon" et "authdaemond", la deuxième indiquant l'endroit où "authdaemond" doit viser la socket de courier-imap.

Configuration

Maintenant que Cyrus-SASL est compilé et installé, vous devez créer le fichier /usr/local/lib/sasl2/smtpd.conf qui doit contenir ceci :

mech_list: plain login
pwcheck_method: authdaemond
authdaemond_path: /var/run/courier-imap/socket
auto_transition: no

Postfix

Installation

Avant d'installer le serveur et comme nous allons utiliser le protocole smtp dans sa version sécurisée, nous devons tout d'abord rajouter au fichier /etc/services le port sur lequel se situe le smtps, habituellement le 465. Rajoutez donc les lignes suivantes :

$ grep 465 /etc/services                                                       
smtps           465/tcp
smtps           465/udp

Maintenant installez Postfix comme vous en avez l'habitude :

$ cd /usr/ports/mail/postfix/snapshot
$ make show=FLAVORS
sasl2 ldap mysql pgsql 
$ env FLAVOR="sasl2" sudo make install clean-depends

Attention, suivez bien les recommandations post-installation. D'abord commentez, dans la crontab de root la ligne suivante :

# sendmail clientmqueue runner
#*/30 * * * * /usr/sbin/sendmail -L sm-msp-queue -Ac -q

Puis validez Postfix en tant que MTA par défaut :

$ sudo /usr/local/sbin/postfix-enable

Enfin, rajoutez ces deux lignes dans /etc/rc.conf.local :

sendmail_flags="-bd -q30m" 
syslogd_flags="-a /var/spool/postfix/dev/log"

Configuration

Editez le fichier /etc/postfix/main.cf comme suit en remplaçant les paramètres à votre convenance (le fichier est commenté) :

#
# utilisateur et groupe de Postfix
#
mail_owner = _postfix
setgid_group = _postdrop

#
# paths
#
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/sbin/newaliases
mailq_path = /usr/local/sbin/mailq
html_directory = /usr/local/share/doc/postfix/html
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = /usr/local/share/doc/postfix/readme

#
# comme le domaine est virtuel (cf. plus bas) son nom ne doit pas
# apparaître dans $mydestination, ce paramètre est donc
# réduit à la part congrue
#
myhostname = mail.domain.com
myorigin = domain.com
mydestination = localhost.localdomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8

#
# configuration de local
#
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
home_mailbox = Maildir/
unknown_local_recipient_reject_code=450

#
# respect de la RFC
#
smtpd_banner = $myhostname ESMTP $mail_name

#
# debug
#
debug_peer_level = 1
debug_peer_list = 127.0.0.1
debugger_command =
	PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
	echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
	>$config_directory/$process_name.$process_id.log & sleep 5

#
# paramètres sasl
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

#
# paramètres de smtpd, restrictions par authentification
#
smtpd_recipient_restrictions = permit_sasl_authenticated,
     permit_mynetworks, reject_unauth_destination
smtpd_clients_restrictions = permit_sasl_authenticated,
     permit_mynetworks, reject_unauth_destination

# table contenant les utilisateurs virtuels autorisés à
# se connecter, vous devrez placer le nom de chacun des utilisateurs
# nouvellement créé dans cette table
smtpd_sender_login_maps = hash:/etc/postfix/virtual/login_maps
smtpd_sender_restrictions = reject_sender_login_mismatch

#
# paramètres TLS
#
smtpd_use_tls                        =   yes
smtpd_tls_key_file                   =   /etc/postfix/ssl/smtpd.pem
smtpd_tls_cert_file                  =   /etc/postfix/ssl/smtpd.pem
smtpd_tls_CAfile                     =   /etc/postfix/ssl/smtpd.pem
smtpd_tls_CApath                     =   /etc/postfix/ssl
smtpd_tls_loglevel                   =   1
smtpd_tls_auth_only                  =   yes
smtpd_tls_session_cache_database     =   btree:/etc/postfix/smtpd_scache
smtpd_tls_session_cache_timeout      =   3600s
tls_daemon_random_source             =   dev:/dev/urandom

#
# les mails entrant sont forwardés au daemon amavis celui-ci
# les redonne à postfix une fois analysés grâce au
# protocole lmtp, toujours sur localhost
#
content_filter = smtp-amavis:[127.0.0.1]:10024

#
# virtualisation des comptes, aliases, redirections et des domaines.
# Le transport, virtuel, se fait par maildrop utilisé surtout
# pour dispatcher les messages marqués par SpamAssassin dans
# les boîtes "Junk"
#
maildrop_destination_recipient_limit = 1
virtual_transport = maildrop

# virtual_mailbox_domains contient tous les domaines acceptés
# soit directement soit dans un fichier db/dbm, ici la première
# solution a été choisie
virtual_mailbox_domains = domain.com
virtual_mailbox_base = /home/vmail

# table contenant toutes les boîtes mails des utilisateurs
virtual_mailbox_maps = hash:/etc/postfix/virtual/virtual_mailbox

# table contenant les alias et les redirections des comptes mails
virtual_alias_maps = hash:/etc/postfix/virtual/virtual_alias
virtual_uid_maps = static:1018
virtual_gid_maps = static:1018
virtual_minimum_uid = 1000
virtual_mailbox_limit = 0

Passons au fichier /etc/postfix/master.cf. Il a été choisi de chrooter au maximum Postfix, aussi faites attention, si vous avez la moindre erreur après, cela viendra certainement du chroot. Je vous conseille d'abord de le désactiver (en changeant les "y" en "n") puis de l'activer progressivement en vérifiant les logs.

#
# Postfix master process configuration file.  For details on the format
# of the file, see the Postfix master(5) manual page.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
submission inet n       -       y       -       -       smtpd
	-o smtpd_etrn_restrictions=reject
	-o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps    inet   n       -       y       -       -       smtpd
  -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
submission inet n       -       y       -       -       smtpd
  -o smtpd_etrn_restrictions=reject
  -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      fifo  n       -       y       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
tlsmgr    unix  -       -       n       300	1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       y       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       y       -       -       smtp
	-o fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache	  unix	-	-	y	-	1	scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

# Amavis
smtp-amavis unix -      -       -       -       2  lmtp
    -o smtp_data_done_timeout=1200
    -o disable_dns_lookups=yes

127.0.0.1:10025 inet n  -       -       -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes

Vous devez maintenant générer le certificat TLS du serveur :

$ sudo mkdir /etc/postfix/ssl
$ cd /etc/postfix/ssl
$ sudo openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 365

Comme nous avons chrooté postfix nous devons créer les répertoires concernant Cyrus-SASL dans l'arborescence de Postfix et y placer les fichiers adéquats :

$ cd /var/spool/postfix/usr
$ sudo mkdir -p lib/sasl2
$ cd  lib/sasl2
$ sudo cp -p /usr/local/lib/sasl2/* .

Enfin, créez l'utilisateur vmail dont le répertoire contiendra les mails par domaine et utilisateur :

$ sudo groupadd -g 1018 vmail
$ sudo useradd -d /home/vmail -s /sbin/nologin -u 1018 -g vmail vmail

Courier-Imap

Installation

Procédez comme suit :

$ cd /usr/ports/mail/courier-imap
$ make show=FLAVORS
 no_mysql no_ldap no_pgsql
$ env FLAVOR="no_mysql no_ldap no_pgsql" sudo make install clean-depends

Copiez les fichiers de configurations :

$ sudo cp -R /usr/local/share/examples/courier-imap/ /etc/

Configuration

Editez tout d'abord le fichier /etc/courier-imap/authdaemonrc :

# backend authuserdb pour une base d'utilisateur userdb
authmodulelist="authuserdb"
authmodulelistorig="authcustom authcram authuserdb authldap authpwd"
daemons=5
version=""
authdaemonvar=/var/run/courier-imap

Puis le fichier /etc/courier-imap/imapd-ssl :

SSLPORT=993
SSLADDRESS=0
SSLPIDFILE=/var/run/imapd-ssl.pid

IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=1

COURIERTLS=${bindir}/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/etc/ssl/private/imapd.pem
TLS_VERIFYPEER=NONE

Enfin adaptez le fichier /etc/courier-imap/imapd.cnf avec vos paramètres afin de générer convenablement vos certificats comme suit :

$ sudo /usr/local/sbin/mkimapdcert
$ sudo /usr/local/sbin/mkpop3dcert

Maildrop et Courier-utils

Maildrop

Maildrop est un remplaçant de procmail lorsque vous employez une base d'utilisateurs virtuels, nous l'utilisons ici afin de placer tous les messages marqués par SpamAssassin dans un folder Imap nommé "Junk".

Installation :

$ cd /usr/ports/mail/maildrop
$ sudo make install clean-depends

Configuration :

Attention de bien lire le fichier /usr/ports/mail/maildrop/pkg/SECURITY. Avec cette config vous aurez besoin de setuid et de setgid le binaire de maildrop.

$ sudo chmod ug+s /usr/local/bin/maildrop
$ cat /etc/maildroprc                                                          
logfile "/home/vmail/maildrop.log"
VERBOSE="5"
log "========"

if ( /^X-Spam-Flag: YES/ )
{
log "---------------------------------------------------------- Spam general."
to "Maildir/.Junk"
}

Courier-utils

Courier-utils nous servira à créer les utilisateurs, ainsi que les folders et sous-folders des maildirs pour chaque compte mail. Ce logiciel est un SUBPACKAGE de maildrop.

$ pwd
/usr/ports/mail/maildrop
$ env SUBPACKAGE="-utils" sudo make install clean-depends

Amavisd-new

Lorsque Postfix reçoit un mail, il le passe à Amavisd grâce au protocole "lmtp". Alors amavisd le fera passer par les moulinettes de SpamAssassin et ClamAV.

Installation :

$ cd /usr/ports/mail/amavisd-new
$ sudo make install clean-depends

Configuration :

Le fichier de configuration se situe dans /etc/. Vous trouverez un fichier exemple dans /usr/local/share/doc/amavisd-new. Copiez-le et éditez-le. Je montre plus bas un exemple de fichier non-commenté (le fichier est long) de amavisd.conf. Vous trouverez les commentaires dans l'original sur votre système. Nous n'avons pas chrooté amavisd dans cette première version du document.

$ sudo cp /usr/local/share/doc/amavisd-new/amavisd.conf /etc/
$MYHOME = '/var/amavisd';
$mydomain = 'domain.com';
$myhostname = 'mail.domain.com';

$daemon_user  = '_vscan';
$daemon_group = '_vscan';

$TEMPBASE = $MYHOME;
$ENV{TMPDIR} = $TEMPBASE;

$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;

$max_servers  =  2;
$max_requests = 10;

$child_timeout=5*60;

@local_domains_acl = qw( ".$mydomain" );

$unix_socketname = "$MYHOME/amavisd.sock";

$inet_socket_port = 10024;

@inet_acl = qw( 127.0.0.1 );

$DO_SYSLOG = 1;
$LOGFILE = "/var/log/amavis.log";
$log_level = 0;
$log_templ = '[? %#V |[? %#F |[?%#D|Not-Delivered|Passed]|BANNED name/type (%F)]|INFECTED (%V)],
<%o> -> [<%R>|,][? %i ||, quarantine %i], Message-ID: %m, Hits: %c';

$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_REJECT;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

$viruses_that_fake_sender_re = new_RE(
  qr'nimda|hybris|klez|bugbear|yaha|braid|sobig|fizzer|palyh|peido|holar'i,
  qr'tanatos|lentin|bridex|mimail|trojan\.dropper|dumaru|parite|spaces'i,
  qr'dloader|galil|gibe|swen|netwatch|bics|sbrowse|sober|rox|val(hal)?la'i,
  qr'frethem|sircam|be?agle|tanx|mydoom|novarg|shimg|netsky|somefool|moodown'i,
  qr'@mm|@MM',    # mass mailing viruses as labeled by f-prot and uvscan
  qr'Worm'i,      # worms as labeled by ClamAV, Kaspersky, etc
  [qr'^(EICAR|Joke\.|Junk\.)'i         => 0],
  [qr'^(WM97|OF97|W95/CIH-|JS/Fort)'i  => 0],
  [qr/.*/ => 1],  # true by default  (remove or comment-out if undesired)
);

$virus_admin = "postmaster\@$mydomain";

$mailfrom_to_quarantine = '';

$QUARANTINEDIR = '/var/amavisd/quarantine';

# Add X-Virus-Scanned header field to mail?
$X_HEADER_TAG = 'X-Virus-Scanned';
# Leave empty to add no header field	# (default: undef)
$X_HEADER_LINE = "by amavisd-new at $mydomain";

$undecipherable_subject_tag = '***UNCHECKED*** ';

$remove_existing_x_scanned_headers = 0;
$remove_existing_spam_headers = 0;

$keep_decoded_original_re = new_RE(
  qr'^MAIL-UNDECIPHERABLE$',
  qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
);

$banned_filename_re = new_RE(
   qr'\.[^.]*\.(exe|vbs|pif|scr|bat|cmd|com|dll)$'i,
   qr'^\.exe$'i,
   qr'^application/x-msdownload$'i,
   qr'^application/x-msdos-program$'i,
);

$sql_select_white_black_list = undef;

$recipient_delimiter = '+';

$localpart_is_case_sensitive = 0;

$MAXLEVELS = 14;
$MAXFILES = 1500;

$MIN_EXPANSION_QUOTA =      100*1024;
$MAX_EXPANSION_QUOTA = 300*1024*1024;
$MIN_EXPANSION_FACTOR =   5;
$MAX_EXPANSION_FACTOR = 500;

$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin';

$file   = 'file';
$gzip   = 'gzip';
$bzip2  = 'bzip2';
$lzop   = 'lzop';
$uncompress = ['uncompress', 'gzip -d', 'zcat'];
$unfreeze   = ['unfreeze', 'freeze -d', 'melt', 'fcat'];
$arc        = ['nomarch', 'arc'];
$unarj      = ['arj', 'unarj'];
$unrar      = ['rar', 'unrar'];
$zoo    = 'zoo';
$lha    = 'lha';
$cpio   = ['gcpio','cpio'];


# SpamAssassin settings

$sa_local_tests_only = 1;

$sa_timeout = 30;
$sa_mail_body_size_limit = 150*1024;

$sa_tag_level_deflt  = 3.0;
$sa_tag2_level_deflt = 5.0;
$sa_kill_level_deflt = 6.3;

$sa_dsn_cutoff_level = 10;


# ClamAV settings

@av_scanners = (

# ### http://www.clamav.net/
['Clam Antivirus-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/tmp/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# # NOTE: run clamd under the same user as amavisd;  match the socket
# # name (LocalSocket) in clamav.conf to the socket name in this entry
# # When running chrooted one may prefer: ["CONTSCAN {}\n","$MYHOME/clamd"],

);

1;

ClamAV

Installation :

ClamAV est depuis très récemment dans les ports :

$ cd /usr/ports/security/clamav
$ sudo make install clean-depends

Configuration :

Créez et éditez le fichier /etc/clamd.conf :

LogFile /var/log/clamd.log
LogSyslog
PidFile /var/run/clamd.pid
DatabaseDirectory /var/clamav
LocalSocket /tmp/clamd
FixStaleSocket
SelfCheck 3600
User _vscan
ScanMail
ScanHTML
ScanArchive

Créez et éditez le fichier /etc/freshclam.conf :

DatabaseDirectory /var/clamav
UpdateLogFile /var/log/freshclam.log
LogSyslog
DatabaseOwner _vscan
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.fr.clamav.net
DatabaseMirror database.clamav.net
MaxAttempts 5
UpdateLogFile /var/log/freshclam.log
LogSyslog
DatabaseOwner _vscan
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.fr.clamav.net
DatabaseMirror database.clamav.net
MaxAttempts 5
NotifyClamd
NotifyClamd /etc/clamd.conf

Si le répertoire /var/clamav n'existe pas créez-le. Et changez l'utilisateur et le groupe d'appartenance comme indiqué dans les fichiers de configuration précédents :

$ sudo mkdir /var/clamav
$ sudo chown -R _vscan:_vscan /var/clamav

Lancement des services

Edition de /etc/rc.local

Chacun des services susmentionnés doit être lancé à partir de /etc/rc.local. Placez les commandes suivantes à la fin du fichier original.

# Clamav
if [ -x /usr/local/sbin/clamd ]; then
    echo -n ' clamd'; /usr/local/sbin/clamd
fi

# Amavisd
if [ -x /usr/local/sbin/amavisd ]; then
    echo -n ' amavisd'; /usr/local/sbin/amavisd start
fi

# Freshclam
if [ -x /usr/local/bin/freshclam ]; then
    echo -n ' freshclam'; /usr/local/bin/freshclam -d
fi

# Préparation Courier
if [ ! -d /var/run/courier-imap ]; then
    mkdir /var/run/courier-imap
fi

# Tout comme pour Cyrus-SASL, Courier-Imap doit être
# présent dans le chroot afin que l'authentification
# fonctionne. Nous créons donc le répertoire
# nécessaire au lancement puis nous faisons un lien hard de la
# socket
if [ ! -d /var/spool/postfix/var/run/courier-imap ]; then
        mkdir -p /var/spool/postfix/var/run/courier-imap
fi

# Authdaemond
if [ -x /usr/local/libexec/authlib/authdaemond ]; then
        echo -n ' authdaemond'; /usr/local/libexec/authlib/authdaemond start
        ln /var/run/courier-imap/socket /var/spool/postfix/var/run/courier-imap/
fi

# imapd-ssl
if [ -x /usr/local/libexec/imapd-ssl.rc ]; then
    echo -n ' courier-imap'; /usr/local/libexec/imapd-ssl.rc start
fi

Edition de /etc/rc.shutdown

Afin que vous terminiez les services proprement lors de l'extinction du système, remplissez le fichier /etc/rc.shutdown comme suit :

# Préparation Courier
if [ -d /var/run/courier-imap ]; then
    rm -rf /var/run/courier-imap
fi
if [ ! -d /var/spool/postfix/var/run/courier-imap ]; then
        rm -rf /var/spool/postfix/var/run/courier-imap
fi

# Authdaemond
if [ -x /usr/local/libexec/authdaemond ]; then
    echo -n ' stopping imapd'; /usr/local/libexec/authlib/authdaemond stop
fi

# imapd-ssl
if [ -x /usr/local/libexec/imapd-ssl.rc ]; then
    echo -n ' stopping courier-imap'; /usr/local/libexec/imapd-ssl.rc stop
fi

# freshclam
if [ -x /usr/local/bin/freshclam ]; then
        echo -n ' stopping freshclam'; /usr/bin/pkill freshclam
fi

# amavisd
if [ -x /usr/local/sbin/amavisd ]; then
        echo -n ' stopping amavis'; /usr/local/sbin/amavisd stop
fi

# clamd
if [ -x /usr/local/sbin/clamd ]; then
        echo -n ' stopping clamd'; /usr/bin/pkill clamd
fi

Gestion des comptes

Dans cette dernière section, nous allons voir comment ajouter ou supprimer un compte email, un alias, une redirection et un domaine.

Courier-utils permet de scripter facilement la création et la suppression d'un compte. Je ne vous donnerez pas, dans ce qui suit, un script tout fait, libre à vous de faire comme vous le souhaitez. Néanmoins nous verrons quelles commandes utiliser.

Créer/Supprimer un compte dans la base

Pour gérer la base d'utilisateurs virtuels vous utiliserez les commandes userdb, userdbpw et makeuserdb. La première crééra le compte dans la base, la seconde attribuera un mot-de-passe au compte tandis que la troisième mettra à jour la base.

Dans un premier temps, nous devons créer le répertoire contenant la base :

$ cd /etc
$ sudo mkdir userdb
$ sudo chmod 0 userdb

Créons le compte toto pour le domaine domain.com :

$ sudo userdb domain.com/toto@domain.com set \
> home=/home/vmail/domain.com/toto \
> mail=/home/vmail/domain.com/toto/Maildir \
> uid=1018 \
> gid=1018

Le mot-de-passe du compte :

# echo monSuperMotDePasse | \
> userdbpw -md5 | \
> userdb domain.com/toto@domain.com \
> set systempw

Enfin, on met-à-jour la base :

$ sudo makeuserdb

Vous devriez voir quelque chose de similaire sous /etc :

$ pwd
/etc
$ ls -l | grep userdb
d---------  2 root  wheel        512 May 27 16:02 userdb
-rw-r--r--  1 root  wheel      49643 May 27 16:01 userdb.dat
-rw-r--r--  1 root  wheel          0 May 27 16:01 userdb.lock
-rw-------  1 root  wheel      49305 May 27 16:01 userdbshadow.dat

Sous les jupes de vmail

Tout d'abord, sous /home/vmail vous trouverez une arborescence contenant sur un premier niveau le ou les domaine(s) et sur un second niveau les boîtes de chaque compte. Tout doit être récursivement placé sous les droits de l'utilisateur et du groupe vmail. Exemple :

$ sudo ls -lR /home/vmail
total 204
drwx------  6 vmail  vmail     512 May 27 16:05 domain.com

/home/vmail/domain.com:
total 16
drwx------  3 vmail  vmail  512 May 27 23:13 toto
drwx------  3 vmail  vmail  512 May 27 23:14 tata

Pour chaque domaine géré, vous devrez créer le répertoire correspondant au domaine. Et pour chaque compte vous créérez la Maildir et les sous-folders adéquats.

# cd /home/vmail
# mkdir domain.com
# cd domain.com
# mkdir toto tata
# cd toto
# maildirmake
# ls
Maildir
# ls Maildir
cur new tmp
# maildirmake -f Drafts Maildir/
# maildirmake -f Sent Maildir/
# maildirmake -f Templates Maildir/
# maildirmake -f Junk Maildir/
# cd ../tata

[idem]

# cd /home/vmail/
# chown -R vmail:vmail domain.com
# chmod 700 domain.com
# chmod 700 domain.com/{toto,tata}

Les fichiers virtual_* de Postfix

Dans le fichier de configuration de Postfix, /etc/postfix/main.cf, nous avons déclarer différents fichiers contenant les boîtes aux lettres, les alias et les redirections. Il s'agit des fichiers virtual_mailbox et virtual_alias. Pour chaque compte créé vous devrez ajouter les lignes correspondantes à ces fichiers.

Exemple de fichier virtual_mailbox :

$ cat /etc/postfix/virtual/virtual_mailbox
toto@domain.com          ...quelque chose...
tata@domain.com          ...quelque chose...

Exemple de fichier virtual_alias :

$ cat /etc/postfix/virtual/virtual_alias
# il est obligatoire de mettre une adresse postmaster par domaine
postmaster@domain.com     postmaster

# alias des comptes
toto.titi@domain.com      toto@domain.com
tata.titi@domain.com      tata@domain.com

# redirections d'un compte vers une adresse externe
tata@domain.com           tata@autre-domaine.com

Pour que l'authentification ne soit acceptée, en interne, que pour les comptes virtuels spécifiés dans la base userdb, vous devez remplir le fichier login_maps

$ cat /etc/postfix/virtual/login_maps
toto@domain.com          toto@domain.com
toto.titi@domain.com     toto@domain.com
tata@domain.com          tata@domain.com
tata.titi@domain.com     tata@domain.com

Attention lorsque vous effectuez un changement à l'un de ces fichiers, n'oubliez pas de rehasher celui-ci avec la commande postmap.


Envoyez vos commentaires et suggestions à serge@gakoz.net.