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.

Architecture

Configuration de Mail1/7.switzernet.com

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

transport_maps

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

virtual_alias_maps

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.

Configuration du mail5.switzernet.com (projects@switzernet.com)

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.

Configuration du mail6.switzernet.com (backup@switzernet.com)

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

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

Référence

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