====== Cluster Postfix et Imap distant ====== {{tag>postfix cluster smtp lmtp}} //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 [[http://en.wikipedia.org/wiki/LMTP|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 ::. 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. ([[http://wiki.linuxwall.info/doku.php?id=ressources:dossiers:postfix:authentification_sasl|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 [[http://wiki.linuxwall.info/doku.php?id=ressources:dossiers:postfix:smtp_tls|(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=, orig_to=, 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~~