Installation d’un Sendmail chrooté

Notez cet article

Les étapes qui suivent détaillent l’installation d’un Sendmail chrooté.
Récupérez l’archive de Sendmail (ici la version 8.13.7), et placez-la, par exemple, dans /usr/src.
Décompactez l’archive par :
# gzip -dc sendmail.8.13.7.tar.gz | tar xvf –
# cd sendmail-8.13.7

Installez Sendmail de façon conventionnelle :
# sh Build
# sh Build install

Une fois Sendmail installé, lancez la création du sous-environnement :
# mkdir /sendmail

Sendmail va tourner dans le sous-environnement que vous allez créer dans le répertoire /sendmail, et aucun autre répertoire ne sera visible à l’extérieur de ce dernier.
Il vous faut maintenant fournir les éléments vitaux au logiciel (bibliothèques, répertoires, fichiers, etc.). Vous devez pour cela créer des fichiers physiques, car les liens symboliques sont proscrits car ils ne peuvent sortir du répertoire prison /sendmail :
# cd /sendmail
# mkdir usr
# mkdir usr/sbin

Sendmail est enfermé dans sa prison, avec des droits restreints :
# cp /usr/sbin/sendmail /sendmail/usr/sbin
# chown 0:0 /sendmail/usr/sbin/sendmail
# chmod 500 /sendmail/usr/sbin/sendmail

Des applications, telles que les serveurs Web, utilisent divers raccourcis pour accéder à Sendmail. Vous devez donc créer ces raccourcis :
# mkdir /sendmail/lib # cd /sendmail/lib
# ln -s ../sbin/sendmail sendmail
# mkdir /sendmail/bin
# cd /sendmail/bin
# ln -s ../sbin/sendmail sendmail

