Installation d'un serveur Mail multi-domaine avec Postfix

Description

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

Postfix

Instalation

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.

Configuration

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)
);

Courier-authlib

Instalation

Installation de Courier-authlib :
# cd /usr/ports/security/courier-authlib/
# make install clean

Il faut rajouter le support : mysql.

Configuration

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

Courier-imap

Instalation

Installation de Courier-imap :
# cd /usr/ports/mail/courier-imap/
# make install clean

Il faut rajouter le support : mysql.

Configuration

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

Cyrus SASL

Instalation

Installation de Courier-imap :
# cd /usr/ports/security/cyrus-sasl2/
# make WITH_MYSQL=”yes” WITHOUT_GSSAPI=”yes” WITHOUT_OTP=”yes” install clean

Configuration

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'

Postgrey

Instalation

Installation de Postgrey :
# cd /usr/ports/mail/postgrey/
# make install clean

Fonctionnement

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>

SpamAssassin

Instalation

Configuration

ClamAV

Instalation

Installation de ClamAV :
# cd /usr/ports/security/amavisd-new/
# make install clean

Configuration

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$/ ],
...
);

Ajouter la gestion d'un domaine

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.

Ajouter un compte POP/IMAP

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 mot de passe doit etre en clair dans la table.
  • Le champ maildir est le repertoire où seront stocké les mails pour ce compte. Il doit obligatoirement se terminer par un slash (/). Par convention, j’ai choisis de mettre l’adresse e-mail comme répertoire pour s’y retrouver plus facilement.
  • Le champ quota doit etre exprimé en Ko, pour ne pas mettre de quota, la valeur doit etre mise à zero (0).
  • Le champ domaine doit correspondre au domaine en question.


Le login aux serveurs POP et IMAP, sera test@domaine.com pour cet exemple.

Ajouter un alias

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.

Ajouter un alias-collecteur

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');

Lancement des services

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

Addon : Mailman

Instalation

# cd /usr/ports/mail/mailman
# make MAIL_GID="nobody" install clean

Configuration

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.



Historique

  • 24/10/2005 : Première version mise en ligne. Toutes les parties concernant Postfix, Courier-authlib, Courier-imap, MySQL, Postgrey, SpamAssassin et ClamAV ont été vérifié et/ou corrigé par Jean-Dominique Baylac.
  • 28/02/2006 : Ajout de Mailman
  • 02/03/2006 : Ajout de l’identification SMTP

Auteur : Yann Le Bris.
Merci à Jean-Dominique Baylac pour sa patiente et ses explications.

 
howto/postfix.txt · Dernière modification: 2007/06/19 22:43 par sharlaan
 
Recent changes RSS feed Creative Commons License Association Naellia Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki