« Mise en place d'un serveur de mail complet » : différence entre les versions

De Linux Server Wiki
Aller à la navigation Aller à la recherche
Ligne 738 : Ligne 738 :
}
}
</nowiki></pre>
</nowiki></pre>
==Quota==
Pour le support du quota il faut créer les fichiers nécessaires avec <code>maildirmake</code>.
Si la mailbox n'existe pas encore tapez :
<pre>
maildirmake /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org
</pre>
Pour activer le quota pour la mailbox il faut utiliser l'option <code>-q</code> de <code>maildirmake</code>. Pour créer une boite de <code>512 000 000 bytes</code> tapez :
<pre>
maildirmake -q 512000000S /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org
</pre>
Pour créer une boite pouvant contenir un maximum de 1000 fichiers tapez :
<pre>
maildirmake -q 1000C /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org
</pre>
maildrop délivrera un message d'erreur lorsqu'une boite est pleine à un certain pourcentage (défini dans la configuration de postfix). Placez le texte suivant dans <code>/usr/local/courier/etc/quotawarnmsg</code> et assurez vous qu'il soit lisible par vmail :
<pre>
From: Postmaster csnu.org <postmaster@csnu.org>
Reply-To: postmaster@csnu.org
To: Valued Customer:;
Subject: Mail quota warning
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
Your mailbox on the server is now more than 90% full. So that you can continue to receive mail you need to remove some messages from your mailbox.
</pre>
==Intégration à postfix==
Il faut commencer par remplacer <code<virtual<code> par <code>maildrop</code> dans <code>/etc/postfix/main.cf</code> :
<pre>
virtual_transport = maildrop
maildrop_destination_recipient_limit=1
</pre>
Ensuite il faut modifier la configuration de maildrop du fichier <code>/etc/postfix/master.cf</code> :
<pre>
maildrop  unix  -      n      n      -      -      pipe
  flags=DRhu user=vmail argv=/usr/local/courier/bin/maildrop -w 90 -d ${recipient}
</pre>
L'option -w 90 défini qu'il faut avertir l'utilisateur lorsque sa boite mail est pleine à 90%.
==Vérification et redémarrage==
<code>authtest</code> permet de vérifier si l'authentification de courier fonctionne bien :
<pre>
$ authtest test@csnu.org
Authentication succeeded.
    Authenticated: test@csnu.org  (uid 5000, gid 5000)
    Home Directory: /srv/vmail
          Maildir: test@csnu.org/
            Quota: (none)
Encrypted Password: ZHJghD45/gfFDH42
Cleartext Password: (none)
          Options: (none)
</pre>
Ensuite testez maildrop :
<pre>
# /usr/local/courier/bin/maildrop -V 7 -d test@csnu.org
maildrop: authlib: groupid=5000
maildrop: authlib: userid=5000
maildrop: authlib: logname=test@csnu.org, home=/srv/vmail, mail=test@csnu.org/
maildrop: Changing to /srv/vmail
</pre>
Si vous n'avez eu aucune erreur vous pouvez relancer postfix :
<pre>/etc/init.d/postfix restart</pre>

Version du 4 février 2011 à 20:30

Ce tutoriel va vous expliquer comment mettre en place un serveur mail complet pour plusieurs domaines et supportant l'ipv6 sous debian lenny. Les éléments suivants seront utilisés :

  • un serveur smtp : postfix
  • un mail delivery agent (mda) : maildrop
  • un serveur pop/imap : courier
  • un scanneur de contenu : amavis
  • un antispam : spamassassin
  • un antivirus : ClamAV
  • un gestionnaire de mailing list : mailman
  • des webmails : Squirrelmail et roundcube

Afin de gérer facilement les domaines, certains services seront couplés avec MySQL. Pour ceux qui veulent bénéficier du filtrage pour les boites imaps, je vous montrerais aussi comment coupler postfix avec maildrop. En dernier lieu, nous verront rapidement comment configurer un serveur mx secondaire pour vos domaines.

Nous allons mettre en place un service email pour deux domaines : core.csnu.org et csnu.org core.csnu.org représente le serveur en lui-même, et permet de délivrer les mails aux utilisateurs locaux du serveur. csnu.org est ce qu'on appel un domaine virtuel. Nous gèrerons les mails de ce domaine via MySQL.

