Page suivante Page précédente Table des matières
2. Passons aux choses sérieuses...
2.1 Présentation du problème
Le lecteur attentif aura sûrement remarqué la facilité de configuration des programmes de courrier « tous faits » comme le module courrier de Netscape ou Xfmail. Alors, pourquoi, se demandera-t'il, vouloir se compliquer la vie avec des usines à gaz comme
sendmail?Le lecteur un peu curieux aura parcouru le chapitre concernant
sendmaildans le livre « Administration réseau sous Linux » d'Olaf Kirch et n'aura pas manqué de lire avec effroi les lignes suivantes : « On dit souvent que celui qui n'a jamais édité un fichier standard sendmail.cf n'est pas un véritable administrateur UNIX. La légende dit aussi qu'il ne faut pas le faire deux fois, sous peine de devenir fou. ». Olaf a sûrement raison (on peut lui faire confiance, quoique certains articles decomp.mail.sendmailprouvent que l'on peut vivre avec la folie...). Pour rassurer ceux qui n'ont pas encore fui, j'insisterai sur le fait qu'il n'est pas question ici de manipuler ce fameux fichier sendmail.cf : les fichiers de configuration d'UNIX sont quelquefois abscons, mais celui-là tient le pompon !À moins de maîtriser parfaitement
sendmail(ce qui ne doit pas concerner grand monde...), il est fortement déconseillé de modifier directement quoi que ce soit dans ce fichier ! D'ailleurs, si vous vous en sentez capable, merci de m'expédier vos commentaires sur cette doc...Face à la complexité de cette syntaxe, plusieurs solutions ont vu le jour. Pour ma part, j'en connais au moins deux :
- le « kit jussieu », disponible à ftp://ftp.jussieu.fr/jussieu/sendmail/kit propose une génération automatique du sendmail.cf via un script de configuration qui utilise le préprocesseur du langage C. Ce kit comprend un document expliquant tout ce qu'il est nécessaire de savoir pour l'utiliser. Toutefois, il est plus dédié à des sites de type campus qu'à notre pauvre petite machine reliée par téléphone...
- les macros
m4permettent de préciser la configuration voulue dans une syntaxe relativement claire. Le fichier de macros est ensuite traité par le préprocesseurm4pour produire un sendmail.cf.Pourquoi passer à
sendmailalors que tout fonctionne bien avec des solutions comme Netscape ou Xfmail ? Sur une machine n'ayant qu'un seul utilisateur,moi, est-ce bien la peine d'utiliser un programme dont la vocation est de distribuer le courrier sur un campus universitaire ayant des centaines de machines ?La réponse est, évidemment, oui. Pas par snobisme ou pour « jouer dans la cour des grands », mais d'abord parce qu'il s'agit d'un beau petit défi, ensuite parce que les 2 solutions que sont Netscape et Xfmail présentent un grave défaut : elles sont fermées. Vous devez récupérer, envoyer et consulter les messages avec un unique produit, en général incompatible avec les autres.
Avec
sendmail, vous envoyez les messages en attente et récupérez les nouveaux dans votre boîte aux lettres et tout cela en utilisant le programme d'écriture/lecture de votre choix. Ici, le transport du courrier est séparé de sa création et de sa consultation. Ceci garantit que vous pourrez utiliser tous les logiciels UNIX écrits pour le mail carsendmailest le standard de facto (quoique certains utilisateurs lui préfèrentqmail). Alors, certes, c'est un peu d'effort, mais pas plus que d'arriver au bout d'un tableau deQuake... Et c'est sûrement plus rigolo.2.2 Survol du fonctionnement de sendmail
Je disais ci-dessus que
sendmaildélivrait les nouveaux messages dans votre boîte aux lettres. En fait, c'est faux :sendmailutilise un autre programme pour délivrer le courrier qui lui est arrivé. Sous Linux, ce programme est, le plus souvent,procmail. Sauf lors de la configuration, on n'a pas à se soucier de ce dernier.De plus, étant coupé du monde, il faut bien « alimenter »
sendmailavec les nouveaux messages qui sont sur le serveur POP de notre F.A.I. : là encore, un autre programme entre en jeu, il s'agit defetchmailqui remplace maintenant l'ancien programmepopclientqu'il ne faut plus employer pour des raisons de sécurité. Le Guide du Rootard cite un autre programme de récupération :gwpop.fetchmail, dans ses versions récentes, dispose de nombreuses fonctionnalités et est capable de gérer d'autres protocoles que POP, mais nous ne l'utiliserons qu'à son minimum.En résumé, une utilisation typique sera :
- écriture de courriers off-line ;
- connexion au F.A.I. ;
- expédition, sur l'Internet, des courriers écrits off-line avec
sendmail;- récupération des nouveaux courriers, auprès du serveur POP du F.A.I., avec
fetchmail;- déconnexion ;
- lecture des nouveaux courriers off-line.
On notera que les points 2 à 5 peuvent être regroupés en un seul script. D'autre part, il faut bien comprendre que
sendmailn'intervient pas seulement au point 3, mais à chaque fois qu'il y a transport de courrier sur notre machine. Ainsi, lorsque vous écrivez du courrier destiné à l'extérieur et que vous l'envoyez tout en étant déconnecté, c'estsendmailqui se charge de le mettre dans une file d'attente. C'est le contenu de cette file qui sera envoyée au point 3. Lorsquefetchmailrécupère les nouveaux courriers au point 4, c'estsendmailqui les dirige vers votre boîte aux lettres en utilisantprocmail.2.3 Fichiers utilisés par sendmail
Hormis le trop fameux
/etc/sendmail.cfdéjà évoqué,sendmailutilise un certain nombre de fichiers. En fait, dans le cas qui nous préoccupe, ce nombre a été réduit à la portion congrue : 6 fichiers suffisent, et encore, on pourrait s'en sortir avec 4... À ces 6 fichiers, il convient d'ajouter le fichier des macros m4 qui nous permettront de générer le fichier/etc/sendmail.cf, mais cette opération réalisée, il n'est plus utilisé. Je vous conseille cependant de le garder précieusement.Bien sûr, les différentes pages du manuel ne sont pas comptées ici, ce qui ne veut surtout pas dire qu'il ne faut pas les lire.
Comme tout programme qui se respecte,
sendmailutilise des fichiers trace qui permettent de repérer les éventuels disfonctionnement. Traditionnellement, il s'agit de/var/log/mail.erret/var/log/mail.logmais certaines installations les rassemblent en un seul fichier/var/log/maillog.Le fichier
/var/log/sendmail.stpermet de consulter les statistiques grâce à la commandemailstatsqui fait partie de la distribution.Le fichier
/usr/lib/sendmail.hfcontient les messages affichés parsendmail.Bien qu'il ne fasse pas partie de
sendmailà proprement parler, le fichier/etc/hostsest utilisé.Le fichier
/etc/genericstablepermet de préciser les réécritures des adresses locales.Le fichier
/etc/nsswitch.confsera utilisé ici pour résoudre le problème des « DNS lookup » lors du dépôt des messages dans la file d'attente.Si vous lisez des documents traitant de
sendmail, vous verrez aussi évoqué des fichiers portant les noms desendmail.dw, sendmail.ct, etc. Ils ne nous sont pas utiles ici.Maintenant la bonne nouvelle : vous n'avez que
sendmail.cfet/etc/genericstableà configurer, et, éventuellement,/etc/aliaseset/etc/hostsà vérifier.Enfin, avec
sendmailviennent deux programmes :mailstatsqui affiche les statistiques (taille des messages reçus et envoyés, etc.) etmailqqui affiche le contenu de la file d'attente des messages à envoyer.2.4 Commençons par le commencement...
La première chose à faire est de vérifier que l'on puisse bien récupérer les courriers sur le serveur POP distant. On verra après ce qu'il convient de faire de ceux-ci.
Le programme utilisé s'appelle
fetchmail, disponible sous forme de rpm dans la distribution Red Hat. De nouvelles versions apparaissent fréquemment : celle que j'utilise est la version 4.5.0 et de nouvelles versions apparaissent régulièrement.Pour nos besoins, la configuration est très simple : elle consiste à créer un fichier
.fetchmailrcdans le répertoire de l'utilisateur. Ce fichier sera lu à chaque exécution du programme et doit donc contenir les options globales d'utilisation. Depuis la version 4.5.0, cette opération de configuration est devenue triviale : le programmefetchmailconfest une interface graphique sous X disposant de deux modes (novice et expert) vous permettant de créer ce fichier sans douleur.Un fichier
.fetchmailrctypique pour notre configuration est :
# Configuration created Sun Jun 21 16:40:53 1998 by fetchmailconf poll pop.fai.fr with proto POP3 user "ego" there with password "xxxxx" is moi here
- la ligne «
poll» demande àfetchmailde scruter le serveurpop.fai.fren utilisant le protocole POP3 ;- la ligne suivante indique que votre compte sur le serveur POP est
egoavec le mot de passexxxxxet que les messages reçus venant de ce serveur et de ce compte sont pour le comptemoide votre machine.Pour plus d'informations sur la syntaxe de
.fetchmailrc, consultez la page du manuel, ainsi que les différentes docs et fichiers exemples fournis avec la distribution (répertoire/usr/doc/fetchmail*).Étant donné que le mot de passe de votre compte POP est en clair dans ce fichier, vérifiez qu'il ne peut être lu que par vous. D'ailleurs, si ce n'est pas le cas,
fetchmailrefusera de s'exécuter.Ce fichier créé, on va tester la récupération en faisant en sorte de laisser les messages récupérés sur le serveur car, par défaut,
fetchmailles supprime du serveur distant. Pour ce faire, et comme nous l'avons dit plus haut, nous allons travailler sous le compterootpour nous affranchir des problèmes de droits liés à la connexion. Créez un.fetchmailrccomme indiqué plus haut dans le répertoire/root, connectez-vous et tapez la commande :
fetchmail -kL'option
-k(keep) indique qu'il faut garder les messages lus sur le serveur.fetchmaildispose de nombreuses autres options : cf. le manuel.Normalement, avec cette commande, vous devriez voir certaines choses s'afficher, notamment si vous avez ou non du courrier, et le nombre de messages qui sont récupérés. Si un message vous indique que la connexion n'a pu s'effectuer avec le serveur, vérifiez le
.fetchmailrc, notamment que vous ne vous êtes pas trompés entre le nom d'utilisateur local et distant et que le mot de passe est correct.Attention, vous risquez fort d'avoir des messages dus au fait que votre sendmail n'est pas installé ou configuré. Les messages qui comptent ici sont ceux vous informant que le courrier est récupéré, pas les messages vous avertissant que ce courrier ne peut être délivré localement.
2.5 Installation des paquetages sendmail et procmail
Ainsi que nous l'avons dit plus haut,
sendmailne fournit pas de programme permettant de délivrer le courrier. Pour cela, il faut utiliser un autre programme : le plus courant s'appelleprocmail. Ces deux programmes sont disponibles pour toutes les distributions Linux : sous formes de paquetagesrpm, debou tarballs. Utilisez la méthode préconisée par votre distribution (rpm, dpkg ou tar). Vérifiez aussi que le paquetagemailxest installé car c'est lui qui contient le programmeNormalement,
sendmails'installe sous/usr/sbin/en suid, il appartient àrootet au groupemailstatsetmailqs'installent dans/usr/bin/et appartiennent tous deux àrootavec droits d'exécution pour tous. En fait,mailqn'est pas un programme mais un lien verssendmail -bp. Enfin,procmailse trouve aussi dans ce répertoire et est suid.Attention : Le paquetage
rpmde sendmail pour la Red Hat a été divisé en trois : l'un contient les programmes, l'autre tous les fichiers permettant de le reconfigurer et le troisième contient la documentation(j'ignore la situation pour les autres distributions). Dans tous les cas, assurez-vous qu'un répertoire/usr/lib/sendmail-cfa été créé et qu'il contient plusieurs sous-répertoires. Parmi eux,/usr/lib/sendmail-cf/cfest celui qui nous intéresse au premier chef. Bien sûr, de nombreuses documentations sont placées dans/usr/doc/sendmailet les pages du manuel desendmailet deprocmailsont dans leurs emplacements habituels. Si/usr/lib/sendmail-cfn'existe pas, installez le paquetage correspondant aux fichiers de configuration (sendmail-cf*.rpmpour la Red Hat). De même, avec cette distribution Linux, la documentation ne sera présente que si vous avez installé le paquetagesendmail-doc*.rpm.Normalement, l'installation aura aussi modifié vos fichiers de démarrage afin de lancer le démon
sendmaillors du boot de votre machine (vérifiez les messages qui s'affichent). Selon les distributions, des outils existent pour préciser quels démons doivent être lancés au démarrage (par ex.tksysvoulinuxconfavec Red Hat) : pour utilisersendmail, vous devez vous assurer que les démonsnetworketsendmailtournent.Vérifiez que le préprocesseur
m4est bien intallé sur votre machine (normalement dans/usr/bin) car il sera nécessaire pour créer le fichier/etc/sendmail.cf.Le répertoire
/usr/lib/sendmail-cf/ostypedoit contenir un fichierlinux.m4qui définit des constantes propres à Linux, notamment celles indiquant le chemin de l'emplacement deprocmail. Ne modifiez pas ce fichier ! Au pire, s'il n'existe pas, nous pourrons redéfinir ces variables dans notre fichier de configuration.2.6 Création du fichier
/etc/sendmail.cf
Nous y voilà ! La démarche est plutôt simple : sous
root, nous allons créer un fichierconfig.mcdans le répertoire/usr/lib/sendmail-cf/cf.Ce fichier se bornera à donner des valeurs à certaines constantes et à définir certaines options.
Enfin, nous compilerons ce fichier pour qu'il génère
/etc/sendmail.cf.Sous le compte
root, mettez vous dans le répertoire/usr/lib/sendmail-cf/cfet, à l'aide de votre éditeur de texte favori, créez le fichierconfig.mcsuivant :
include(`../m4/cf.m4')dnl OSTYPE(`linux')dnl define(`SMTP_MAILER_FLAGS', `e9')dnl FEATURE(redirect)dnl FEATURE(nocanonify)dnl FEATURE(always_add_domain)dnl FEATURE(local_procmail)dnl GENERICS_DOMAIN(machine.domaine.fr machine localhost) FEATURE(genericstable) FEATURE(masquerade_envelope)dnl define(`confCF_VERSION', `Eric Jacoboni - 14/01/98')dnl define(`confCON_EXPENSIVE', `True')dnl define(`confME_TOO', `True')dnl define(`confCOPY_ERRORS_TO', `Postmaster')dnl define(`confDEF_CHAR_SET', `ISO-8859-1')dnl define(`confMIME_FORMAT_ERRORS',`True')dnl define(`SMART_HOST', `smtp8:[mail.fai.fr]')dnl define(`confTO_QUEUEWARN', `24h') MAILER(local) MAILER(smtp)
Pendant que vous êtes dans les éditions, créez le fichier
/etc/genericstablesuivant :
moi: ego@mail.fai.fr root: ego@mail.fai.fr news: ego@mail.fai.froù l'espace suivant le « : » est un caractère de tabulation, pas une simple espace.
De même, modifiez, ou créez le fichier
/etc/nsswitch.confpour que chacune de ses entrées ne contienne que l'optionfiles, sauf l'entréehostsqui contiendrafiles dns(voir «man 5 nsswitch» pour plus d'informations sur le système des Name Service Switch).Vérifiez le fichier
/etc/aliaseset assurez-vous qu'il contienne au moins les deux entrées suivantes :
MAILER-DAEMON: postmaster postmaster: rootQuelques explications :
- La ligne include(`../m4/cf.m4') demande l'inclusion dans le fichier des macros
m4, nécessaires au traitement.- La ligne OSTYPE(`...') provoque l'inclusion des spécificités d'un système d'exploitation particulier (ce qui se trouve entre ` et ' doit être un nom de fichier ayant l'extension
.m4et présent dans/usr/lib/sendmail-cf/ostypes/: notamment le fichierlinux.m4définit le chemin permettant àsendmailde retrouver le programmeprocmail, utilisé pour délivrer localement le courrier. Si vous ne disposez pas d'un fichierlinux.m4, créez-en un contenantmais ce ne sera normalement pas nécessaire car l'installation dedivert(-1) VERSIONID(`@(#)linux.m4 8.2 (Berkeley) 8/21/93') define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl define(`STATUS_FILE', `/var/log/sendmail.st')dnlsendmailvous en aura probablement fourni un. Vérifiez quand même que le chemin indiqué pourprocmailest correct.- Les lignes define servent à affecter des valeurs sous formes de chaînes à des variables qui seront prises en compte par
sendmail. Ici, nous utilisons les variables :
- SMTP_MAILER_FLAGS.
contient
e(expensive) pour indiquer que les courriers envoyés par smtp sont « coûteux » car destinés à l'extérieur (exactement comme une lettre destinée à l'étranger coûte plus cher à affranchir qu'un courrier local..). On peut aussi combiner les options :`e9'rajoute l'option9qui force la conversion 8 vers 7 bits sur le contenu du texte.
- confCF_VERSION.
contient des informations sur la version du
sendmail.cfqui sera généré (habituellement l'auteur, pour flatter son ego, et la date).
- confSMTP_MAILER.
contient le protocole utilisé : ici, on indique qu'on utilise un protocole (SMTP = Simple Mail Transfer Protocol) permettant d'envoyer des courriers contenant des caractères codés sur 8 bits.
- confCON_EXPENSIVE.
est ici mis à vrai pour forcer la mise en file d'attente des mails considérés comme « coûteux » (donc de tous les courriers destinés à une autre machine que la nôtre, voir SMTP_MAILER_FLAGS plus haut).
- confME_TOO.
est positionné pour que les messages envoyés à une liste de diffusion dont on fait partie nous soient aussi expédiés.
- confCOPY_ERRORS_TO.
indique à qui les messages d'erreurs doivent être copiés. Normalement, sur une machine isolée, le
Postmasterestroot(voir le fichier/etc/aliases), c'est donc lui qui recevra ces messages.
- confDEF_CHAR_SET.
indique au destinataire comment est codé notre courrier, ce qui lui permettra de le décoder correctement. ISO-8859-1 est le standard pour la France : appelé aussi ISO-LATIN-1, il utilise les 128 dernières combinaisons du code ASCII sur 8 bits pour coder les accents nationaux.
- confMIME_FORMAT_ERRORS.
est mis à vrai pour que les courriers d'erreurs (destinataire non trouvé, par exemple) soient au format Mime.
- SMART_HOST.
donne le protocole et le serveur qui sera utilisé pour résoudre les adresses. Ici on utilise SMTP8 (Simple Mail Transfer Protocol) permettant d'envoyer à
mail.fai.frdes courriers contenant des caractères codés sur 8 bits
- TO_QUEUEWARN.
modifie le temps que mettra
sendmailpour envoyer un message prévenant que des messages sont en attente d'envoi dans la file d'attente. Par défaut, ce délai est de 4 heures ce qui peut s'avérer trop court dans le cas d'une connexion épisodique par PPP. Nous la fixons ici à 24 heures car nous nous connectons au moins une fois par jour.
- Les lignes FEATURE servent à fixer certaines caractéristiques du fonctionnement de
sendmail. Ici, nous utilisons les suivantes :
- redirect.
automatise l'émission d'indication de redirection (vous ne comprenez pas ? moi non plus : ce n'est pas grave !).
- nocanonify.
pour que
sendmailne tente pas de transformer l'adresse du destinataire en « adresse canonique » (de la formedupont@truc.fr). Ceci suppose que vous fournirez toujours les adresses canoniques àsendmail. Cette caractéristique permet d'éviter les «name lookup» quesendmailgénèrerait du fait qu'il ne connaît pas le domainetruc.frpuisque notre machine n'a pas de serveur DNS.
- always_add_domain.
pour que toutes les adresses locales soient suffixées par le nom de notre domaine.
- local_procmail.
pour que
sendmailutiliseprocmail.
- masquerade_envelope.
pour que le champ
Fromde l'enveloppe soit correct. En fait, pour que l'enveloppe elle-même soit masqueradisée. Cette caractéristique est employée de concert avec la caractéristique genericstable qui la précède.Toute cette « mascarade » n'a qu'un but : cacher à l'extérieur le nom rigolo qu'on a mis tant de temps à trouver pour baptiser notre machine... En effet, certains destinataires suspicieux (et on les comprend) rejettent systématiquement tout message en provenance de domaines dont ils ne peuvent vérifier l'existence, et ils ne pourront jamais prouver l'existence de votre machine, cachée à l'autre bout de votre connexion ppp. Ces rejets sont une première forme de réaction contre les messages non sollicités (souvent des publicités !), dits « UCE ». Cela dit, certains, plus suspicieux que les autres, ne s'en tiennent pas là : ils rejettent aussi tous les messages venant de domaines connus (généralement des fai), considérés par eux comme vecteurs possibles de messages fâcheux. Dans ce dernier cas, la masqueradisation n'aura pas d'effet...
- Les lignes MAILER servent à spécifier les protocoles utilisés pour transporter notre courrier. Ici, on indique que l'on utilise le transport local et via smtp.
À partir de ce fichier, vous pouvez maintenant générer votre fameux fichier
/etc/sendmail.cf/: placez-vous dans le répertoire/usr/lib/sendmail-cf/cf/(c'est là que se trouve votre fichierconfig.mcet faites :
m4 config.mc > /etc/sendmail.cfAssurez-vous que le traitement ne détecte pas d'erreur de syntaxe et vérifiez par un
ls -l /etc/sendmail.cfque ce fichier ait les permissions suivantes :-rw-------, qu'il appartient à l'utilisateur et au grouperoot.
2.7 La transformation des adresses de l'expéditeur
Passons maintenant au fichier
/etc/genericstable: le rôle de celui-ci est lié à la caractéristique genericstable. Celle-ci permet aux adresses d'expéditeur locaux d'être réécrites sous une autre forme : lorsquemoipostera un message, l'adresse de l'expéditeur seramoi@machine.domaine.fret on conçoit que celle-ci risque fort d'être refusée par certains serveurs car il s'agit d'une adresse invalide (machine.domaine.frn'est pas valide en dehors de chez vous...). Qui plus est, l'utilisateurmoin'existe que sur votre machine, pour l'Internet il s'appelleego@mail.fai.fr.Pour effectuer cette transformation de
moi.machine.domaine.frenego@mail.fai.fr,sendmailprocède en deux temps :
- il vérifie que l'adresse de l'expéditeur appartient à l'un des domaines spécifiés par la macro GENERICS_DOMAIN
- si c'est le cas, il recherche une entrée correspondant à cet expéditeur dans la table générée à partir de
/etc/genericstable.Ici, donc,
machine.domaine.frfaisant partie des GENERICS_DOMAIN, l'entréemoiest recherchée dans la table et remplacée parego@mail.fai.fr. On notera que le même effet aurait été obtenu avec une adresse d'expéditeur égale àmoi@machine,moi@localhostou, tout simplementmoi... Dans ce dernier cas, un mécanisme supplémentaire à lieu :moiétant une adresse non qualifiée, elle est considérée comme locale et la caractéristique always_add_domain commence par lui rajouter le nom du domaine et on se retrouve donc dans le premier cas...Nous pourrons vérifier toutes ces transformations lorsque nous testerons plus loin notre configuration.
Pour des raisons d'efficacité, la table de réécriture doit être transformée en un format plus rapidement accessible à
sendmailqu'un simple fichier texte. La commande permettant de générer la table au format voulu à partir du fichier texte est la suivante :
/usr/sbin/sendmail -bi -oA/etc/genericstableVous pourrez vérifier qu'elle a produit un fichier
/etc/genericstable.dbdont le contenu vous échappera sans doute...Bien entendu, cette commande doit être faite après chaque modification du fichier texte original.
De même, si vous avez modifié le fichier
/etc/aliases, il faudra alors utiliser la commandenewaliasespour regénérer la base des alias.2.8 Vérification du fichier
/etc/hosts
L'étape suivante consiste à vérifier le contenu de votre fichier
/etc/hostsqui doit comporter une ligne ressemblant à ça :
127.0.0.1 machine.domaine.fr localhost machineAttention : Le nom complet de votre machine doit être le premier de la liste.
2.9 Rechargement de sendmail
Si un démon
sendmailtournait déjà sur votre machine, il faut le tuer puis le relancer afin que toutes ces modifications soient prises en compte. Pour cela, faites :
kill `head -1 /var/run/sendmail.pid` /usr/sbin/sendmail -bd -os
Page suivante Page précédente Table des matières