Cluster Postfix et Imap distant

par julien, oct. 2007

Un serveur mail, c'est bien. Mais quand ca tombe, c'est embetant ! Ce qui est fait sur linuxwall, c'est deux serveurs postfix et un Cyrus-Imap en backend qui stocke les mails.

Le serveur SMTP1 et le backend Cyrus-IMAP sont sur la meme machine. Le serveur SMTP2 est sur une machine separee.

Si tout va bien, ou si SMTP2 est en vrac, SMTP1 recoit les mails et les stockent dans le backend. Si SMTP1 tombe, SMTP2 recoit les mails et les gardent en file d'attente (queue) jusqu'a ce que SMTP1 revienne, il peut alors envoyer les mails en queue au backend IMAP.

Voilà l'architecture :

+========srv 1========+    +====srv 2=======+
||  +--------+       ||    ||  +--------+  ||
||  | SMTP 1 |       ||    ||  | SMTP 2 |  ||
||  +--------+       ||    ||  +--------+  ||
||    | |            ||    ||   /          ||
||    | |            ||    +===/============+
||    | |            ||       /
||     V             ||      /
||  +------------+   ||     /
||  | Cyrus IMAP | <~~~~~~~~
||  +------------+   ||
+=====================+

Les serveurs communiquent entre eux via le protocole LMTP, version allegee de SMTP destinee a une utilisation entre MTA et backend POP/IMAP.

Configuration générale

On considere que Cyrus-Imap est operationnel et supporte l'authentification SASL. De meme pour Postfix, qui va supporter l'authentification SASL en STARTTLS. (voir les autres articles de ce dossier).

Le protocole LMTP n'est pas connu de /etc/services, donc on va le renseigner dans ce fichier sur le port 24 tcp :

# grep lmtp /etc/services
lmtp            24/tcp                          #Local Mail Transfer Protocol

Ceci doit être fait sur toutes les machines.

Cyrus

Sur la machine qui va stocker les mails, il faut configurer le daemon LMTP, c'est à dire l'activer dans /etc/cyrus.conf

# contenu de cyrus.conf concernant lmtp
lmtp            cmd="lmtpd" listen="lmtp" prefork=0 maxchild=20

Les front-end postfix vont s'authentifier sur Cyrus non pas avec un compte utilisateur classique mais avec un compte special. Ici, on prendra le compte 'cyrus' qui est administrateur du serveur cyrus-imap.

Ce compte doit normalement exister et posseder un mot de passe. On peut tester le service LMTP en se connectant avec l'utilisateur 'cyrus' via lmtptest :

# lmtptest -a cyrus
WARNING: no hostname supplied, assuming localhost
 
S: 220 machin.linuxwall.info LMTP Cyrus v9.3.99-Debian ready
C: LHLO example.com
S: 250-machin.linuxwall.info
S: 250-8BITMIME
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-SIZE
S: 250-AUTH PLAIN
S: 250 IGNOREQUOTA
Please enter your password:
C: AUTH PLAIN AGN5cnVzAHNqYXpvZHVoYXNvY2h2ZGZoY3p2Y2hk
S: 235 Authenticated!
Authenticated.
Security strength factor: 0
C: QUIT
Connection closed.

Et voila, l'authentification fonctionne !

Postfix

La configuration est la meme pour SRV1 et SRV2.

Première étape, vérifier que le module LMTP de Postfix est activé dans /etc/postfix/master.cf

# grep lmtp /etc/postfix/master.cf
lmtp      unix  -       -       -       -       -       lmtp

Pour router les mails au travers du canal LMTP vers le backend Cyrus-IMAP, il faut utiliser un domaine virtuel. Ce domaine virtuel est configuré pour délivrer les mails via LMTP sur l'hote “machin.linuxwall.info”, et on le declare dans le fichier main.cf :

# mailbox virtuelle pour linuxwall delivree sur le LMTP local
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps
virtual_mailbox_domains = linuxwall.info
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_alias_maps = hash:/etc/aliases
virtual_transport = lmtp:machin.linuxwall.info:lmtp
lmtp_tcp_port = 24
lmtp_sasl_auth_enable = yes
lmtp_sasl_password_maps = hash:/etc/postfix/lmtpauth
lmtp_sasl_mechanism_filter = plain, login
lmtp_sasl_security_options =