Au niveau dns, core.csnu.org est le domaine identifiant la machine. Il possède l'adresse ipv4 213.186.47.110 et l'adresse ipv6 2001:41d0:1:d6e::110. csnu.org est un alias pour core.csnu.org.

Les changements de permissions effectués dans ce howto supposent que vous êtes en umask 0027

Champs dns MX

Pour que les mails a destination de vos deux domaines arrivent bien sur votre serveur, il faut configurer des champs dns MX. Pour cela, éditez la zone dns de votre domaine (/srv/bind/csnu.org.hosts dans mon cas) et ajoutez/modifiez les lignes suivantes:

core.csnu.org.  IN      MX      1 core.csnu.org.
csnu.org.       IN      MX      1 core.csnu.org.
core.csnu.org.  IN      A       213.186.47.110
core.csnu.org.  IN      AAAA    2001:41d0:1:d6e::110
list.csnu.org.	IN	CNAME	core.csnu.org.

Si vous n'avez pas d'adresse ipv6 configuré sur votre serveur, vous n'aurez pas besoin du champ AAAA.

Vous pouvez aussi configurer un champ spf. Le spf (Sender Policy Framework) est une mesure antispam permettant aux autres serveurs de savoir quels serveurs ont le droit d'envoyer des mails pour votre domaine. Voici mes champs dns spf :

core.csnu.org.  IN      TXT     "v=spf1 mx -all"
csnu.org.       IN      TXT     "v=spf1 mx ~all"
  • mx signifie que seules les serveurs mx ont le droit d'envoyer des mails pour le domaine en question.
  • ~all signifie que toutes les autres ips n'ont probablement pas le droit d'envoyer de mails.
  • -all signifie que toutes les autres ips n'ont pas le droit d'envoyer de mails.

Postfix

Commençons par installer les différents composants de postfix ainsi que sasl qui nous permettra de gérer le smtp-auth histoire de ne pas laisser notre serveur en open-relay et servir de relai pour le spam.

aptitude install postfix postfix-mysql libsasl2-2 libsasl2-modules sasl2-bin libpam-mysql procmail

Debian vous laissera choisir entre plusieurs configurations pour postfix. Choisissez pas de configuration.

Stoppez les services inutiles pour le moment :

/etc/init.d/postfix stop
/etc/init.d/saslauthd stop

Le fichier de configuration principal de postfix est /etc/postfix/main.cf. Ouvrez le avec votre éditeur de texte et modifiez les lignes suivantes:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes
#strict_rfc821_envelopes = yes
mydomain = core.csnu.org
# ajoute .$mydomain si quelqu'un envoi un mail sans préciser le domaine (utile en local quand vous utilisez la fonction mail)
append_dot_mydomain = yes
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
myhostname = core.csnu.org
alias_maps = proxy:hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = core.csnu.org, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8, [::1]/128, 213.186.47.110, [2001:41d0:1:d6e::110]
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
message_size_limit = 10240000
inet_interfaces = 127.0.0.1, [::1], 213.186.47.110, [2001:41d0:1:d6e::110]
inet_protocols = ipv4, ipv6
#ips à binder pour envoyer des mails via smtp
#smtp_bind_address=213.186.47.110
#smtp_bind_address6=2001:41d0:1:d6e::110

Nous venons de définir la directive myorigin de postfix comme étant le fichier /etc/mailname. Cette directive défini de qui provient les mails envoyés par les utilisateurs locaux. Dans notre cas, les mails doivent provenir du domaine de notre machine, à savoir, core.csnu.org. Tapez donc :

echo "core.csnu.org" > /etc/mailname
chmod o+r /etc/mailname

Une autre directive importante que nous avons défini est mydestination. Cette directive défini quels domaines postfix doit considérer comme locaux. Lorsque postfix reçoit un mail pour l'un de ces domaines, il les délivre dans la boite locale correspondante. Techniquement, postfix est maintenant déjà près à recevoir des mails destinés à @core.csnu.org. Il reste donc à configurer le domaine virtuel et à ne pas relayer les spams.

