= Exim sur une lenny = (Exim4 à la manière RogerYerbanga) - http://www.exim.org - == Avant-propos == Oui ! Je reconnais que ce document est "assez long", mais il traite quand même d'un service très important de l'internet avec les services annexes, et j'ai moi même dû lire des documents beaucoup plus longs et en anglais en plus pour arriver à l'écrire. Au début, je voulais faire un truc court et rapide mais, à chaque fois j'ai cherché à mieux expliquer et ça donne donc finalement une longue page. Ce document est donc pour ceux qui veulent vraiment comprendre comment ça fonctionne : prenez votre courage à deux mains voire deux mains et deux pieds, et lisez le jusqu'à la fin. Pour ceux qui sont pressés, faîtes un copier/coller, enlevez les commentaires et démarrer exim, et le deboggage qui va avec. (Mais je vous assure qu'il n'y'aura pas beaucoup choses à modifier) Cependant, avec un peu de courage (inch'Allah), je récrirai certainement une autre documentation plus digeste et décomposée en plusieurs parties. JC : A toi l'honneur ;-) == Introduction == Exim est un serveur de messagerie électronique (Mail Transfer Agent) utilisé sur de nombreux systèmes UNIX. Son choix est justifié par le fait qu’il est très complet avec de nombreux paramètres, qu’il permet de faire du maildir (livraison des mails dans un répertoire), qu’il permet de choisir notre méthode de gestion des utilisateurs (soit base de données mysql, ldap, passwd, …), il est robuste (peut gérer des grands systèmes avec des milliers d’utilisateurs et de mails par jour), il est capable de rejeter les mails dans la session SMTP ce qui génère moins de trafic, et il est assez aisé à configurer, et il est très bien documenté. Exim tourne grâce et/ou avec un certain nombre de fichiers qu’on peut classer en 4 groupes : - Les binaires qui sont les exécutables de exim et qui définissent le fonctionnement global de exim. - Les fichiers de configurations sur lesquels se basent les binaires et qui déterminent la manière dont exim tourne sur notre système - Les fichiers logs, des fichiers journaux qui donnent des détails sur le processus d’exécution de Exim. - Et les mails qu’il délivre aux utilisateurs dans leur répertoire ou fichier respectif. Dans ce document, j'expliquerai beaucoup plus la configuration de exim ainsi que les tests à faire pour valider sa configuration de exim. == 1- Prérequis == Pour son installation, sur une debian lenny, il suffit juste de faire : aptitude install exim4-daemon-heavy L'installation est donc très facile;-) Cependant, pour qu'exim tourne, il lui faut obligatoirement un anti-virus (on fait appel à clamav), et un antispam est optionnel, mais fortement recommandé, le standard de fait est spamassassin, possible de mettre du mailman pour ceux qui veulent gérer des listes de diffusion. Exim utilise sa-exim pour contrôler sa manière de causer avec des programmes comme spamassassin, et préciser comment on traite les spams en fonction de leur score ; il est également à installer. Un autre programme interessant est greylistd, qui permet de faire du greylisting à la sauce debian. Sur une lenny, l'installation de ces paquets se fait juste avec aptitude install Il faut cependant faire attention pour clamav et s'assurer que les deux paquets clamav-freshclam et clamav-daemon. === 1.1- ClamAV === - http://www.clamav.net/ - Deux sous-programmes : - clamav-freshclam : qui se charge des mises à jour de la base de définitions des virus - clamav-daemon : qui fait le vrai boulot, scanne les fichiers à la recherche de virus Les fichiers de configurations sont dans /etc/clamav et sont : - /etc/clamav/clamd.conf : C’est le principal fichier de configuration, c’est lui qui précise les paramètres comme le type de fichiers à scanner ou ne pas scanner et les options qui vont avec, les fichiers où écrire les logs, la taille maximale des fichiers à scanner, … Pour ce fichier, les options à retenir sont : {{{ Mettre un # devant la ligne commençant par LocalSocket pour la commenter Ajouter la ligne : TCPSocket 3310 Ajouter la ligne : TCPAddr 127.0.0.1 Vérifier la ligne : User clamav Vérifier la ligne LogFile : LogFile /var/log/clamav/clamd.log Vérifier ou activer les lignes : LogTime true ScanPE true ScanOLE2 true ScanHTML true ScanMail yes ScanArchive true Mais : Ne pas activer l’option MailFollowURLs MailFollowURLs false }}} - /etc/clamav/freshclam.conf : C’est le fichier de configuration de freshclam. Il précise les paramètres de mise à jour automatique de l’antivirus (toutes les 2h), les serveurs proxy, si nécessaire, le nombre de tentatives de mise à jour, et les fichiers logs. Pour ce fichier, les options à retenir en plus de la config par défaut sont : {{{ DatabaseOwner clamav UpdateLogFile /var/log/clamav/freshclam.log LogFileMaxSize 10M LogTime true DatabaseDirectory /var/lib/clamav/ DNSDatabaseInfo current.cvd.clamav.net DatabaseMirror db.XY.clamav.net # Où XY représente le country code de votre pays DatabaseMirror database.clamav.net }}} ''' Quelques outils pour vérifier que clamav fonctionne bien ''' * freshclam -V : Pour voir la version * freshclam : pour faire la mise à jour de la base de données * telnet 127.0.0.1 3310 {{{ Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. SCAN /home/roger/ /home/roger/: OK Connection closed by foreign host. }}} * clamscan -r -l /home/roger/scan.txt /etc/clamav/ {{{ /etc/clamav/freshclam.conf: OK /etc/clamav/freshclam.conf.old: OK /etc/clamav/clamd.conf: OK /etc/clamav/clamd.conf.old: OK ----------- SCAN SUMMARY ----------- Known viruses: 514191 Engine version: 0.94.2 Scanned directories: 4 Scanned files: 4 Infected files: 0 Data scanned: 0.00 MB Time: 1.786 sec (0 m 1 s) }}} * tail -f /var/log/clamav/freshclam.log * tail -f /var/log/clamav/clamav.log === 1.2- SpamAssassin === - http://www.spamassassin.org/ - La configuration par défaut de spamassassin fonctionne assez bien, même si des config plus sophistiquées avec des règles spécifiques sont possibles. Une doc sur spamassassin pourrait être bientôt rédigée. ''' Quelques options tout de même du fichier local.cf ''' {{{ # le score à partir duquel un message est classé comme spam. Par défaut, c’est 5, mais j’ai déjà vu des configurations avec 7. required_score 5.0 # Mettre ces 2 paramètres à 1 pour dire à SA de faire attention aux mots ou séquences de mots souvent présents dans les spams et de les apprendre lui-même. La commande sa-learn permet de faire apprendre manuellement. use_bayes 1 bayes_auto_learn 1 # permet de spécifier des réseaux auxquels on a confiance, donc des réseaux non spammeurs. trusted_networks 10.196.1/24 # (In SpamAssassin 3.2.x, it will no longer be necessary to specify 127.0.0.1; it'll automatically be trusted implicitly.) }}} ''' Pour tester ''' * spamassassin -D --lint // Puis avoir le courage de lire et analyser ce qui s'affiche * spamassassin --lint // Pour les plus pressés, en cas d'erreur, il vous dira quelle est l'erreur * Trouver les fichiers sample-nonspam.txt et sample-spam.txt ou bien créez vous deux mails : un spam et un nonspam, puis : * spamassassin –t < sample-nonspam.txt > nonspam.out * spamassassin –t < sample-spam.txt > spam.out * Et lire les fichiers spam.out et nonspam.out à la recherche du score du message. * utilisation de ps et lecture des logs === 1.3- Greylist === Pas forcément necessaire, mais interessant pour faire du greylisting : rejet de mail temporairement avec écriture d'informations (expéditeur, récepteur, serveur d'envoi) dans une base de données, puis demande de ressayer plus tard. Permet avec spamassassin de lutter contre les spams. Pour installer : aptitude install greylistd // et répondre oui ou non aux questions qu'il vous pose. Puis ouvrir le fichier /etc/greylistd/whitelist-hosts et rajouter sur 2 lignes différentes les IP du serveur mail de Montreal et de Dakar, puis d'autres serveurs auxquels vous avez assez confiance en matière de spam. == 2- Installation de exim == Tout simplement : aptitude install exim4-daemon-heavy sa-exim == 3- Configuration de exim == Il est possible de travailler avec l'installation par défaut de exim, mais vu qu'on aime pas les choses par défaut et qu'on comprend bien le fonctionnement de exim et son fichier de conf, on élimine la config par défaut pour créer notre propre fichier de configuration. === 3.1 - Destruction de la configuration par défaut === mv /etc/exim4/exim4.conf.template /etc/exim4/exim4.conf.template.orig Il est possible de supprimer tout ce qu'il y'a dans le répertoire /etc/exim4, à part le fichier sa-exim.conf === 3.2 - Fichier de conf de exim === Dans le cas de notre installation, il s'appelle /etc/exim4/exim4.conf.template. Mais il poourrait s'appeler n'importe quoi d'autre y compris prog ou fou ;-) Il faut donc le recréér puisqu'on vient juste d'être malin en le supprimant. La structure du fichier de configuration de exim ressemble à s'y méprendre au traitement qu'effectue un MTA sur un mail qu'il reçoit. Ce fichier est divisé en plusieurs sections, la première définit les options globales, tandis que les autres plus ou moins optionnelles commencent par '' begin ''. Les commentaires, les macros, les affectations, les inclusions sont disponibles, et la syntaxe ressamble à du langage de script shell. Le commentaire dans ce fichier est le caractère # en début de ligne.En général, on a 7 parties, et chaque partie à part la section globale correspond aux différentes actions réalisées sur un message : ==== 3.2.1 - Section globale ==== La section qui précise les paramètres globaux : {{{ # Donner les paramètres d'une base de données à exim. #hide mysql_servers = /// # Exemple : hide mysql_servers = 127.0.0.1/mail/admin/passefacileàcracker # Quelques paramètres pour Mailman dans la section principale MAILMAN_HOME=/usr/lib/mailman MAILMAN_VAR=/var/lib/mailman MAILMAN_WRAP=MAILMAN_HOME/mail/mailman MAILMAN_USER=list MAILMAN_GROUP=list domainlist MM_DOMAINS = domain1 : domain2 : domain3 # Pour faire du routage de mail manuel vers des serveurs qu'on veut # Mettre dans un fichier les domaines qu'on veut router manuellement # Par exemple, si je veux que les mails envoyés à auf.org passent d'abord par un serveur précis : # pas de requête DNS pour savoir vers quel serveur envoyer domainlist MR_DOMAINS = /etc/exim4/manual_route # Il est clair que ce fichier (/etc/exim4/manual_route) est à créer et doit contenir les domaines à # router manuellement ; un domaine par ligne. # Pour ceux qui ne font ni de l'authentification mysql, ni du mailman, ni du routage manuel, pas besoin de ces paramètres. # Le canonical name de votre serveur : # Je conseille de prendre le nom qui est déclaré dans le DNS, qui correspond au reverse et qui est # souvent celui qui se trouve dans /etc/mailname primary_hostname = # Le ou les domaines locaux # Choisir l'une des deux lignes suivantes en fonction que vous gérez plusieurs dizaines de domaines ou juste deux trois domaines domainlist local_domains = /etc/exim4/local_domains domainlist local_domains = @ : : : # Si vous décidez de choisir la première méthode, il faudra créer le fichier /etc/exim4/local_domains, et inscrire les différents domaines : une par ligne. # Pour la deuxième option, le @ signifie le nom de la machine. # Les domaines pour lesquels on sert de relay. C'est mis dans un fichier, mais si on n'a que peut de domaines qui ne changeront pas souvent, # il est conseillé de les mettre directement sur la ligne comme dans l'option 2 du local_domains. domainlist relay_to_domains = /etc/exim4/relay_to_domains # Les clients, les IP qui ont le droit sans s'authentifier d'utiliser ce serveur pour envoyer des mails # Fichier à créer, sinon mettre les réseaux (exemple : 10.196.1.0/24) directement sur la ligne hostlist relay_from_hosts = /etc/exim4/relay_from_hosts # On définit deux ACL qu'on utilisera pour traiter les mails. # acl_check_rcpt qui analyse les entêtes pour faire des vérifications sur l'emetteur et surtout le recepteur acl_smtp_rcpt = acl_check_rcpt # qui analyse les données acl_smtp_data = acl_check_data # Ces deux acls seront décrites plus loin dans la section des acls. # Comment on appelle l'antivirus av_scanner = clamd:127.0.0.1 3310 # C'est pour cela qu'il est important de tester que le port 3310 répond # Il est possible de préciser un autre serveur Antivirus avec : av_scanner = clamd: 3310 # Comment on appelle l'antispam spamd_address = 127.0.0.1 783 # Possible d'interroger un autre serveur Anti-spam si on a le droit en précisant son IP # Exemple : spamd_address = 196.200.41.41 783 # Exemple : av_scanner = clamd:41.41.200.196 3310 # Pour clamav # Dire à tout le monde qu'on fait du TLS, même à ceux qui ne veulent pas tls_advertise_hosts = * # Les fichiers où trouver les certificat et clé TLS pour exim # Le certificat et la clé privé peuvent être mis dans un fichier unique tls_certificate = /etc/exim4/keys/exim.crt tls_privatekey = /etc/exim4/keys/exim.pem # Ces fichiers et répertoires sont donc à créér avec la PKI. # Les ports écoutés par exim daemon_smtp_ports = 25 : 587 # Le domaine principal de messagerie qualify_domain = # Faire des requêtes de reverse DNS sur toutes les requêtes reçues. Possible de restreindre à certains réseaux ou tout simplement supprmier host_lookup = * # Faire des requêtes rfc 1413 pour identifier la connexion pour toutes connexion SMTP, avec un timeout à 5s rfc1413_hosts = * rfc1413_query_timeout = 5s # Les frozen # Quand exim ne peut pas délivrer un message, ni le message d'erreur engendré, il gèle le message d'erreur. Il ne tente pas de le renvoyer. # Cette option dégèle le message d'erreur après 3 jours, ressaye de le renvoyer et ignore les éventuels erreurs pouvant survenir ignore_bounce_errors_after = 3d # Cette option supprime les messages gelés pendant plus de 7 jours timeout_frozen_after = 7d # Option à activer dans de gros systèmes, le répertoire de spool est subdivisé en plusieurs sous-repertoires : 0, 1, ... A, B, ... a, b, ... z # split_spool_directory = true # Permet de gérer plus efficacement de très grosses queues de mails # Banière SMTP au lieu d'afficher le nom du logiciel Exim-4.69 ... smtp_banner = " ESMTP Agence universitaire de la Francophonie - " # On n'a pas le temps d'attendre plus de 2 mn quand l'autre bout ne réagit plus smtp_receive_timeout = 2m # Possible d'activer ces paramètres et les adapter à vos besoins #smtp_accept_max = 30 #smtp_accept_max_nonmail = 3 #smtp_max_unknown_commands = 3 #smtp_accept_max_per_host = 5 # FIn Section globale, les autres sections commencent donc toutes par begin }}} ==== 3.2.2 Section des acls ==== Rappelez-vous, dans la section principale, on avait parlé de deux acls, acl_check_rcpt et acl_check_data ; il faut donc les écrire dans cette section. {{{ ###################################################################### # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ###################################################################### # On commence la section par begin acl begin acl # Ecriture de l'acl acl_check_rcpt # Cette acl fait un certain nombre de tests sur les destinataires du message et sur l'emetteur # Les tests sont exécutés séquentiellement, jusqu'à ce qu'on tombe sur denied ou un accepted # ACL appelée avant la réception des données acl_check_rcpt: # Commencer d'abord par faire du greylisting # D'abord différer la réception du message et demander au serveur distant de ressayer plus tard # Mais ne pas différer la réception des mails qui viennent de serveurs whitelistés defer message = $sender_host_address is not yet authorized to deliver \ mail from <$sender_address> to <$local_part@$domain>. \ Please try later. log_message = greylisted. !senders = : !hosts = : +relay_from_hosts : \ ${if exists {/etc/greylistd/whitelist-hosts}\ {/etc/greylistd/whitelist-hosts}{}} : \ ${if exists {/var/lib/greylistd/whitelist-hosts}\ {/var/lib/greylistd/whitelist-hosts}{}} !authenticated = * domains = +local_domains : +relay_to_domains verify = recipient/callout=20s,use_sender,defer_ok condition = ${readsocket{/var/run/greylistd/socket}\ {--grey \ $sender_host_address \ $sender_address \ $local_part@$domain}\ {5s}{}{false}} # Deny si blacklisté par greylist deny message = $sender_host_address is blacklisted from delivering \ mail from <$sender_address> to <$local_part@$domain>. log_message = blacklisted. !senders = : !authenticated = * verify = recipient/callout=20s,use_sender,defer_ok condition = ${readsocket{/var/run/greylistd/socket}\ {--black \ $sender_host_address \ $sender_address \ $local_part@$domain}\ {5s}{}{false}} # Accept si la source est local accept hosts = : # Fin du greylisting dans l'acl_check_rcpt # Deny certains caractères (@ . ! / | %) qui ne sont pas au bon endroit dans le local_part deny message = Restricted characters in address domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] deny message = Restricted characters in address domains = !+local_domains local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ # Accepter les mails au postmaster dans tous les domaines locaux sans regarder la source # Postmaster recevra donc plus de spam que tout le monde à priori accept local_parts = postmaster domains = +local_domains # Vérifier si le domaine de l'expéditeur existe, sinon, refuser require verify = sender # Accepter le message s'il vient d'un hôte dans relay_from_hosts, donc est un client # On si l'utilisateur s'est authentifié depuis n'importe quel hôte ou réseau. # Client accept hosts = +relay_from_hosts control = submission/domain= # Authentifié accept authenticated = * control = submission/domain= # control = submission qu'il cause à des MUAs et qu'il aura peut être à corriger des problèmes liés aux MUAs # "/domain=" permet d'ôter les domaines dans les noms d'utilisateurs reçus par submission. # Si vous ne gérez pas plusieurs domaines et que vos utilisateurs s'authentifie uniquement avec le local_part et non l'email, pas besoin de ça. # Si c'est deux conditions (le domaine doit être local ou être un domaine qu'on accepte de relayer) ne sont pas remplies, ==> relay non permis require message = relay not permitted domains = +local_domains : +relay_to_domains # A ce niveau, le domaine reçu est bien géré par votre serveur # Il reste à vérifier que l'utilisateur est bien connu chez vous require verify = recipient # Puis, si le message passe cette étape, on l'accepte du point de vue de cette acl accept # Ecriture de l'acl acl_check_data # Cette acl est utilisée après la réception du corps du message # Les tests sont exécutés séquentiellement, jusqu'à ce qu'on tombe sur denied ou un accepted acl_check_data: # Commencer d'abord par faire du greylisting defer message = $sender_host_address is not yet authorized to deliver \ mail from <$sender_address> to <$local_part@$domain>. \ Please try later. log_message = greylisted. !senders = : !hosts = : +relay_from_hosts : \ ${if exists {/etc/greylistd/whitelist-hosts}\ {/etc/greylistd/whitelist-hosts}{}} : \ ${if exists {/var/lib/greylistd/whitelist-hosts}\ {/var/lib/greylistd/whitelist-hosts}{}} !authenticated = * domains = +local_domains : +relay_to_domains verify = recipient/callout=20s,use_sender,defer_ok condition = ${readsocket{/var/run/greylistd/socket}\ {--grey \ $sender_host_address \ $sender_address \ $local_part@$domain}\ {5s}{}{false}} deny message = $sender_host_address is blacklisted from delivering \ mail from <$sender_address> to <$local_part@$domain>. log_message = blacklisted. !senders = : !authenticated = * verify = recipient/callout=20s,use_sender,defer_ok condition = ${readsocket{/var/run/greylistd/socket}\ {--black \ $sender_host_address \ $sender_address \ $local_part@$domain}\ {5s}{}{false}} accept hosts = : # Fin du greylisting dans l'acl_check_rcpt # Rajout de quelques deny pour les mails virusés, les extensions MIME malformées, les extensions de fichiers windows non sollicitées. deny malware = * message = Message bi, contient virus mom ! ($malware_name). deny message = This message contains malformed MIME ($demime_reason). demime = * condition = ${if >{$demime_errorlevel}{2}{1}{0}} deny message = Blacklisted file extension detected - Extension de fichier non autorisee demime = exe:pif:bat:src # Rajout de warning pour le score spamassassin du mail warn spam = nobody add_header = X-Spam_score: $spam_score\n\ X-Spam_score_int: $spam_score_int # Puis finalement, accepter le message accept # FIN des ACLs ########################### }}} ==== 3.2.3 Section des Routers ==== La section des Routers est avec celle des Transports à venir les sections où on réfléchit le plus pour faire le plus d'adaptation à nos installations. Les routeurs précisent la manière dont sont routés les mails, quel mail doit être délivré localement, quel mail doit sortir avec du SMTP, ou faire appel au système d'alias, ou suivre un routage spécifique, ... Les routeurs sont exécutés les uns à la suite des autres tel qu'ils apparaissent dans le fichier de configuration. L'ordre est donc très important, même si des branchements conditionnels sont possibles. {{{ ###################################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # ###################################################################### # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! # # An address is passed to each router in turn until it is accepted. # ###################################################################### begin routers # Routeur pour faire du mailman # Faire quelques vérifications et appeler le mailman_transport qui se charge effectivement de transporter le mail s'il remplit ces conditions mailman_router: driver = accept domains = +MM_DOMAINS require_files = MAILMAN_VAR/lists/$local_part/config.pck local_part_suffix_optional local_part_suffix = -bounces : -bounces+* : \ -confirm+* : -join : -leave : \ -owner : -request : -admin transport = mailman_transport # Pour le routage manuel # Tester que le domaine est dans la liste des domaines à router manuellement # Puis, route_list permet de dire vers quel prochain serveur est envoyé le mail du domaine en question # Le transport appelé est remote_smtp qui permet d'envoyer des mails vers un autre serveur smtp smart_route: driver = manualroute domains = +MR_DOMAINS : domain1.org : domain2 transport = remote_smtp route_list = +MR_DOMAINS smtp.relaygeneral.gn ; domain1.org smtp1.relay1.net ; domain2 smtp2.relay2.org no_more # Le routeur qui permet d'envoyer des mails sur tout internet, à noter l'appel au transport remote_smtp dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more # Les alias sont cherchés littéralement dans le fichier texte /etc/exim4/aliases # Possible de faire mieux avec des bases de données et des requêtes SQL quand cela est necessaire, # pour 2 ou 3 alias ce routeur est largement satisfaisant system_aliases: driver = redirect allow_fail allow_defer data = ${lookup{$local_part}lsearch*@{/etc/exim4/aliases}} file_transport = address_file pipe_transport = address_pipe # Les deux routeurs suivants gèrent les utilisateurs locaux, # les utilisateurs venant d'une base de données mysql mysql_localuser: driver = redirect # 3 options ajoutées pour le recipient_delimiter de postfix roger+xyz=roger local_parts = $local_part : $local_part+* local_part_suffix = +* local_part_suffix_optional allow_fail allow_defer data = ${lookup mysql{select username from utilisateur where username='$local_part'}{$value}fail} redirect_router = localuser no_more # Ce qui signifie qu'on a une table utilisateur avec un champ username dans notre base de données dont les # paramètres ont été fournis dans la section globale # Routeur appelé par mysql_localuser # Celui-ci transporte le message avec le transport local_delivery, sinon Unkown user localuser: driver = accept # check_local_user # local_part_suffix = *+ local_part_suffix_optional transport = local_delivery cannot_route_message = Unknown user ## FIN des ROUTERS ######################## }}} ==== 3.2.4 Section des Transports ==== Le transport est l'appareil qui délivre le message à la destination (locale, distante, ...). Un transport est utilisé si et seulement si quand le message en fonction de son adresse de destination rempli les conditions spécifiées par le routeur qui appelle le transport. Par exmple, pour exécuté le transport mailman, il faut que l'adresse destinataire soit une liste locale. Et les conditions pour qu'un local_part soit une liste locale sont précisées dans le routeur mailman_router. De ce fait, l'ordre des transports n'est pas important, puisqu'ils sont tous appelés par des routeurs. {{{{ ###################################################################### # TRANSPORTS CONFIGURATION # ###################################################################### # ORDER DOES NOT MATTER # # Only one appropriate transport is called for each delivery. # ###################################################################### begin transports # Ce transport est utilisé pour délivré les messages à travers les connexions SMTP remote_smtp: driver = smtp # Ce transport est utilisé pour la livraison locale # Les répertoire des utilisateurs sont recherchés dans le champ homedir de la table utilisateur de la base de BD mysql # La livraison se fait sous format maildir local_delivery: driver = appendfile user = Debian-exim group = mail directory_mode = 0770 mode = 0660 mode_fail_narrower = false delivery_date_add envelope_to_add = true return_path_add = true directory = ${lookup mysql{select homedir from utilisateur where username='$local_part'}} maildir_format = true # Transport pour Mailman mailman_transport: driver = pipe command = MAILMAN_WRAP \ '${if def:local_part_suffix \ {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \ {post}}' \ $local_part current_directory = MAILMAN_VAR home_directory = MAILMAN_VAR user = MAILMAN_USER group = MAILMAN_GROUP # Deux transports suivants sont utilisés par les alias selon que l'alias renvoie une liste d'autres adresses (address_pipe) # ou une adresse locale pour laquelle il faut écrire dans un fichier. address_pipe: driver = pipe return_output address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add # FIN des TRANSPORTS ############################" }}}} ==== 3.2.5 Section des Retransmissions ==== Préciser comment est-ce que gère les retransmissions de message échouées {{{ ###################################################################### # RETRY CONFIGURATION # ###################################################################### begin retry # Une seule règle de retransmission appliquées à tous les domaines et tous les types d'erreurs # Les deux premières heures, retransmission toutes les 15 mn, puis retransmettre après 1h et augmenter # le délai de retransmission d'un facteur de 1.5 à chaque nouvelle retransmission jusqu'à 16h, puis # retransmettre toutes les 6h jusqu'à 4 jours depuis le premier échec. # Adresse ou Domaine Erreur Retransmissions # ------------------ ------ --------------- * * F,2h,15m; G,16h,1h,1.5; F,4d,6h # A noter qu'il est impératif d'avoir au moins cette ligne (donc une règle générale) # qui précise comment exim traite les retransmissions, sinon, il ne traitera pas de retransmission par défaut. # Il est également possible d'avoir plusieurs lignes par domaine et/ou erreur # FIN des RETRANSMISSIONS ############################## }}} ==== 3.2.6- Section des Récritures ==== Préciser comment est-ce que gère les retransmissions de message dont l'envoi a échoué {{{ ###################################################################### # REWRITE CONFIGURATION # ###################################################################### # Qu'est ce qu'on récrit et comment le fait-on ? begin rewrite # Changer les from et reply-to des gens qui sont en @sn.auf.org en auf.org // Des gens comme moi # A l'extérieur, l'email afficher par les MUA est xyz@auf.org, même si la vraie adresse sur le serveur est en .sn.auf.org *@sn.auf.org $1@auf.org rfF # Changer les To des gens en sn.auf.org pour ne pas que les mails locaux partent d'abord vers Montreal *@auf.org ${lookup{$local_part@$domain}lsearch*@{/etc/exim4/rewrite/$domain}{$value}fail} T # FIN des REWRITE ################################## }}} ==== 3.2.7- Section des Authentificateurs ==== Ce qui permet d'authentifier les utilisateurs ; très utile pour le roaming sans être un openrelay. {{{{{ ###################################################################### # AUTHENTICATION CONFIGURATION # ###################################################################### begin authenticators # Une clé secrète est fournie aux utilisateurs dans cet exemple. #PLAIN: # driver = plaintext # server_set_id = $auth2 # server_prompts = : # server_condition = ${if and {{eq{$auth2}{username}}{eq{$auth3}{mysecret}}}} # server_advertise_condition = ${if def:tls_cipher } # Ici, il faut construire une requête SQL en fonction de la base de données pour récupérer les # informations d'authentification de l'utilisateur PLAIN: driver = plaintext server_set_id = $auth2 server_prompts = : server_condition = ${if crypteq{$auth3}{${lookup mysql {select motdepasse from utilisateur where adresse ='$auth2' or (username='thomas' and mail like '%@refer.org')}{$value}}}{yes}{no}} server_advertise_condition = ${if def:tls_cipher} # Un autre exemple LOGIN: driver = plaintext public_name = LOGIN server_set_id = $auth1 server_prompts = UserName : Password server_condition = ${if crypteq{$auth2}{${lookup mysql {select password from auforg_virtual where (source='$auth1') and (destination not like '%@secours')}{$value}}}{yes}{no}} server_advertise_condition = ${if def:tls_cipher} # FIN des AUTHENTICATORS ################################ ###### FIN du Fichier de CONF de exim ################### }}}}} == 4- Configuration de sa-exim == Par défaut, la config de sa-exim n'a rien de spécial ; juste préciser quel est le répertoire de spool, le chemin d'accès à spamc, taille max du corps du message fourni à spamassassin, ... Par défaut, c'est bien bien fait, sauf qu'il faut néanmoins vérifier quelques paramètres. Le fichier en question est /etc/exim/sa-exim.conf, et je mettrai juste quelques paramètres à vérifier : {{{ # Ce paramètre est le plus important à vérifier, il doit être à 1 et non à 0, # pour activer sa-exim #SAEximRunCond: 0 # Pas bon SAEximRunCond: 1 # Score à partir duquel le message spamé est éliminé en silence # Puis sauvegarde du mail éliminé dans /var/spool/exim4/SAdevnull SAdevnull: 20.0 SAdevnullSavCond: 1 SAdevnullsave: /var/spool/exim4/SAdevnull # Score à partir duquel un message est permanement rejeté # Puis sauvegarde dans /ar/spool/exim4/SApermreject SApermreject: 13.0 SApermrejectSavCond: 1 SApermrejectsave: /var/spool/exim4/SApermreject # Score à partir duquel un message est temprairemement rejeté # Puis sauvegarde dans /ar/spool/exim4/SAtempreject SAtempreject: 7.0 SAtemprejectSavCond: 1 SAtemprejectsave: /var/spool/exim4/SAtempreject # Si vous n'avez pas envie de sauvegarder les messages rejeté de manière silencieuse, permanente, # ou temporaire, mettez à 0 le paramètre correspondant # Exemple : SAtemprejectSavCond: 0 pour le cas du temporaire # Taille max du body à fournir à spamassassin en octets # Exemple de 500Ko SAmaxbody: 512000 # 20 Mo pour les mails rejetés sauvegardés # to archive? Default is 50MB. SAmaxarchivebody: 52428800 ## FIN de sa-exim }}} == 5- Création des fichiers et répertoires utilisés dans la conf de exim == * /etc/exim4/aliases Facile, faire un lien entre le fichier alias du système et /etc/exim/aliases Pour écrire une ligne d'alias, c'est tellement compliqué que c'est hors sujet * /etc/exim4/keys/ Créer ce répertoire et mettre vos certificat et/ou clé SSL pour exim (exim.crt et exim.key) * /ext/exim4/local_domains Créer ce fichier et y mettre vos domaines locaux un par ligne Exemple : {{{ @ andriantsoavina.org refer.org }}} * /etc/exim4/relay_from_hosts Fichier censé contenir les IP des clients {{{ 127.0.0.1 }}} * /ext/exim4/relay_to_domains Même syntaxe que local_domains mais concerne les domaines à relayer. * /ext/exim4/manual_route Même syntaxe que relay_to_domains mais concerne les domaines router manuellement * Mailman : Installez le si ce n'est déjà fait, ou détruisez toute trace de mailman dans la conf de exim * MySQL : La base de données MySQL doit être créée avec les paramètres précisés à exim et la utilisateur * Autres : Créez tout ce qui a été invoqué et qui n'existe pas. == 6- Tests et validations == a. exim -bV : permet de vérifier la version et les options supportées exim, et aussi la syntaxe du fichier de configuration. En cas d'erreur de syntaxe, on est informé par cette commande avant de recharger le fichier. {{{ Exim version 4.69 #1 built 30-Sep-2008 18:26:44 Copyright (c) University of Cambridge 2006 Berkeley DB: Berkeley DB 4.6.21: (September 27, 2007) Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning Old_Demime Lookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp Fixed never_users: 0 Size of off_t: 8 }}} a. exim -bP : Affiche toutes les variables définies dans le runtime configuration file a. exim -bt : permet de tester le comportement de exim lorsqu'il reçoit un mail à destination de {{{ # exim -bt roger@test.gn roger@test.gn <-- roger@test.gn router = localuser, transport = local_delivery # exim -bt roger@gmail.com roger@gmail.com router = dnslookup, transport = remote_smtp host gmail-smtp-in.l.google.com [216.239.59.27] MX=5 host alt1.gmail-smtp-in.l.google.com [209.85.135.27] MX=10 host alt2.gmail-smtp-in.l.google.com [209.85.220.21] MX=20 host alt3.gmail-smtp-in.l.google.com [74.125.47.27] MX=30 host alt4.gmail-smtp-in.l.google.com [209.85.147.27] MX=40 # exim -bt diffusion-ao@test.gn diffusion-ao@test.gn router = mailman_router, transport = mailman_transport }}} a. exim -v -odf : essaie de livraison réelle avec quelques détails sur les actions prises par exim. a. exim -d -odf : essaie de livraison réelle avec un full debug : tous les détails de toutes les actions dans les moindres détails. a. exim -bh : permet de vérifier le relayage depuis cette IP même si on est pas sur une machine qui a cette IP. En gros, ça permet de vérifier que les mails de vos clients sont bien pris en compte, tandis que ceux des non-clients sont "denied" a. telnet 127.0.0.1 25 et telnet 127.0.0.1 587 a. Voir les logs /var/log/exim/mainlog /var/log/exim/rejectlog (et /var/log/exim/paniclog qui ne devrait pas exister si tout se passe bien) == Conclusion == __ Sources__ : [[http://www.exim.org|exim]] [[http://www.spamassassin.org|SpamAssassin]] [[http://tools.ietf.org/html/rfc1413|rfc 1413]] [[http://www.clamav.net/|ClamAV]] http://www.yerbynet.com/Cours.html