On a plusieurs choses dans les lignes ci-dessus. On definit un transport virtuel pour le domaine linuxwall.info. Ce domaine va s'appliquer pour les destinataires listes dans le fichiers /etc/postfix/virtual_mailbox. On va donc, dans ce fichier, placer nos utilisateurs :

# cat /etc/postfix/virtual_mailbox
toto@linuxwall.info   ;toto;
...etc

On peut egalement creer un fichier d'aliases pour les redirections, ici on va utiliser le meme que celui par defaut.

La ligne virtual_transport définit l'hote est le port de destination pour LMTP sous la forme <protocole>:<hote>:<port>. On positionne ici l'emplacement de notre backend Cyrus-Imap.

Au cas ou, on redéfinie le port LMTP (mais normalement ya pas besoin, vu qu'il est dans /etc/services).

Et la partie touchy, c'est l'authentification. Cyrus va systématiquement renvoyer un “430 Authentication required” si cette partie est mal configurée. (plus d'info sur l'authentification SMTP ici) Le fichier /etc/postfix/lmtpauth est une table de hash postfix qui est sous la forme :

host     user:password

Cette table doit contenir le user+mot de passe que l'on a tester dans le chapitre precedent. Donc :

machin.linuxwall.info     cyrus:supermotdepasse

On regenere le fichier en forme de table de hash via la commande:

# postmap /etc/postfix/lmtpauth

Ce qui crée le fichier /etc/postfix/lmtpauth.db qui va être lu par postfix et utilisé pour s'authentifier sur le backend Cyrus-imap.

Et on relance postfix avec

# postfix reload

Et la securite ???

Normalement, lorsque vous avez enregistre le mot de passe admin de cyrus dans le fichier du repertoire postfix, vous avez du vous poser la question de sa securite.

Bien, dans un premier temps, rappelons que ce type de fichier doit etre accessible a postfix seulement. Un petit chmod go-rwx /etc/postfix/lmtpauth* est donc necessaire.

Ensuite, quand SRV2 va s'authentifier aupres du backend Cyrus-IMAP sur SRV1, il va faire passer le couple user:motdepasse en clair. Il faut empecher cela, et donc mettre en place le support de TLS. Cote client, sur Postfix, cela se fait simplement via les lignes suivantes :

lmtp_use_tls = yes
lmtp_tls_note_starttls_offer = yes
lmtp_tls_loglevel = 2
lmtp_tls_CAfile = /etc/postfix/ca.crt

(voir ici pour plus d'infos)

Et cote Cyrus, pour activer TLS, il faut configurer le fichier /etc/imapd.conf, vers la fin, pour y preciser les differents certificats. Apres cela, vous devriez voir apparaitre la methode STARTTLS lors de la connexion au serveur LMTP:

# nc localhost 24
220 machin.linuxwall.info LMTP Cyrus v2.2.13-Debian-2.2.13-14+b3 ready
LHLO mail
250-machin.linuxwall.info
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-SIZE
250-STARTTLS
250-AUTH PLAIN
250 IGNOREQUOTA

De fait, votre client Postfix va forcer l'utilisation de STARTTLS et les mots de passe circuleront dans des canaux chiffres.

Log

L'arrivée d'un mail sur Postfix va déclencher son transfert sur Cyrus. Ceci peut être vu dans les logs par la ligne suivante :

Oct  8 15:01:18 ptitchoun postfix/lmtp[3736]: 9702A29FA: to=<toto@linuxwall.info>, orig_to=<michel@gmail.com>, relay=machin.linuxwall.info[51.36.211.122]:24, delay=10, delays=2.5/0.01/7.3/0.4, dsn=2.1.5, status=sent (250 2.1.5 Ok)

Ce qui veut dire que ça marche :)~~DISCUSSION~~

fr/ressources/dossiers/postfix/cluster.txt · Last modified: 2011/03/16 01:41 (external edit)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0