For English user : I added the English Version for FreeBSD and the English Version for Debian.
Le but de ce howto/tuto est de fournir une documentation pour installer un serveur de Mail avec gestion multi-domaine simple. Postfix a été choisit par préférence personnelle et aussi pour son respect de la RFC. Le serveur installé sera donc capable de gérer plusieurs domaines, des quotas pour les mailboxs, des alias e-mails, des postmaster, les services POP et IMAP (éventuelement avec SSL), un anti-spam, un anti-virus et un systeme de greylist et identification SMTP. De plus, tout fonctionne avec MySQL pour une plus grande simplicité.
L’installation décrite est sous FreeBSD, mais doit pouvoir s’apdater aux distribution GNU/Linux.
Logiciels utilisés :
Par convention :
# foo : commande à taper en root
$ bar : commande à taper en utilisateur simple
foo bar : à adapté à votre configuration
De plus, dans les détails des fichiers de configuration, ce qui n’est pas mentionné doit etre commenté.
Avant tout, vérifiez que vos ports sont à jour : # cvsup /usr/share/examples/cvsup/ports-supfile
Installation de Postfix :
# cd /usr/port/mail/postfix/
# make install clean
Il faut rajouter les supports : mysql, spf et sasl2.
Modifier le fichier le fichier /usr/local/etc/postfix/main.cf de cette façon (laisser tel quel ce qui n’est pas inscrit ici) :
myhostname = mail.domaine.com
mydomain : domaine.com
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, localhost, $transport_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 192.168.1.1/32, 127.0.0.1/32
relay_domains = $mydestination
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous, noplaintext, mutual_auth
smtpd_sasl_local_domain =
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_policy_service inet:127.0.0.1:10023,
reject_unauth_destination
alias_database = hash:/usr/local/etc/postfix/aliases
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = no
readme_directory = no
smtpd_sender_login_maps = mysql:/usr/local/etc/postfix/mysql_virtual_sender.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:200
virtual_mailbox_base = /usr/local/virtual
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 200
virtual_transport = virtual
virtual_uid_maps = static:200
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
content_filter = smtp-amavis:[127.0.0.1]:10024
Pensez à modifier myhostname, mydomain et mynetworks.
Ajoutez ceci au fichier /usr/local/etc/postfix/master.cf
smtp-amavis unix - - y - 2 lmtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - y - - 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
Je considere que le serveur MySQL est localhost, le login à MySQL est postfix, le mot de passe est postfix et que la base est postfix.
Fichier : /usr/local/etc/postfix/mysql_virtual_sender.cf
user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix table = mail_mailbox select_field = username where_field = username
Fichier : /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix table = mail_alias select_field = goto where_field = address
Fichier : /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix table = mail_domain select_field = description where_field = domain
Fichier : /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix table = mail_mailbox select_field = quota where_field = username
Fichier : /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix table = mail_mailbox select_field = maildir where_field = username
Schéma MySQL :
CREATE TABLE mail_alias ( address varchar(255) NOT NULL default '', goto text NOT NULL, domain varchar(255) NOT NULL default '', PRIMARY KEY (address), KEY address (address) ); CREATE TABLE mail_domain ( domain varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', transport varchar(255) default 'virtual', PRIMARY KEY (domain), KEY domain (domain) ); CREATE TABLE mail_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 '', PRIMARY KEY (username), KEY username (username) );
Installation de Courier-authlib :
# cd /usr/ports/security/courier-authlib/
# make install clean
Il faut rajouter le support : mysql.
Vérifier que le fichier : /usr/local/etc/authlib/authdaemonrc contient bien :
authmodulelist="authmysql" authmodulelistorig="authmysql" subsystem=mail
Modifier le fichier : /usr/local/etc/authlib/authmysqlrc
MYSQL_CLEAR_PWFIELD password MYSQL_DATABASE postfix MYSQL_GID_FIELD '200' MYSQL_HOME_FIELD '/usr/local/virtual/' MYSQL_LOGIN_FIELD username MYSQL_MAILDIR_FIELD maildir MYSQL_NAME_FIELD name MYSQL_OPT 0 MYSQL_PASSWORD postfix MYSQL_QUOTA_FIELD quota MYSQL_SERVER 127.0.0.1 MYSQL_UID_FIELD '200' MYSQL_USERNAME postfix MYSQL_USER_TABLE mail_mailbox
Installation de Courier-imap :
# cd /usr/ports/mail/courier-imap/
# make install clean
Il faut rajouter le support : mysql.
Vérifier que le fichier : /usr/local/etc/courier-imap/pop3d contient bien :
PIDFILE=/var/run/pop3d.pid MAXDAEMONS=40 MAXPERIP=4 POP3AUTH="" POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256" POP3AUTH_TLS="" POP3AUTH_TLS_ORIG="LOGIN PLAIN" POP3_PROXY=0 PORT=110 ADDRESS=0 TCPDOPTS="-nodnslookup -noidentlookup" LOGGEROPTS="-name=pop3d" MAILDIRPATH=Maildir
Vérifier que le fichier : /usr/local/etc/courier-imap/imapd contient bien :
ADDRESS=0 PORT=143 MAXDAEMONS=40 MAXPERIP=4 PIDFILE=/var/run/imapd.pid TCPDOPTS="-nodnslookup -noidentlookup" LOGGEROPTS="-name=imapd" IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE" IMAP_KEYWORDS=1 IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE" IMAP_PROXY=0 IMAP_PROXY_FOREIGN=0 IMAP_IDLE_TIMEOUT=60 IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN" IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN" IMAP_DISABLETHREADSORT=0 IMAP_CHECK_ALL_FOLDERS=0 IMAP_OBSOLETE_CLIENT=0 IMAP_UMASK=022 IMAP_ULIMITD=65536 IMAP_USELOCKS=1 IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index IMAP_ENHANCEDIDLE=0 IMAP_TRASHFOLDERNAME=Trash IMAP_EMPTYTRASH=Trash:7 IMAP_MOVE_EXPUNGE_TO_TRASH=0 SENDMAIL=/usr/sbin/sendmail HEADERFROM=X-IMAP-Sender MAILDIRPATH=Maildir
Installation de Courier-imap :
# cd /usr/ports/security/cyrus-sasl2/
# make WITH_MYSQL=”yes” WITHOUT_GSSAPI=”yes” WITHOUT_OTP=”yes” install clean
Créer le fichier /usr/local/lib/sasl2/smtpd.conf
pwcheck_method:auxprop auxprop_plugin: sql sql_engine: mysql sql_hostnames: localhost sql_user: postfix sql_passwd: postfix sql_database: postfix sql_statement: SELECT password FROM sys_mail_mailbox WHERE username = '%u@%r'
Installation de Postgrey :
# cd /usr/ports/mail/postgrey/
# make install clean
Postgrey va vérifier que la RFC soit respectée lors de l’envoi d’un mail (une seconde tentative lors d’une erreur 450 de la part du serveur destinataire). Ce type de message sera affiché dans /var/log/maillog lors de la première tentative :
date domaine.com postfix/smtpd[54871]: NOQUEUE: reject: RCPT from host.du.client[ip-du-client]: 450 <destinataire@domaine.com>: Recipient address rejected: Greylisted for 300 seconds (see http://isg.ee.ethz.ch/tools/postgrey/help/domaine.com.html); from=<source.du@mail.com> to=<destinataire@domaine.com> proto=SMTP helo=<host.du.serveur.smtp.client>
Installation de ClamAV :
# cd /usr/ports/security/amavisd-new/
# make install clean
Vérifier que le fichier : /usr/local/etc/freshclam.conf contient bien :
DatabaseDirectory /var/db/clamav UpdateLogFile /var/log/clamav/freshclam.log PidFile /var/run/clamav/freshclam.pid DatabaseOwner clamav DatabaseMirror database.clamav.net
Vérifier que le fichier : /usr/local/etc/clamd.conf contient bien :
PidFile /var/run/clamav/clamd.pid DatabaseDirectory /var/lib/clamav LocalSocket /var/run/clamav/clamd User clamav AllowSupplementaryGroups
Vérifier que le fichier : /usr/local/etc/amavisd.conf contient bien :
$mydomain = 'domaine.com';
$myhostname = 'mail.domaine.com';
@av_scanners = (
...
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
...
);
Pour ajouter la gestion du domaine domaine.com, il faut insérer ceci dans la table mail_domain.
INSERT INTO mail_domain (domain, description, transport) VALUES ('domaine.com', 'domaine.com', 'virtual');
Il faut faire de même pour ajouter d’autres domaines ou sous-domaine.
Pour ajouter un compte POP/IMAP, par exemple test@domaine.com, il faut insérer ceci :
INSERT INTO mail_alias (address, goto, domain) VALUES ('test@domaine.com', 'test@domaine.com', 'domaine.com');
INSERT INTO mail_mailbox (username, password, maildir, quota, domain) VALUES ('test@domaine.com', 'mot de passe', 'test@domaine.com/', '2000', 'domaine.com');
Le compte sera donc test@domaine.com, son mot de passe sera mot de passe, le repertoire sera /usr/local/virtual/test@domaine.com/, le quota de la boite sera de 2Mo (2000Ko), et le domaine est domaine.com.
L’ajout d’un alias est rendu utile dans le cas d’utilisation de wildcard pour les alias collecteurs.
La création des mailbox est automatique. Dès qu’un e-mail est reçu, celle-ci est créée.
Attention :
Le login aux serveurs POP et IMAP, sera test@domaine.com pour cet exemple.
Considérons toujours le domaine domaine.com. Pour renvoyer tous les mails à destination de plop@domaine.com vers test@domaine.com, faire comme ceci :
INSERT INTO mail_alias (address, goto, domain) VALUES ('plop@domaine.com', 'test@domaine.com', 'domaine.com');
Pour renvoyer un e-mail vers plusieurs adresse, mettez une virgule entre les adresses du champ goto.
Si nous voulons que tous les mails du domaine domaine.com n’existant pas soit tout de même acheminé vers test@domaine.com, faire comme ceci :
INSERT INTO mail_alias (address, goto, domain) VALUES ('@domaine.com', 'test@domaine.com', 'domaine.com');
# postfix start
# /usr/local/etc/rc.d/clamav-clamd.sh
# /usr/local/etc/rc.d/clamav-freshclam.sh start
# /usr/local/etc/rc.d/sa-spamd.sh start
# /usr/local/etc/rc.d/postgrey.sh start
# /usr/local/etc/rc.d/courier-authdaemond.sh start
# /usr/local/etc/rc.d/courier-imap-pop3d.sh start
# /usr/local/etc/rc.d/courier-imap-imapd.sh start
Pour un lancement automatique, ajoutez ceci dans /etc/rc.conf
sendmail_enable="NONE" sendmail_pidfile="/var/spool/postfix/pid/master.pid" clamav_clamd_enable="YES" clamav_freshclam_enable="YES" spamd_enable="YES" courier_authdaemond_enable="YES" courier_imap_pop3d_enable="YES" courier_imap_imapd_enable="YES" postgrey_enable="YES"
Maintenant, vous avez un serveur mail multi-domaine fonctionnel avec anti-spam, anti-virus et greylist.
# cd /usr/ports/mail/mailman # make MAIL_GID="nobody" install clean
Editez le fichier /usr/local/mailman/Mailman/Defaults.py et vérifiez que les lignes suivantes correspondent.
DEFAULT_EMAIL_HOST = 'mail.domaine.com' DEFAULT_URL_HOST = 'domaine.com' DEFAULT_URL_PATTERN = 'http://%s/mailman/' MTA = 'Postfix' DEFAULT_SERVER_LANGUAGE = 'fr'
Pensez à modifier DEFAULT_EMAIL_HOST et DEFAULT_URL_HOST.
Maintenant, nous allons ajouter des domaines virtuels (en l’occurence : domaine1.com et domaine2.com). Editez le fichier /usr/local/mailman/Mailman/mm_cfg.py et ajoutez ceci :
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['domaine1.com', 'domaine2.com']
add_virtualhost('www.domaine1.com', 'domaine1.com')
add_virtualhost('www.domaine2.com', 'domaine2.com')
Pensez à modifier domaine1.com et domaine2.com. La directive add_virtualhost comprend deux arguements : le premier est l’adresse HTTP et le second l’adresse du serveur mail.
Nous devons aussi créer la liste mailman (c’est obligatoire) :
# cd /usr/local/mailman/ # bin/newlist mailman # bin/genaliases
Le mot de passe administrateur mailman de l’interface web doit aussi être définit :
# bin/mmsitepass
Le fichier /usr/local/etc/postfix/main.cf doit etre modifié comme suit :
recipient_delimiter = + alias_maps = hash:/etc/aliases,hash:/usr/local/mailman/data/aliases
Vous devez aussi ajouter ces deux lignes à votre fichier httpd.conf (l’installation de apache ne sera pas détaillée).
ScriptAlias /mailman/ /usr/local/mailman/cgi-bin/ Alias /pipermail/ /usr/local/mailman/archives/public/
Considérons que nous souhaitons créer les listes ma-liste@domaine1.com et mailing@domaine2.com.
# cd /usr/local/mailman/ # bin/newlist ma-liste@domaine1.com # bin/newlist mailing@domaine2.com # bin/genalias
Maintenant, nous devons redémarer Postfix pour prendre en compte ces changements et lancer le daemon Mailman :
# postfix reload # /usr/local/etc/rc.d/mailman.sh start
Vous pouvez avoir accès à l’interface web des mailing list précedement créées via : http://www.domaine1.com/mailman/listinfo/ma-liste et http://www.domaine2.com/mailman/listinfo/mailing.
Il est aussi possible de créer des mailing list via l’interface web en se rendant sur http://www.domaine2.com/mailman/create/. Néanmoins, dans le cas des domaines virtuels, je vous suggère de le faire en ligne de commande.
Auteur : Yann Le Bris.
Merci à Jean-Dominique Baylac pour sa patiente et ses explications.