Configuration des serveurs mail de Switzernet
Oussama Hammami, 2010-06-30
Switzernet
Ce document nous sert de mémo pour installer un serveur mail sur un Debian, donc il est avant tout une base de travail pour les prochaines installations.
Ces deux serveur sont responsable de routage des tous comptes emails selon leurs adresses mail ‘destination’, ils ont été déclaré dans notre serveurs DNS comme l'adresse du relais pour l'acheminement du courrier électronique (MX).
Postfix tout seul peut faire ce routage la configuration est la suivante :
/etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = mail7.switzernet.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = switzernet.com, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
message_size_limit = 0
virtual_alias_maps = hash:/etc/postfix/virtual
transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport
projects@switzernet.com smtp:mail5.switzernet.com
switzernet.com smtp:mail4.switzernet.com
/etc/postfix/virtual
billing@switzernet.com billing@mail3.switzernet.com
support@switzernet.com support@mail2.switzernet.com
contracts@switzernet.com contracts@mail2.switzernet.com
@switzernet.com @switzernet.com
Après chaque changement des fichiers virtual ou transport il faut les postmaper (les fichiers indiqués après hash dans main.cf) avec la commande :
# postmap /etc/postfix/virtual
# postmap /etc/postfix/transport
Et reloader Postfix pour qu’il tienne compte de ces changements :
# /etc/init.d/postfix reload
Ou
# postfix reload
Il est possible de délivrer directement les emails aux destinataires qui les acceptent en passant par le smtp spécifié dans le fichier /etc/postfix/transport.
/etc/postfix/transport
projects@switzernet.com smtp:mail5.switzernet.com
switzernet.com smtp:mail4.switzernet.com
Ceci veut dire que pour les emails à destination projects@switzernet.com nous utiliserons le protocole smtp pour transmettre ces messages à mail5.switzernet.com, pour tous les autres emails à destination de domaines switzernet.com nous utiliserons mail4.switzernet.com.
Vous remarquez que l’ordre de ces lignes est important car si ce n’était pas le cas la première ligne sera incluse dans la deuxième et il ne sera donc jamais traité.
De cette manière, tous les mails seront routés par adresse mails en utilisant son MTA associé dans ce fichier de configuration.
C’est le seul moyen de router les mails d’un serveur vers un autre alors que tous les deux ils traitent les mails de même domaine (mydestination = switzernet.com).
Ce fichier présente la table faisant la correspondance des adresses ou des domaines spécifiés vers des adresses locales ou distantes.
/etc/postfix/virtual
billing@switzernet.com billing@mail3.switzernet.com
support@switzernet.com support@mail2.switzernet.com
contracts@switzernet.com contracts@mail2.switzernet.com
@switzernet.com @switzernet.com
Contrairement à mail[1,5,7].switzernet.com, mail[2,3].switzernet.com ne traitent pas les emails de domaine switzernet.com donc il était nécessaire de transférer les emails vers leurs destination réels.
L’ordre des lignes dans ce fichier est aussi important.
Ce serveur gère le mail de domaine switzernet.com mais notre serveur de routage mail1.switzernet.com ne lui transfère que les emails de destination projects@switzernet.com
On a installé sur ce serveur Postfix et Dovecote (IMAP).
/etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = mail5.switzernet.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail5.switzernet.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_mailbox_domains = switzernet.com
virtual_mailbox_base = /home/vbox
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_limit = 0
Le paramètre virtual_mailbox_domains requiert la même syntaxe que mydestination sauf qu’il ne doit pas apparaître dans les deux paramètres au même temps.
/etc/postfix/vmailbox
projects@switzernet.com switzernet.com/projects/
cash@switzernet.com switzernet.com/cash/
test@switzernet.com switzernet.com/test/
Il ne faut pas oublier de postmaper ce dernier.
Le chemin complet vers la boite mail projects@ par exemple sera /home/vbox/switzernet.com/projects/
Il faut bien vérifier les droits pour le
répertoire indique dans virtual_mailbox_base.
La configuration de dovcote est la suivante :
/etc/dovecot/dovecot.conf
protocols = imap
listen = *
disable_plaintext_auth = no
log_path = /var/log/dovecot/dovecot.log
info_log_path=/var/log/dovecot/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
login_greeting = ready....
auth default {
mechanisms = plain cram-md5
user = root
userdb passwd-file {
args = /etc/dovecot/dovecot.users
}
#fallback to PAM
userdb passwd {
}
passdb passwd-file {
args = /etc/dovecot/dovecot.users
}
#fallback to PAM
passdb pam {
}
socket listen {
client {
# Assuming the default Postfix $queue_directory setting
path = /var/spool/postfix/private/auth
mode = 0660
# Assuming the default Postfix user and group
user = postfix
group = postfix
}
}
}
mail_extra_groups = mail
protocol imap {
}
protocol pop3 {
}
dict {
}
plugin {
}
Le fichier /etc/dovecot/dovecot.users est notre table de correspondance user, password, chemin vers le Maildir.
Il est de la forme:
user1.user1@projects.switzernet.com:{HMAC-MD5}12999732f70a30191be8c552bff077b3876d7a1fe89b9e61389b941ab598cf15:5000:5000::::userdb_mail=maildir:/home/vmail/domain1.tld/user1/
user2.user2@projects.switzernet.com:{HMAC-MD5}a91cbc2e844e773e464eb76786cebd6edd0c7baf5d64de09c8a4ed67851e961e:5000:5000::::userdb_mail=maildir:/home/vmail/domain2.tld/user2/
Il faut créer un utilisateur qui accédera aux Maildir. J'ai choisi de créer un user
system vmail, d'uid:gid 5000:5000 (vous devez utiliser le même uid indiqué dans la configuration de
Postfix)
Les passwords sont salés en HMAC-MD5 (ce qui n'est pas de la grande cryptographie, entendons nous bien, mais inutile de casser ceux là, ce sont des fakes), et générés avec la commande:
dovecotpw -p le_mot_de_passe
Dans notre fichier dovecot.users, on a n’a pas utilisé un cryptage
user1.user1@projects.switzernet.com:{PLAIN}yourpassword:5000:5000::::userdb_mail=maildir:/home/vbox/switzernet.com/projects/
user2.user2@projects.switzernet.com:{PLAIN}yourpassword:5000:5000::::userdb_mail=maildir:/home/vbox/switzernet.com/projects/
Pour installer Postfix,Dovecote et Imapsync
aptitude install postfix mailutils dovecot-imapd imapsync
Pour tester la réception des emails vous pouvez utiliser directement le SMTP de ce serveur en utilisant telnet
telnet mail5.switzernet.com smtp
helo switzernet.com
mail from: aa@bb.cc
rcpt to: projects@switzernet.com
Data
subject: Test SMTP
Test SMTP Body
.
Ou bien :
(sleep 0.5; echo -e "helo Switzernet.com\nmail from: aa@bb.cc\nrcpt to: projects@switzernet.com\ndata\nsubject: Test SMTP\n\nTest SMTP Boby\n."; sleep 0.2; echo "quit" ) | telnet mail5.switzernet.com smtp
Pour tester la connexion IMAP vous pouvez aussi utiliser telnet :
# telnet mail5.switzernet.com imap
Trying 91.121.150.26...
Connected to mail5.switzernet.com.
Escape character is '^]'.
* OK ready....
001 login username@projects.switzernet.com yourpassword
001 OK Logged in.
002 select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $label5 $label4 $label1 $label2 $label3)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $label5 $label4 $label1 $label2 $label3 \*)] Flags permitted.
* 12 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1274888456] UIDs valid
* OK [UIDNEXT 24] Predicted next UID
002 OK [READ-WRITE] Select completed.
003 logout
* BYE Logging out
003 OK Logout completed.
La configuration de ce serveur est identique à celle de projects.switzernet.com sauf qu’il contient un seul compte mail bachup@switzernet.com, les comptes mails à synchroniser seront présentés dans ce serveur par un sous répertoire de compte backup@switzernet.com.
/etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = mail6.switzernet.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail6.switzernet.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_mailbox_domains = switzernet.com
virtual_mailbox_base = /home/vbox
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_limit = 0
/etc/postfix/vmailbox
backup@switzernet.com switzernet.com/
Il y a qu’un seul compte mail ‘virtuel’ dans ce serveur dont lequel chaque répertoire correspond à un de nos comptes mails.
/etc/dovecot/dovecot.conf
protocols = imap
listen = *
disable_plaintext_auth = no
log_path = /var/log/dovecot/dovecot.log
info_log_path=/var/log/dovecot/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
login_greeting = ready....
auth default {
mechanisms = plain cram-md5
user = root
userdb passwd-file {
args = /etc/dovecot/dovecot.users
}
#fallback to PAM
userdb passwd {
}
passdb passwd-file {
args = /etc/dovecot/dovecot.users
}
#fallback to PAM
passdb pam {
}
socket listen {
client {
# Assuming the default Postfix $queue_directory setting
path = /var/spool/postfix/private/auth
mode = 0660
# Assuming the default Postfix user and group
user = postfix
group = postfix
}
}
}
mail_extra_groups = mail
protocol imap {
}
protocol pop3 {
}
dict {
}
plugin {
}
Le format de fichier dovecot.users est identique à celle de projects.switzernet.com. On a crée un utilisateur spécial qui sera utilisée dans les commandes des synchronisations.
Imapsync est un petit programme en perl tout léger qui permet de synchroniser plusieurs boites mail en utilisant le protocole IMAP. Ce programme permet de conserver l’état des mails (lu, non-lu, brouillon…) Il permet également de conserver les dossiers dans l’état où ils étaient, les dates… En gros tout est conservé. Ce programme est très utile notamment lors de la migration d’un serveur de mail ou dans le cas d’une sauvegarde de boite mail sur une boite de secours.
La commande de base est la suivante :
imapsync --folderrec 'INBOX' --regextrans2 "s/(,| ;)/\'/g" --host1 mail3.switzernet.com --user1 billing@mail3.switzernet.com --password1 "your-password" --authmech1 PLAIN --host2 mail6.switzernet.com --user2 user2@switzernet.com --password2 "your-password" --authmech2 PLAIN --delete2 --expunge2 --prefix2 'billing.'
Type de synchronisation :
--folderrec: synchroniser récursivement le répertoire, elle considère aussi tous les sous-répertoires
--folder: synchroniser seulement le contenu de répertoire
--justfolders: synchroniser seulement l’architecture de répertoire.
--prefix2 'example.'
Cette option nous permet de synchroniser tous le contenu de boite mail source dans un sous-répertoire dont le nom est la valeur de cette option.
--prefix1 'example.'
Cette option nous permet de supprimer sa valeur de chemin source.
--regextrans2 "s/(,| ;)/\'/g"
Cette option nous permet de changer le chemin destination des emails selon la valeur de l’expression régulière utilisée, dans cet exemple on remplace tous les virgules et les points-virgules par une simple cote.
--expunge2
Cette option supprime tous les emails dans destination qui porte le drapeau supprimé (deleted flag)
--delete2
Cette option supprime les emails dans destination qui ne se trouve pas dans la source.
Imapsync ne supprime pas les répertoires dans destination même s’ils sont supprimés dans la source, pour corriger ce problème on a implémenté un script qui synchronise les répertoires: http://switzernet.com/public/100604-cleanimapunsync/
On lance ce dernier après imapsync depuis le cron de ce serveur:
# crontab -l
# m h dom mon dow command
30 03 * * * /root/imapcron/daily-imap-sync.sh >/dev/null
30 12 * * * /root/imapcron/daily-imap-sync.sh >/dev/null
/root/imapcron/daily-imap-sync.sh
#!/bin/bash
cd /root/imapcron
./billing-sync.sh
cat mail | mailx -s 'Billing-Backup-sync' mon-email@switzernet.com
./contracts-sync.sh
cat mail | mailx -s 'Contracts-Backup-sync' mon-email@switzernet.com
./projects-sync.sh
cat mail | mailx -s 'Projects-Backup-sync' mon-email@switzernet.com
./support-sync.sh
cat mail | mailx -s 'Support-Backup-sync' mon-email@switzernet.com
À chaque exécution, ce script envoi par email les statistiques de la synchronisation.
billing-sync.sh
#!/bin/bash
host1=mail3.switzernet.com
user1=billing@mail3.switzernet.com
pass1="mypassword"
host2=backup.switzernet.com
user2=billing@backup.switzernet.com
pass2="mypassword"
cmdimap="imapsync --subscribe --authmech1 PLAIN --authmech2 PLAIN --delete2 --expunge2 --host1 $host1 --user1 $user1 --password1 $pass1 --host2 $host2 --user2 $user2 --password2 $pass2 "
########################################################################
prefix1=""
prefix2="billing."
dir1="Sent"
dir2="billing.Sent."
echo -e "$dir1\n" > mail
$cmdimap --folder $dir1 --prefix2 $prefix2 > log
grep -A7 'Statistics' log >> mail
host1=$host1 user1=$user1 pass1=$pass1 dir1="$dir1/" host2=$host2 user2=$user2 pass2=$pass2 dir2=$dir2 cleanimapunsync
tail -1 /home/var/log/cleanimapunsync.log >> mail
########################################################################
prefix1=""
prefix2="billing."
dir1="INBOX"
dir2="billing.INBOX."
echo -e "\n\n$dir1\n" >> mail
$cmdimap --folderrec $dir1 --regextrans2 "s/(;|,)/\'/g" --prefix2 $prefix2 > log
grep -A7 'Statistics' log >> mail
host1=$host1 user1=$user1 pass1=$pass1 dir1="$dir1/" host2=$host2 user2=$user2 pass2=$pass2 dir2=$dir2 cleanimapunsync
tail -1 /home/var/log/cleanimapunsync.log >> mail
FAQ for imapsync
http://www.linux-france.org/prj/imapsync/FAQ
TODO file for imapsync
http://www.linux-france.org/prj/imapsync/TODO
Imapsync Revision: 1.77
http://www.linux-france.org/prj/imapsync/patches/imapsync.WilliamHernandez.INBOX.INBOX
Configuration de Postfix et Fetchmail
http://www.mirabellug.org/docs/postfixfetchmail/x110.html
Paramètres de Configuration de Postfix
http://postfix.traduc.org/index.php/postconf.5.html
Dovecot configuration file
http://wiki.dovecot.org/MainConfig
Installation du Postfix avec la librairie SASL sur Debian
http://switzernet.com/public/100531-postfix-sasl-smtp/
CleanIMAPunSync: cleaning zombie IMAP folders on the backup server
http://switzernet.com/public/100604-cleanimapunsync/
Switzernet mail infrastructure
http://switzernet.com/public/100604-mail-switzernet-infrastructure/
Zimbra mail server installation
http://switzernet.com/public/091215-zimbra-installation-config/
Postfix: mise en place du port 587 et modification de la taille des emails
http://switzernet.com/public/100608-postfix-reconf/
Configuration file only to Switzernet team
http://switzernet.com/company/100104-passwords/100701-mail-conf.7z