Configuration de postfix pour le support MySQL des domaines virtuels

Créez une base de donné nommée postfix:

mysqladmin -u root --password='motdepasse' create postfix

motdepasse correspond au mot-de-passe MySQL de l'utilisateur root

Ensuite, créez l'utilisateur postfix ayant pour mot-de-passe 'password' et attribuez lui les droits sur la base de donné postfix :

$ mysql -u root -p
Enter password:
GRANT ALL PRIVILEGES ON postfix.* TO "postfix"@"localhost" IDENTIFIED BY 'password';
quit;

Puis créez les tables dans la base de donné postfix :

# mysql -u root -p
Enter password:
USE postfix;
CREATE TABLE `alias` (
`address` varchar(255) NOT NULL default '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (address)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';
USE postfix;
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`aliases` int(10) NOT NULL default '0',
`mailboxes` int(10) NOT NULL default '0',
`maxquota` int(10) NOT NULL default '0',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (domain)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';
USE postfix;
CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`username`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';
quit;

Nous avons donc créé 3 tables :

  • alias qui contiendra les alias, c'est-à-dire, les redirections de mails.
  • domain qui contiendra les domaines virtuels gérés par postfix.
  • mailbox qui contiendra les boites mails virtuels.

Maintenant, nous allons créer l'utilisateur vmail et son groupe vmail. C'est cet utilisateur qui centralisera les boites mails virtuels. Dans ce exemple, le répertoire personnel de cet utilisateur est /srv/vmail. C'est dans ce répertoire que les comptes mails seront stockés.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /srv/vmail -m

Éditez encore une fois le fichier /etc/postfix/main.cf et ajoutez y les lignes suivantes :

#mysql
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /srv/vmail
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000
# Support du quota (il n'est pas compilé sur le postfix de debian).
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = The user you are trying to reach is over quota. Please, try again later.
virtual_overquota_bounce = yes
#Pour les domaines à relayer:
#relay_domains = proxy:mysql:/etc/postfix/mysql_relay_domains_maps.cf

Petite explication pour, par exemple, la ligne virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf :

  • mysql: spécifie que le fichier qui suit est la configuration pour accéder à la base MySQL des alias virtuels.
  • proxy: spécifie qu'il faudra lire le fichier en utilisant le mécanisme proxy de postfix. En effet, par défaut, pour des raisons de sécurité, postfix est chrooté et ne pourra donc pas avoir accès aux fichiers de configurations MySQL une fois lancé. Pour palier à ce problème, postfix inclut un démon "proxy" qui ne sera pas chrooté et qui pourra donc lire les fichiers nécessaires.

Plus généralement :

  • virtual_alias_maps défini les alias virtuels
  • virtual_mailbox_base défini le répertoire où seront stockés les boites mails. C'est typiquement le homedir de l'utilisateur défini par virtual_uid_maps.
  • virtual_mailbox_domains défini les domaines pour lesquels postfix sera la destination finale. L'agent utilisé pour délivrer les mails sera celui de virtual_transport.
  • virtual_mailbox_maps défini les utilisateurs virtuels.
  • virtual_transport défini avec quel logiciel postfix doit délivrer les mails. Par défaut, c'est le démon virtual inclut avec postfix qui s'en charge

Il va maintenant falloir créer les différents fichiers de configuration pour MySQL.

Créez le fichier /etc/postfix/mysql_virtual_alias_maps.cf contenant:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

Créez le fichier /etc/postfix/mysql_virtual_domains_maps.cf contenant:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

Créez le fichier /etc/postfix/mysql_virtual_mailbox_maps.cf contenant:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Créez le fichier /etc/postfix/mysql_virtual_mailbox_limit_maps.cf contenant:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'

Créez le fichier /etc/postfix/mysql_relay_domains_maps.cf contenant:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1' and active = '1'

Soyez très attentif à la ligne hosts de chacun de ces fichiers. Comme je l'ai déjà dit, étant donné que postfix est chrooté, on passe par le proxy postfix qui permet à postfix de se servir directement du fichier socket de MySQL pour accéder aux bases. Dans ce cas, il faut laisser hosts = localhost. Une autre méthode serait de ne pas utiliser le système proxy, mais d'entrer 127.0.0.1 en tant qu'host. Dans ce cas, il faudra veiller à ce que mysql n'ait pas l'option skip-networking d'activée.

Dernière chose à faire ici : il faut utiliser postmap sur chacun des fichiers afin de les transformer en table que postfix affectionne :

cd /etc/postfix
postmap mysql_virtual_alias_maps.cf
postmap mysql_virtual_domains_maps.cf
postmap mysql_virtual_mailbox_maps.cf
postmap mysql_virtual_mailbox_limit_maps.cf
postmap mysql_relay_domains_maps.cf

Cette opération est à recommencer après chaque modification de l'un de ces fichiers.

Pour finir, modifiez les permissions étant donné que les mot-de-passes mysql sont stockés en clair. Veilliez bien à conserver le fichier main.cf accessible à tous le monde étant donné que sendmail a besoin d'y accéder pour envoyer des mails.

chown root:postfix /etc/postfix/*
chmod 640 /etc/postfix/*
chmod o+r /etc/postfix/main.cf
chmod +x /etc/postfix/postfix-script

Configuration du smtp-auth

Nous allons maintenant configurer le support SASL afin de ne pas laisser notre serveur en open-relay et servir ainsi comme relai pour les spams. Ajoutez les lignes suivantes dans le fichier /etc/postfix/main.cf :

# Support SASL
broken_sasl_auth_clients = yes

smtpd_sender_restrictions =
  reject_unknown_sender_domain,
  reject_non_fqdn_sender
  smtpd_recipient_restrictions = 
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,  
  reject_unauth_destination,
  reject_unauth_pipelining,   
  reject_invalid_hostname
#  reject_rbl_client dnsbl.dronebl.org,
#  reject_rbl_client list.dsbl.org,
#  reject_rbl_client bl.spamcop.net,
#  reject_rbl_client sbl-xbl.spamhaus.org
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous

Créez le fichier /etc/postfix/sasl/smtpd.conf et ajoutez y les lignes suivantes:

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true

Comme précédemment, veillez à bien utiliser localhost comme hostname afin d'utiliser le socket mysql si le skip-networking est activé sur votre serveur MySQL. Notez qu'il est impossible d'utiliser les méthodes d'authentification CRAM-MD5 et DIGEST-MD5 si les mot-de-passes sont cryptés dans la base mysql (ce qui est le cas ici). Nous nous contenterons donc de plain.

Éditez le fichier /etc/default/saslauthd de façon à ce qu'il ait la configuration suivante:

START=yes
MECHANISMS="pam"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Il faut encore créé le dossier qui contiendra le socket de sasl:

mkdir -p /var/spool/postfix/var/run/saslauthd

Créez le fichier /etc/pam.d/smtp (il faudra peut-être le nommer smtpd) et ajoutez y les lignes suivantes:

auth       required     pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
account    sufficient   pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1

Une fois de plus, soyez attentif à l'argument host= A titre d'information, voici les différentes options possibles pour l'argument crypt= :

  • 0 (ou "plain") = Pas de cryptage. Ceci n'est pas recommandé.
  • 1 (ou "Y") = utilise la fonction crypt() de linux. Celà correspond à la fonction ENCRYPT() de MySQL. C'est la solution que nous avons choisi ici. Attention cependant, seul les huits premiers caractères du mot-de-passe seront pris en compte.
  • 2 (ou "mysql") = Utilise la fonction MySQL PASSWORD().
  • 3 (or "md5") = Utilise la fonction MySQL MD5().

Il ne reste plus qu'à ajouter l'utilisateur postfix au groupe sasl :

adduser postfix sasl

Un petit point à propos des permissions :

  • /var/spool/postfix/, /var/spool/postfix/var/ et /var/spool/postfix/var/run/ doivent être o+x
  • /var/spool/postfix/var/run/saslauthd doit appartenir à root:sasl

Ajout du support SSL/TLS.

Comme pour tous les serveurs, il est interessant de mettre en place un cryptage SSL/TLS afin de sécuriser les transactions. En admettant que vous avez suivi mon guide concernant la mise en place d'une autorité de certification, voici ce qu'il reste à faire.

Commencez par ajouter les lignes suivantes dans votre fichier /etc/ssl/openssl.cnf :

[POSTFIX]
nsComment                       = "SMTP Server Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
basicConstraints                = critical,CA:FALSE
keyUsage                        = digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Puis créés le certificat et signés le avec votre autorité :

openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout postfix.key -out postfix.req
openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions POSTFIX -in postfix.req -out postfix.pem

Si jamais vous possédez déjà vos clés mais qu'elles sont chiffrés par une passphrase, voici comment supprimer la passphrase :

openssl rsa -in key.pem -text
openssl rsa -in key.pem -out key_unlocked.pem
mv key.pem key_locked.pem
mv key_unlocked.pem key.pem

Postfix ne permet pas d'utiliser des clés vérouillés par une passphrase, veillez donc bien à spécifier l'option -nodes de la première ligne. Personnellement, je stock les fichiers du certificat dans /etc/postfix/ssl/:

mkdir /etc/postfix/ssl
mv smtpd.key /etc/postfix/ssl/
mv smtpd.pem /etc/postfix/ssl/
chmod 600 /etc/postfix/ssl/*

Créez le fichier contenant la chaine de certification :

cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/core_ca/core_ca.pem > /etc/postfix/ssl/ca_chain.pem

Il faut encore modifier /etc/postfix/main.cf :

smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.pem
smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key
smtpd_tls_CAfile=/etc/ssl/csnu.org/ca.pem
smtp_tls_cert_file=/etc/postfix/ssl/smtpd.pem
smtp_tls_key_file=/etc/postfix/ssl/smtpd.key
smtp_tls_CAfile=/etc/postfix/ssl/ca_chain.pem
smtpd_use_tls=yes
smtp_use_tls=yes
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600
smtp_tls_session_cache_timeout = 3600

Désormais, vous pourrez configurer votre logiciel de messagerie afin d'utiliser le chiffrement TLS. Si vous souhaitez permettre les connexions SSL, il faut décommenter les quatres lignes suivantes du fichier /etc/postfix/master.cf :

#smtps     inet  n       -       -       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Pour des informations complémentaires, rendez-vous ici.

Ajout d'un utilisateur virtuel et lancement des services.

Pour ajouter un utilisateur test@csnu.org ainsi qu'un alias alias@csnu.org renvoyant vers notre utilisateur:

# mysql -u root -p
Enter password:
use postfix;
INSERT INTO domain (domain,description) VALUES ('csnu.org','Test Domain');
INSERT INTO alias (address,goto) VALUES ('alias@csnu.org', 'test@csnu.org');
INSERT INTO mailbox (username,password,name,maildir)  VALUES ('test@csnu.org',ENCRYPT('userpassword'),'Mailbox User','test@csnu.org/');

Les mots-de-passe sont cryptés avec la fonction ENCRYPT() de MySQL. Comme je l'ai dit précédemment, cette fonction limite la taille des passwords à huit caractères. Si vous souhaitez utiliser des passwords de plus de huit caractères vous pouvez utiliser l'une des autres fonctions de cryptage de Mysql. Pensez cependant à ajuster la configuration du fichier /etc/pam.d/smtp comme décrit ici.


Vous pouvez maintenant lancer vos services :

/etc/init.d/saslauthd start
/etc/init.d/postfix start

Pour tester si l'authentification fonctionne bien :

testsaslauthd -u test@csnu.org -p userpassword -s smtp -f /var/spool/postfix/var/run/saslauthd/mux

Vous pouvez vérifier que postfix ne détecte aucun problème avec :

postfix check

Commandes utiles

La queue de postfix peut être géré en ligne de commande avec la commande postqueue. Pour afficher la queue, tapez :

postqueue -p

Pour forcer postfix à traiter sa queue, tapez :

postqueue -f

vous aurez peut-être la nécessité de supprimer un message de la queue. Pour celà, il faut utiliser la commande postsuper :

postsuper -d ID

L'ID correspond au Queue ID renvoyé par la commande postqueue -p

La commande postalias permet de générer les fichiers d'alias de postfix :

postalias /etc/aliases

La commande postconf permet de manipuler la configuration en ligne de commande

La commande postcat permet de lire un mail en queue. Par exemple, pour récupérer sous forme lisible le mail en queue situé dans /var/spool/postfix/deferred/B/B9C791 il suffit d'utiliser :

postcat /var/spool/postfix/deferred/B/B9C791

Il est aussi possible de passer directement via le Queue ID du mail :

postcat -q B9C791

Support du quota.

Vous l'aurez peut-être remarqué : postfix ne supporte pas le quota par défaut. Le patch VDA permet d'activer le support du quota pour le MDA virtual de postfix. Vous pouvez trouver une version postfix-vda pour debian sur http://debian.home-dn.net/ si vous souhaitez continuer d'utiliser le démon virtual fournit avec postfix pour délivrer les mails de vos domaines virtuels. Une autre méthode consiste à utiliser un autre MDA pour transporter les mails, par exemple, maildrop.

Problèmes possibles.

Si vous utilisez un noyau avec le patch grsecurity, j'ai remarqué un comportement étrange. En effet, lorsque j'essayais d'envoyer un mail avec sendmail avec un autre utilisateur que root (www-data par exemple) il me renvoyait une erreur. C'est un problème de droit : /proc/net n'était pas lisible et exécutable par tous le monde (o+rx) ce qui empêchait sendmail d'envoyer les mails.

Courier

Nous allons maintenant installer courier pour ses fonctionnalités de serveur pop et imap. Installer les paquets nécessaires :

aptitude install courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl

Éditez le fichier /etc/courier/authdaemonrc :

authmodulelist="authmysql"

Éditez le fichier /etc/courier/authmysqlrc :

MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          password
MYSQL_SOCKET            /var/run/mysqld/mysqld.sock
#MYSQL_PORT              0
MYSQL_OPT               0
MYSQL_DATABASE          postfix
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
#DEFAULT_DOMAIN         domain.tld
MYSQL_UID_FIELD         5000
MYSQL_GID_FIELD         5000
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        "/srv/vmail"
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
#MYSQL_QUOTA_FIELD      quota
#MYSQL_WHERE_CLAUSE     server='exemple.domain.tld'

Je préfère ne pas binder mes services sur toutes les ips configurés sur la machine. Il faut donc configurer courier pour qu'il ne bind que les ips voulus.

Pour courier-pop éditez le fichier /etc/courier/pop3d et modifiez la ligne PORT=110 par :

PORT=127.0.0.1.110,::1.110,213.186.47.110.110,2001:41d0:1:d6e::110.110

Pour courier-pop-ssl éditez le fichier /etc/courier/pop3d-ssl et modifiez la ligne SSLPORT=995 par :

SSLPORT=127.0.0.1.995,::1.995,213.186.47.110.995,2001:41d0:1:d6e::110.995

Pour courier-imap éditez le fichier /etc/courier/imapd et modifiez la ligne PORT=143 par :

PORT=127.0.0.1.143,::1.143,213.186.47.110.143,2001:41d0:1:d6e::110.143

Pour courier-imap-ssl éditez le fichier /etc/courier/imapd-ssl et modifiez la ligne SSLPORT=993 par :

SSLPORT=127.0.0.1.993,::1.993,213.186.47.110.993,2001:41d0:1:d6e::110.993

Ajout du support SSL/TLS

utiliser les scripts de courier

courier inclut des scripts qui permettent de générer automatiquement ces certificats SSL. Pour cela, il faut éditer les fichiers /etc/courier/pop3d.cnf et /etc/courier/imapd.cnf puis lancer les commandes suivantes :

mkpop3dcert
mkimapdcert

Créer son propre certificat signé par son autorité de certification.

Éditez votre fichier /etc/ssl/openssl.cnf et ajoutez les lignes suivantes :

[IMAP]
nsComment                       = "SSL Imap Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
basicConstraints                = critical,CA:FALSE
keyUsage                        = digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

[POP]
nsComment                       = "SSL Pop Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
basicConstraints                = critical,CA:FALSE
keyUsage                        = digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Encore une fois, les clés ne devront pas être chiffré avec une passphrase car courier ne les gère pas.

Pour créer le certificat du serveur pop :

openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout pop.key -out pop.req
openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions POP -in pop.req -out pop.pem
cat pop.key pop.pem > pop3d.pem
openssl gendh >> pop3d.pem
mv pop3d.pem /etc/courier/
rm -rf pop.*

Pour créer le certificat du serveur imap:

openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:1024 -keyout imap.key -out imap.req
openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions IMAP -in imap.req -out imap.pem
cat imap.key imap.pem > imapd.pem
openssl gendh >> imapd.pem
mv imapd.pem /etc/courier/
rm -rf imap.*

Et comme d'habitude, on modifie les droits :

chmod 600 /etc/courier/*.pem

Lancement

Il ne reste plus qu'à lancer courier et à le tester:

/etc/init.d/courier-authdaemon start
/etc/init.d/courier-imap start
/etc/init.d/courier-imap-ssl start
/etc/init.d/courier-pop start
/etc/init.d/courier-pop-ssl start

Avec le temps, vous en aurez peut-être assez de devoir relancer chacun de ces scripts. C'est pourquoi j'ai fait un script abrégé :

#! /bin/sh

case "$1" in
start)
        /etc/init.d/courier-authdaemon start
        /etc/init.d/courier-pop start
        /etc/init.d/courier-pop-ssl start
        /etc/init.d/courier-imap start
        /etc/init.d/courier-imap-ssl start
        exit 0
;;
stop)
       /etc/init.d/courier-authdaemon stop
       /etc/init.d/courier-pop stop
       /etc/init.d/courier-pop-ssl stop
       /etc/init.d/courier-imap stop
       /etc/init.d/courier-imap-ssl stop
       exit 0
;;
restart)
       $0 stop
       $0 start
       exit 0
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

maildrop

maildrop est un mail delivery agent (MDA). Son rôle est de délivrer les messages reçus par un serveur smtp dans les boites mails des utilisateurs. Nous allons mettre en place maildrop pour remplacer le démon virtual de postfix parce qu'il permet de gérer les quotas et les filtres.

Le paquet maildrop de debian lenny fournit maildrop 2.0.4 qui a un comportement étrange dans la gestion des quotas. Pour régler ce problème il faut compiler soit même maildrop 2.0.4.

Pour commencer il faut installer g++ ainsi que les paquets courier-authlib-dev et libpcre3-dev :

aptitude install g++ courier-authlib-dev libpcre3-dev

Téléchargez maildrop et extrayez le :

wget http://prdownloads.sourceforge.net/courier/maildrop-2.0.4.tar.bz2
tar jxf maildrop-2.0.4.tar.bz2 

il faut maintenant configurer maildrop :

cd maildrop-2.0.4
./configure -prefix=/usr/local/courier --enable-maildrop-uid=5000 --enable-maildrop-gid=5000 --enable-maildirquota --without-db

Ici, on installe maildrop avec l'utilisateur d'uid 5000 et de gid 5000 ce qui correspond à notre utilisateur vmail. maildrop sera installé dans /usr/local/courier

Compilons et installons maildrop :

make
make install

Une erreur de compilation peut apparaître sur l'un des composants. Cela n'empêchera pas maildrop de fonctionner mais vous pouvez régler le problème comme ceci :

cd makedat
ln -s makedatprog.c makedatprog
cd ..
make install

Il faut adapter les droits de /usr/local/courier/bin/ :

chown vmail: /usr/local/courier/bin/*
chmod o+rx /usr/local/courier/

Pour que maildrop fonctionne il faut qu'il puisse accéder au socket de courier situé dans /var/run/courier/authdaemon/ :

chgrp vmail /var/run/courier/authdaemon/

maildroprc

Le fichier /etc/maildroprc contient la configuration ainsi que les règles de filtrage par défaut de maildrop.

Pour commencer nous allons activer les logs de maildrop. Ajoutez la ligne suivante dans /etc/maildroprc :

logfile "/var/log/maildroprc.log"

Créez le fichier de log et attribuez le à l'utilisateur vmail :

touch /var/log/maildroprc.log
chown vmail:vmail /var/log/maildroprc.log

Vous voudrez peut-être ajouter maildrop à la rotation des logs. Éditez le fichier /etc/logrotate.d/maildrop et ajoutez y les lignes suivantes :

/var/log/maildroprc.log {
        weekly
        missingok
        rotate 12
        compress
        delaycompress
        notifempty
        create 640 vmail vmail
        sharedscripts
        postrotate
        endscript
}

Pour créer automatiquement la mailbox si elle n'existe pas lors de la réception d'un message ajoutez les lignes suivantes à /etc/maildroprc :

# Si la mailbox représenté par $DEFAULT n'existe pas
`test -e $DEFAULT/`
if ( $RETURNCODE != 0 )
{
  # On la crée
  `maildirmake $DEFAULT`
  #  ainsi que les quelques sous-répertoire de base
  `maildirmake -f Junk $DEFAULT`
 `maildirmake -f Sent $DEFAULT`
 `maildirmake -f Trash $DEFAULT`
  # Puis on change les droits
  `chmod -R go-rwx $DEFAULT`
}

Enfin nous allons configurer un fichier de filtre local à chaque utilisateur virtuel :

# On load les filtres spécifiques de l'utilisateur $DEFAULT s'ils existent
`test -r $DEFAULT/mailfilter`
if( $RETURNCODE == 0 )
        {
       log "(==) Including $DEFAULT/mailfilter"
               exception {
                        include $DEFAULT/mailfilter
               }
        }

Par exemple, voici comment je filtre les spams dans mon fichier /srv/vmail/pfoo\@csnu.org/mailfilter :

if (/^X-Spam-Flag:.*YES/)
{
        exception {
               to $DEFAULT/.Junk/
        }
}

Quota

Pour le support du quota il faut créer les fichiers nécessaires avec maildirmake. Si la mailbox n'existe pas encore tapez :

maildirmake /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org

Pour activer le quota pour la mailbox il faut utiliser l'option -q de maildirmake. Pour créer une boite de 512 000 000 bytes tapez :

maildirmake -q 512000000S /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org

Pour créer une boite pouvant contenir un maximum de 1000 fichiers tapez :

maildirmake -q 1000C /srv/vmail/test@csnu.org
chown -R vmail:vmail /srv/vmail/test@csnu.org

maildrop délivrera un message d'erreur lorsqu'une boite est pleine à un certain pourcentage (défini dans la configuration de postfix). Placez le texte suivant dans /usr/local/courier/etc/quotawarnmsg et assurez vous qu'il soit lisible par vmail :

From: Postmaster csnu.org <postmaster@csnu.org>
Reply-To: postmaster@csnu.org
To: Valued Customer:;
Subject: Mail quota warning
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit

Your mailbox on the server is now more than 90% full. So that you can continue to receive mail you need to remove some messages from your mailbox.

Intégration à postfix

Il faut commencer par remplacer <code<virtual par maildrop dans /etc/postfix/main.cf :

virtual_transport = maildrop
maildrop_destination_recipient_limit=1

Ensuite il faut modifier la configuration de maildrop du fichier /etc/postfix/master.cf :

maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/courier/bin/maildrop -w 90 -d ${recipient}

L'option -w 90 défini qu'il faut avertir l'utilisateur lorsque sa boite mail est pleine à 90%.

Vérification et redémarrage

authtest permet de vérifier si l'authentification de courier fonctionne bien :

$ authtest test@csnu.org
Authentication succeeded.

     Authenticated: test@csnu.org  (uid 5000, gid 5000)
    Home Directory: /srv/vmail
           Maildir: test@csnu.org/
             Quota: (none)
Encrypted Password: ZHJghD45/gfFDH42
Cleartext Password: (none)
           Options: (none)

Ensuite testez maildrop :

# /usr/local/courier/bin/maildrop -V 7 -d test@csnu.org
maildrop: authlib: groupid=5000
maildrop: authlib: userid=5000
maildrop: authlib: logname=test@csnu.org, home=/srv/vmail, mail=test@csnu.org/
maildrop: Changing to /srv/vmail

Si vous n'avez eu aucune erreur vous pouvez relancer postfix :

/etc/init.d/postfix restart