Fournissez maintenant à Sendmail les programmes annexes dont il a besoin, en commençant par extraire les bibliothèques dynamiques qu’il utilise :
# ldd /sendmail/usr/sbin/sendmail
libdb.so.3 => /lib/libdb.so.3 (0x40016000)
libresolv.so.2 => /lib/libresolv.so.2 (0x4004f000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x4005d000)
libnsl.so.1 => /lib/libnsl.so.1 (0x40060000)
libdl.so.2 => /lib/libdl.so.2 (0x40075000)
libc.so.6 => /lib/libc.so.6 (0x40078000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Le résultat peut varier suivant les options de compilation et les versions des noyaux :
# cd /sendmail/lib
# cp /lib/libdb.so.3 .
# cp /lib/libresolv.so.2 .
# cp /lib/libcrypt.so.1 .
# cp /lib/libnsl.so.1 .
# cp /lib/libdl.so.2 .
# cp /lib/libc.so.6 .
# cp /lib/ld-linux.so.2 .

Créez la file d’attente :
# mkdir /sendmail/var
# mkdir /sendmail/var/spool
# mkdir /sendmail/var/spool/mqueue
# chmod 700 /sendmail/var/spool/mqueue

Créez le répertoire /var/run pour que Sendmail y place son numéro de processus (sendmail.pid) :
# mkdir /sendmail/var/run

# touch /sendmail/var/run/sendmail.pid

Ajoutez l’unité /dev/null, dont Sendmail a besoin en interne :
# mkdir /sendmail/dev
# mknod /sendmail/dev/null c 1 3
# chown 0:0 /sendmail/dev/null
# chmod 666 /sendmail/dev/null

La définition du noeud (c 1 3) n’est valable que sous Linux.
Pour écrire ses historiques, Sendmail communique avec syslog via un socket. Vous devez donc créer ce dernière dans l’environnement chroot :
# /usr/sbin/syslogd -m 0 -p /sendmail/dev/log

L’emplacement de syslogd peut différer d’un système à un autre. Prenez garde à n’avoir qu’une seule instance de syslogd dans le système.

A ce stade, vous devez régler le délicat problème de la résolution de noms. Sendmail ne peut fonctionner correctement sans cette résolution. Cette configuration s’effectue dans le répertoire /etc :
# mkdir /sendmail/etc

Créez le fichier d’aiguillage des services (etc/nsswitch.conf) de façon à renseigner l’emplacement des fichiers, indispensables à la résolution de noms. Le contenu du fichier /sendmail/etc/nsswitch.conf est le suivant :
services: files

La ligne services renseigne le fichier etc/services, lequel contient la corrélation entre un numéro de port TCP ou UDP et le nom usuel du service.
Pour utiliser ce dispositif, vous devez pouvoir accéder à la bibliothèque libnss_files-2.2.2.so :
# cd /sendmail/lib
# cp /lib/libnss_files-2.2.2.so .

Cette bibliothèque est généralement appelée via un autre nom, libnss_files.so.2 :
# ln -s libnss_files-2.2.2.so libnss_files.so.2

Voici la bibliothèque nécessaire à la résolution de noms (DNS) :
# cp /lib/libnss_dns.so.2 .
/
et le fichier /sendmail/etc/services :
smtp 25/tcp mail

Puisque le chroot concerne uniquement SMTP, seule cette ligne est nécessaire.
Voici enfin le fichier du client DNS etc/resolv.conf :
nameserver 127.0.0.1

Nous supposons ici que vous disposez d’un serveur DNS local (127.0.0.1). Il est recommandé de mettre celui de votre FAI, car cela simplifie grandement la configuration de votre serveur.
Pour le répertoire /etc/mail contenant les données de configuration, vous disposez d.une alternative :
· Placer les bases de données et le fichier de configuration dans /sendmail/etc/mail par le biais d’un petit script exécuté à chaque modification du paramétrage. De cette façon, vous isolez et sécurisez les fichiers source (alias, access, etc.) et le fichier mc dans l’environnement primaire.
· Créer un lien de /etc/mail vers /sendmail/etc/mail, exposant ainsi les fichiers source dans l’environnement chroot.
Choisissez ici la seconde possibilité, la plus commode :
# mkdir /sendmail/etc/mail
# ln -s /sendmail/etc/mail /etc/mail

Voici le fichier d’état de Sendmail, sendmail.st :
# touch /etc/mail/sendmail.st

et un très simple fichier mc :
include(`/usr/lib/sendmail-cf/m4/cf.m4′)
VERSIONID(`Sendmail chrooté ‘)dnl
OSTYPE(`linux’)dnl
define(`confMAX_MESSAGE_SIZE’, `5000000′)dnl
define(`STATUS_FILE’, `/etc/mail/sendmail.st’)dnl
define(`confDOMAIN_NAME’, `monserveur.com’)dnl
define(`ALIAS_FILE’, `/etc/mail/aliases’)dnl
define(`SMART_HOST’,`smtp.monfai.com’)dnl
define(`confLOG_LEVEL’,`14′)dnl
define(`confSEPARATE_PROC’,`true’)dnl
FEATURE(`access_db’,`hash -o /etc/mail/access’)dnl
FEATURE(always_add_domain)dnl
MAILER(smtp)dnl

qui vous permet de construire votre sendmail.cf :
# m4 sendmail.mc >sendmail.cf

Le niveau d’enregistrement des événements a été fixé à 14 (define(`confLOG_LEVEL’,`14′)). Cette valeur est particulièrement élevée afin de repérer les éventuelles erreurs. Dans cette configuration, tout le courrier est expédié vers le serveur de votre FAI, smtp.fai.com.
Voici le fichier /etc/mail/aliases :
MAILER-DAEMON: postmaster
postmaster: root
bin: root
daemon: root
nobody: root
system: root
root: monemail@monadresse.com

que vous créez de la façon suivante :
# chroot /sendmail /usr/sbin/sendmail -bi -v

Le root est en fait un alias vers une autre adresse e-mail. Sur le serveur chrooté, vous n’acceptez, par commodité, aucune livraison de courrier (voir plus haut).
Voici le fichier /etc/mail/access correspondant, qui contrôle les adresses autorisées à utiliser le relais :
127.0.0.1 RELAY
10 RELAY
localhost RELAY
localhost.localdomain RELAY

que vous créez de la manière suivante :
# makemap -v hash access.db <access

Seule la machine locale et le réseau IP 10.0.0.0 sont autorisés à utiliser le relais SMTP.
Démarrez Sendmail :
# chroot /sendmail /usr/sbin/sendmail -bd -q15m

Le serveur doit maintenant fonctionner correctement.
L’utilitaire strace est recommandé pour la mise au point d’un Sendmail chrooté. Il permet notamment de déterminer les fichiers et bibliothèques manquants.
Désormais, vous disposez d’un Sendmail parfaitement sécurisé, enfermé dans une prison logique.

Laisser un commentaire