La messagerie
Les Mail Transfert Agent
2.1 Sendmail
2.1.1 Présentation
Sendmail est le plus ancien et le plus puissant MTA. Si vous avez de gros besoins c'est ce qu'il vous faut.
Sendmail étant très ancien il a désormais une grande expérience dans la sécurité, contrairement aux rumeurs qui courrent depuis des années.
Il a été pendant longtemps considéré comme l'application la moins sécurisée, mais est désormais sécurisé. Toutefois, il a conservé sa structure monolithique, ce qui le rend très vulnérable en cas de faille de sécurité. Sendmail X devrait y remédier.
Sendmail va stocker par default les mails reçus dans /var/spool/mail/$USER au format mailbox.
Si sendmail trouve un fichier .forward à la racine du compte utlisateur, les mails à destination de cet utilisateurs seront redirigés comme spécifiés dans ce fichier. Ceci permet de très facilement faire appel à des filtres anti-virus, anti-spam, ou d'autre MDA que celui inclus dans sendmail.
Le gros inconvénient de sendmail est sa configuration qui est très compliquée, nous nous limiterons donc à une configuration de base, et nous ne détaillerons absolument pas le fichier sendmail.cf.
2.1.2 Installation
Commencez par récupérer les sources de sendmail à l'adresse http://www.sendmail.org/current-release.html.
Décompressez les (au moment de l'écriture de cette documentation, la dernière version est la 8.13.1) :
user@localhost$ tar -zxpvf sendmail.8.13.1.tar.gz
Allez dans le répertoire créé : sendmail-8.13.1
La procédure d'installation est detaillée dans le fichier INSTALL.
Dans le répertoire sendmail lancez la commande :
sh Build
Allez ensuite dans le répertoire cf/cf/ et choissisez le fichier de configuration .mc qui correspond le plus à votre environnement et copiez le en sendmail.mc.
user@localhost$ cp generic-linux.mc sendmail.mc
Lancez ensuite la commande :
user@localhost$ sh Build sendmail.cf
Cette commande transforme le fichier de configuration sendmail.mc en sendmail.cf grâce aux macros m4.
Nous allons maintenant installer les nouveaux fichiers de configuration. Pensez à sauvegarder votre ancienne configuration si jamais vous en avez déja une.
Lancez la commande suivante en tant que root pour installer votre nouveau fichier de configuration :
root@localhost# sh Build install-cf
Il faut maintenant créer un utilisateur et un groupe pour sendmail
Commençons par créer le groupe smmsp :
root@localhost# groupadd -g 25 smmsp
Nous pouvons maintenant créer l'utilisateur smmsp :
root@localhost# useradd -u 25 -g smmsp -d /var/spool/clientmqueue smmsp
Nous pouvons maintenant installer les binaires de sendmail compilés précedemment en retournant dans sendmail et en tapant :
root@localhost# sh Build install
Sendmail est maintenant installé.
L'archive de sendmail contiens quelques utilitaires (makemap, mailstats ... ) qu'il faut installer séparément.
Pour chacun des utilitaires que vous souhaitez installer, les instructions d'installation sont dans le fichier README (si il existe).
Pour finir l'installation, toujours faire :
root@localhost# sh Build install
Nous allons installer makemap. Cet outil permettra de transformer certains fichiers comme les fichiers d'aliases en base de donnée.
root@localhost# sh Build install
Si vous mettez à jour sendmail, regénérez vos bases de données avec le nouveau makemap.
2.1.3 Configuration
2.1.3.1 Fichiers de configuration
La configuration de sendmail est répartie dans plusieurs fichiers qui se trouvent tous dans /etc/mail/.
2.1.3.1.1 sendmail.mc
Le fichier de configuration principal. C'est celui que vous modifierez. Il sera détaillé un peu plus tard.
2.1.3.1.2 sendmail.cf
Le fichier de configuration principal utilisé par sendmail: ce fichier est généré par les macros m4 à partir de sendmail.mc. La syntaxe de sendmail.cf ne sera pas expliquée ici.
2.1.3.1.3 aliases
Fichier contenant les aliases mail.
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
games: root
ingres: root
nobody: root
system: root
toor: root
uucp: root
# Well-known aliases.
manager: root
dumper: root
webmaster: root
abuse: root
# trap decode to catch security attacks
decode: root
2.1.3.1.4 aliases.db
Ce fichier contiens les aliases utilisés par sendmail. Il doit être généré à partir du fichier aliases par la commande newaliases.
2.1.3.1.5 local-host-names
Ce fichier contiens la liste des domaines locaux, c'est à dire la liste des domaines pour lesquels sendmail accepte les couriers entrants.
2.1.3.1.6 virtusertable
Ce fichier fonctionne comme le fichier aliases, mais permet de créer des aliases virtuels (pour plusieurs domaines).
2.1.3.1.7 virtulertable.db
Ce fichier contiens les aliases virtuels utilisés par sendmail. Il doit être généré à partir du fichier virtuesertable par la commande newaliases.
2.1.3.1.8 trusted-users
Ce fichier contiens la liste des utilisateurs de confiance, c'est à dire la liste des utilisateurs que sendmail laissera faire ce qu'ils veulent.
2.1.3.2 Configuration de sendmail.mc
Le fichier sendmail.mc est le fichier de configuration principal de sendmail. C'est ici que le fonctionnement est défini, et qu'on défini l'emplacement des autres fichiers de configuration.
Ce fichier doit être transformé en sendmail.cf grâce aux macros m4 pour être compris par sendmail.
Cette transormation se fait grâce à la commande suivante :
root@localhost# m4 sendmail.mc > sendmail.cf
Nous allons voir les différentes directives de configuration qui peuvent être utilisées dans ce fichier, puis nous expliquerons un exemple concret.
2.1.3.2.1 Directives de configuration
Nous allons décrire ici les différentes directives de configuration
2.1.3.2.1.1 Les commentaires
Il existe deux façons d'écrire des commentaires dans snedmail.mc:
dnl permet de mettre une ligne en commentaire :
dnl
Cette ligne est un commentaire
AutreDirectivesdivert permet de mettre un bloc de lignes en commentaire :
divert(-1)
un commentaire
sur plusieurs
lignes
divert(0)
2.1.3.2.1.2 Type de système d'exploitation
La directive OSTYPE() permet de définir le type de système d'exploitation :
OSTYPE(linux)
2.1.3.2.1.3 Définitions
Voici quelques définitions de base :
On défini l'emplacement des binaires :
define(`confEBINDIR', `/usr/local/bin')
On défini que les aliases sont dans le fichier /etc/mail/aliases
define(`ALIAS_FILE', `/etc/mail/aliases')
On défini la taille maximale des mails (ici 10Mo).
define(`confMAX_MESSAGE_SIZE', `10000000')
2.1.3.2.1.4 Domaines
Il faut indiquer à sendmail la liste des domaines qu'il doit gérer. Les deux directives suivantes permettent de lui indiquer que la liste des domaines se trouve dans /etc/mail/local-host-names.
FEATURE(use_cw_file)
define(`confCW_FILE', `-o /etc/mail/local-host-names')
2.1.3.2.1.5 Utilisateurs de confiance
On peut indiquer à sendmail une liste d'utilisateurs de confiance. Ces utilisateurs auront la possibilité de faire beaucoup d'actions qui ne sont normalement pas autorisées, comme par exemple l'envoi de mail depuis des adresses non gérées par sendmail. Ceci est très utile pour réaliser des tests de comportement du serveur mail.
FEATURE(use_ct_file)
define(`confCT_FILE', `-o /etc/mail/trusted-users')
2.1.3.2.1.6 Relais
Nous allons maintenant définir les domaines pour lesquels il est possible de relayer le courier. Il sont défini dans le fichier /etc/mail/access. Ce fichier sera transformé en base de donnée (/etc/mail/access.db) automatiquement.
FEATURE(relay_entire_domain)
FEATURE(`access_db', `hash -T<TMPF> /etc/mail/access')
2.1.3.2.1.7 Table d'utilisateurs
Il faut tout d'abord ajouter la liste des domaines pour lesquels on a des utilisateurs virtuels dans /etc/mail/virthosts.
VIRTUSER_DOMAIN_FILE(`/etc/mail/virthosts')
Ensuite on créé des aliases virtuels pour ces domaines.
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')
On met ces aliases dans /etc/mail/virtusertable :
postmaster@domaine2.com root
postmaster@domaine3.com root
julien@francoz.net cocoz
2.1.3.2.2 Exemple concret
Voici un exemple concret de configuration de sendmail :
divert(-1)
dnl
dnl Configuration exemple
dnl
divert(0)
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
VERSIONID(`Sendmail pour mon serveur mail')dnl
OSTYPE(`linux')dnl
define(`confMAX_MESSAGE_SIZE', `20000000')dnl
define(`STATUS_FILE',`/etc/mail/sendmail.st')dnl
define(`confDOMAIN_NAME',`mail.domaine.net')dnl
define(`ALIAS_FILE',`/etc/mail/aliases')dnl
define(`confCW_FILE',`/etc/mail/sendmail.cw')dnl
FEATURE(`use_cw_file')dnl
FEATURE(always_add_domain)dnl
FEATURE(`access_db',`hash -o /etc/mail/access')dnl
FEATURE(local_procmail)dnl
FEATURE(accept_unresolvable_domains)dnl
MAILER(smtp)dnl
Ici, les aliases sont stockés dans /etc/mail/aliases, le nom de domaine par default est mail.domaine.net, les autres noms de domaines pour lesquels on accepte les mails sont stockés dans /etc/mail/sendmail.cw, les restrictions d'accès sont dans /etc/mail/access, et les mails sont délivrés par procmail.
2.1.4 Démarrage
Il ne reste plus qu'à démarrer le daemon :
root@localhost# /usr/sbin/sendmail -L sm-mta -bd -q25m
/usr/sbin/sendmail -L sm-msp-queue -Ac -q25m
Le premier daemon se met en écoute sur le port 25 et attends les couriers entrants, alors que le deuxième daemon gère la file d'attente et tente d'envoyer les couriers sortant.
Voici un petit script permettant de démarrer et d'arréter sendmail (script du package Sendmail de la Slackware) :
#!/bin/sh
# Start/stop/restart sendmail.
# Start sendmail:
sendmail_start() {
if [ -x /usr/sbin/sendmail ]; then
echo "Starting sendmail MTA daemon: /usr/sbin/sendmail -L sm-mta -bd -q25m"
/usr/sbin/sendmail -L sm-mta -bd -q25m
echo "Starting sendmail MSP queue runner: /usr/sbin/sendmail -L sm-msp-queue -Ac -q25m"
/usr/sbin/sendmail -L sm-msp-queue -Ac -q25m
fi
}
# Stop sendmail:
sendmail_stop() {
killall sendmail
}
# Restart sendmail:
sendmail_restart() {
sendmail_stop
sleep 1
sendmail_start
}
case "$1" in
'start')
sendmail_start
;;
'stop')
sendmail_stop
;;
'restart')
sendmail_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
Lors du démarrage et de l'arrét du système, appelez ce script avec l'option start ou stop.
2.1.5 Utilisation d'OpenLDAP
Nous allons maintenant voir comment utiliser Sendmail conjointement avec un annuaire LDAP (ici OpenLDAP).
Nous suposerons dans la suite que vous connaissez déja les bases de l'utilisation d'OpenLDAP.
2.1.5.1 Installation de Sendmail
Pour utiliser un annuaire LDAP, Sendmail doit être compilé avec le support LDAP.
Il faut pour cela modifier quelques fichiers avant la compilation.
Allez dans le répertoire sendmail-x.y.z/devtools/Site et créez le fichier config.site.m4 :
user@localhost$ touch site.config.m4
Editez ensuite ce fichier et ajoutez y les lignes suivantes, en remplaçant corrigeant eventuellement les chemins d'accès :
define(`confMAPDEF', `-DLDAPMAP')
define(`confLIBS', `-lldap -llber')
define(`confINCDIRS', `-I/home/cocoz/openldap-2.2.15/include')
define(`confLIBDIRS', `-L/home/cocoz/openldap-2.2.15/libraries')
Allez ensuite à la racine des sources de Sendmail et lancez la compilation :
user@locahost$ sh Build -c
L'option -c est indispensable pour forcer le script Build à lire le fichier devtools/Site/site.config.m4.
Puis en root :
root@localhost# make install
Ca y est, Sendmail est installé avec le support des annuaires LDAP.
2.1.5.2 Modification de l'annuaire
2.1.5.2.1 Modification de la configuration
Tout d'abord il faut ajouter le schema Sendmail à la configuration d'OpenLDAP.
Pour cela, copiez le fichier sendmail-x.y.z/cf/sendmail.schema dans /etc/openldap/schema/ .
Ajoutez ensuite la ligne suivante dans le fichier de configuration d'OpenLDAP (/etc/openldap/slapd.conf) :
include /etc/openldap/schema/sendmail.schema
Redémarre OpenLDAP pour prendre les modifications en compte.
2.1.5.2.2 Ajout de comptes
Nous allons maintenant ajouter les utilisateurs dans la base.
Insérez l'enrengistrement suivant dans l'annuaire LDAP :
dn:sendmailMTAKey=testalias,dc=domaine,dc=net
objectClass: sendmailMTA
objectClass: sendmailMTAAlias
objectClass: sendmailMTAAliasObject
sendmailMTAAliasGrouping: aliases
sendmailMTAHost: domaine.net
sendmailMTAKey: testalias
sendmailMTAKey: coin
sendmailMTAAliasValue: test@domaine.net
sendmailMTAAliasValue: test2
Cet enrengistrement va rediriger tous les mails à destination de testalias@domaine.net et coin@domaine.netvers test@domaine.net, et l'utilisateur test2.
Vous n'avez plus qu'a créer d'autres aliases sur le même modèle.
D'autres exemples et des configurations plus avancées sont disponibles dans le fichier sendmail-x.y.z/cf/README.
2.1.5.3 Configuration de Sendmail
Ajoutez les deux lignes suivantes au fichier sendmail.mc :
define(`ALIAS_FILE',`/etc/aliases,ldap:')dnl
define(`confLDAP_DEFAULT_SPEC',`-h localhost -b dc=domaine,dc=net')dnl
Vous remarquerez qu'il y a deux paramètres pour ALIAS_FILE : le fichier /etc/aliases et l'annuaire LDAP.
Cela permet de chercher d'abord les aliases dans le fichier, puis dans l'annuaire LDAP.
L'intéret est de définir de façon statique les aliases de base (root, postmaster...), puis de définir les aliases des utilisateurs dans l'anuaire LDAP.
La deuxième ligne permet de spécifier les informations nécessaires pour se connecter au serveur LDAP.
Si plusieurs noms de machines sont listés après -h, le premier serveur sera utlisé, puis le deuxième si le premier est indisponible, etc...
L'option -b est suivie par le suffixe de la base.
Regénérez ensuite le fichier de configuration principal de Sendmail :
root@localhost# m4 sendmail.mc > sendmail.cf
Redémarrez Sendmail, il devrait désormais utiliser les aliases situés dans l'annuaire LDAP.
Si jamais vous voulez utilisez un autre schema que sendmail.schema, vous pouvez vous inspirer de l'exemple suivant :
define(`ALIAS_FILE',`ldap: -v mail -k (mailingListName=%0)')dnl
Ici on récupère les valeurs que contiens le champs mail des résultats de la requète (mailingListName=%0) où %0 est l'adresse à laquelle le mail est envoyé.
Sendmail est capable de gérer les réponses multiples, c'est à dire que si une réponse contiens plusieurs adresses de destinations, le mail est redirigé vers chacunes des adresses de destinations.
2.1.6 Ressources
Voici quelques liens vers des ressources intéressantes sur Sendmail :
Le chapitre Sendmail du Linux Network Administration Guide.
2.2 Postfix
2.2.1 Présentation
2.2.2 Installation
2.2.2.1 Création d'utilisateur et groupes
Pour des raisons de sécurité, nous allons créer un nouvel utilisateur qui servira à lancer postfix.
groupadd postdrop
groupadd postfix
useradd -g postfix -d /dev/null -s /bin/false postfix
2.2.2.2 Installation à partir des sources
Les sources sont disponibles sur le site officiel : http://www.postfix.org
user@localhost$ cd /usr/src/
user@localhost$ wget -c ftp://mir1.ovh.net/ftp.postfix.org/postfix-release/official/postfix-2.1.4.tar.gz
user@localhost$ tar zxf postfix-2.1.4.tar.gz
user@localhost$ cd postfix-2.1.4/
user@localhost$ make -f Makefile.init makefiles
user@localhost$ make
root@localhost# make install
Lors du make install, une série de question vous sera posées. Appuyez sur Entrée pour utiliser les réponses par défaut.
2.2.3 Configuration
2.2.3.1 Configuration basic
2.2.3.1.1 fichier /etc/aliases
Le fichier /etc/aliases contient les alias. C'est une correspondance entre un utilisateur réel et un compte qui n'existe pas.
# alias : destination
postfix: root
postmaster: root
webmaster: root
Il faut maintenant compiler ce fichier sous forme d'une base de donnée. Pour cela nous allons utiliser la commande :
newaliases
Cette commande crée un nouveau fichier /etc/aliases.db. Il faudra relance cette commande à chaque modification du fichier /etc/aliases.
2.2.3.1.2 fichier /etc/postfix/main.cf
Par défaut, tout ce configure dans ce fichier. Voici un tableau expliquant les paramètres les plus importants.
myhostname | nom d'hôte (FQDN) |
mydomain | nom de domaine |
myorigin | nom de domaine dans l'adresse mail (après les @) qui sera ajouté si il n'est pas spécifié |
inet_interfaces | interfaces d'écoute du serveur |
mydestination | les domaines déservis par le serveur |
mynetworks | Les mails provenant de ces réseaux seront relayés sans conditions |
relay_domains | Noms des domaines pour lesquels nous sommes serveurs secondaires |
alias_maps | fichier contenant les alias |
luser_relay | définir le catch-all |
home_mailbox | type de stockage des mails dans les répertoires utilisateurs |
Exemple de fichier de configuration /etc/postfix/main.cf
myhostname = msg.labo-linux.org
mydomain = labo-linux.org
myorigin = $mydomain
inet_interfaces = all
mydestination = $mydomain, $myhostname
mynetworks = 127.0.0.0/8, 172.16.0.0/16
relay_domains = supinfo.com
alias_maps = hash:/etc/aliases
luser_relay = root@$mydomain
home_mailbox = Maildir/
2.2.3.2 Configuration avec base de donées
Dans la configuration précédente, les utilisateurs devaient forcement être créés localement. Nous allons maintenant voir comment créer des utilisateurs virtuels. Ce sont des utilisateurs qui n'ont pas de compte sur la machine. Leurs informations sont stockées dans une base de données.
Nous allons créer un utilisateur locale, appelé "vmail", qui distribura les mails.
root@localhost# groupadd -g 5000 vmail
root@localhost# useradd -u 5000 -g vmail -m -d /home/vmail vmail
2.2.3.2.1 MySQL
2.2.3.2.1.1 Support MySQL pour Postfix
Pour pouvoir utiliser MySQL, il faut compiler le support intégré à Postfix.
D'abord, il faut trouver où sont stockés les fichiers ent-tête et les bibliothèques de MySQL
root@localhost# locate mysql.h
/usr/include/mysql/mysql.h
root@localhost# locate libmysqld
/usr/lib/mysql/libmysqld.a
Nous allons utiliser ces deux chemins pour la compilation de Postfix
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/include/mysql' \
'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm'
Si vous installez Postfix pour la première fois, suivez la procedure normale
user@localhost$ make
root@localhost# make install
Sinon, si vous souhaitez uniquement ajouter le support MySQL à une version déjà installée. Faites comme ceci
user@localhost$ make
root@localhost# make upgrade
2.2.3.2.1.2 Création de la base de données
Nous allons voir ici, toutes les tables et les champs dont nous allons avoir besoin et leur utilitée. Vous pouvez recuperer le script dans la partie "Ressources" ci-après.
root@localhost# mysql -ppassword create mail
root@localhost# mysql -ppassword
mysql> grant SELECT
-> ON mail.*
-> TO mailsql@localhost
-> IDENTIFIED BY 'mailsql';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
root@localhost# mysql -ppassword mail < labo-linux.org_postfix-mysql.sql
champs | utilitée |
login | Nom d'utilisateur pour la connexion en imap |
passwd | Mot de passe pour la connexion en imap |
Adresse email de l'utilisateur | |
home | Répertoire home de l'utilisateur |
maildir | Type de stockage des emails |
2.2.3.2.1.3 fichier /etc/postfix/main.cf
Voici les options spécifiques aux utilisateurs suivit d'un exemple
virtual_mailbox_domains | Domaines pour lesquels nous avons des utilisateurs virtuels. Ces domaines ne doivent pas être dans $mydestination |
virtual_mailbox_maps | Résolution adresse email / repertoire de stockage |
virtual_mailbox_base | dossier contenant les repertoires home des utilisateurs virtuels |
virtual_transport | Methode à utilise pour gérer les emails des utilisateurs virtuels |
virtual_uid_maps | UID de l'utilisateur qui gère les utilisateurs virtuel (vmail) |
virtual_gid_maps | GID de l'utilisateur qui gère les utilisateurs virtuel (vmail) |
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
virtual_transport = virtual
virtual_mailbox_domains = domain.com, domain2.com
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_mailbox_base = /
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
2.2.3.2.1.4 fichier de recherche
Nous allons maintenant créer les requettes pour recuperer les informations stockées dans la base. Ces requettes vont etre ecrite dans les fichiers mysql-*.cf. Le nom des fichiers n'a pas d'importance
# /etc/postfix/mysql-aliases.cf
user = mailsql
password = mailsql
dbname = mail
hosts = localhost
table = alias
select_field = destination
where_field = domain
# /etc/postfix/mysql-virtual-maps.cf
user = mailsql
password = mailsql
dbname = mail
hosts = localhost
table = users
select_field = concat(home,'/',maildir)
where_field = email
2.2.4 Démarrage
Pour lancer, arrêter ou recharger le fichier de configuration, nous allons utiliser la commande postfix avec, respectivement, les options start, stop ou reload
postfix start
postfix/postfix-script: starting the Postfix mail system
2.2.5 Tests
Nous allons maintenant vérifier que le serveur fonctionne, ainsi que les alias :
root@localhost# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 msg.labo-linux.org ESMTP Postfix
mail from: user@labo-linux.org
250 Ok
rcpt to: postmaster@labo-linux.org
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Voici un test
.
250 Ok: queued as 067CA28537
quit
221 Bye
Connection closed by foreign host.
Verifiez la boite aux lettre de root
root@localhost# cd /root/
root@localhost# cat Maildir/new/*
Return-Path: <user@labo-linux.org>
X-Original-To: postmaster@labo-linux.org
Delivered-To: root@labo-linux.org
Received: from localhost (localhost [127.0.0.1])
by msg.labo-linux.org (Postfix) with SMTP id 067CA28537
for <postmaster@labo-linux.org>; Wed, 15 Sep 2004 19:08:06 +0200 (CEST)
Message-Id: <20040915170806.067CA28537@msg.labo-linux.org>
Date: Wed, 15 Sep 2004 19:08:06 +0200 (CEST)
From: user@labo-linux.org
To: undisclosed-recipients:;
Voici un test