Sécurisation d'un serveur Sendmail

La configuration est réalisée pour le réseau mydomain.com, grâce aux logiciels Sendmail, OpenBSD spamd, Spamassassin + milter-spamd pour le système anti-spam, milter-regex pour le filtrage et procmail pour le délivrement. L'achitecture abordée est un réseau de type LAN, avec des serveurs mail en `relai' et un serveur MX principal.

Configuration de Sendmail

Serveur mail

Sendmail utilise la configuration contenue dans un fichier .cf, généré à partir d'une macro m4 (.mc). Il est possible d'éditer ce fichier mais il est fortement conseillé de faire les modifications sur le fichier .mc, puis de générer le nouveau .cf, une fois la configuration terminée.

Plusieurs fichiers de configuration sont disponibles dans le répertoire /usr/share/sendmail/cf/, et le fichier openbsd-proto-tls.mc proposant une configuration relativement basique et fonctionnelle pour la plupart des réseaux.

Voici un exemple de configuration, demo.mc :

# cd /usr/share/sendmail/cf

divert(-1)dnl
#
# MX
#
divert(0)dnl
VERSIONID(`@(#)demo.mc $Revision: 1.0 $')dnl
OSTYPE(openbsd)dnl
dnl
dnl Options
dnl
define(`confCW_FILE', `-o MAIL_SETTINGS_DIR`'local-host-names')dnl
define(`confPRIVACY_FLAGS', `authwarnings,needmailhelo,noexpn,novrfy')dnl
FEATURE(nouucp, `reject')dnl
FEATURE(`use_ct_file')dnl
dnl
dnl Familles d'adresses (v4 + v6)
dnl
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Name=MTA6, M=O')dnl
DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Port=587, Name=MSA, M=E')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Port=587, Name=MSA6, M=O, M=E')dnl
CLIENT_OPTIONS(`Family=inet, Address=0.0.0.0')dnl
CLIENT_OPTIONS(`Family=inet6, Address=::')dnl
dnl
dnl Certificats SSL
dnl
define(`CERT_DIR',        `MAIL_SETTINGS_DIR`'certs')
define(`confCACERT_PATH', `CERT_DIR')
define(`confCACERT',      `CERT_DIR/CAcert.pem')
define(`confSERVER_CERT', `CERT_DIR/mycert.pem')
define(`confSERVER_KEY',  `CERT_DIR/mykey.pem')
define(`confCLIENT_CERT', `CERT_DIR/mycert.pem')
define(`confCLIENT_KEY',  `CERT_DIR/mykey.pem')
dnl
dnl SMTP AUTH
dnl
define(`confAUTH_OPTIONS',`A,p')dnl
TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 LOGIN')dnl
define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 LOGIN')dnl
dnl
dnl Masquerading host.mydomain.com => domain.com
dnl
FEATURE(`allmasquerade')
FEATURE(redirect)dnl
FEATURE(`always_add_domain')dnl
FEATURE(`no_default_msa')dnl
FEATURE(`masquerade_entire_domain')
FEATURE(`masquerade_envelope')
MASQUERADE_AS(`mydomain.com.')
MASQUERADE_DOMAIN(`mydomain.com.')
MASQUERADE_AS(mydomain.com)
dnl
dnl Taille des mails
dnl
dnl 8MB * 1024 * 1024 = 8388608
dnl 8388608 + 8388608*33/100 (conversion binaire) = 11156848
define(`confMAX_MESSAGE_SIZE', `11156848')dnl
dnl
dnl Filtrage via milter-{regex,spamd}
dnl
INPUT_MAIL_FILTER(`milter-regex', `S=unix:/var/spool/milter-regex/sock, T=S:30s;R:2m')dnl
INPUT_MAIL_FILTER(`milter-spamd', `S=unix:/var/spool/milter-spamd/sock, T=S:30s;R:2m')dnl
define(`confINPUT_MAIL_FILTERS', `milter-regex,milter-spamd')dnl
dnl
dnl Distribution du courrier
dnl
FEATURE(`local_procmail')
define(`PROCMAIL_MAILER_ARGS', `procmail -m $h $g $u')dnl
define(`PROCMAIL_MAILER_FLAGS', `mSDFMhun')dnl
MAILER(local)
MAILER(smtp)
MAILER(procmail)
<code>

A présent, le fichier **.cf** peut être généré à partir de la macro :

   # make demo.cf # cp demo.cf /etc/mail/

La configuration applicative est réalisée principalement via les fichiers suivants :

**/etc/mail/aliases** : gestion des alias
**/etc/mail/local-host-names** : domaines locaux autres que le principal
**/etc/mail/relay-domains** : domaines à relayer

Pour générer les bases texte associées à ces configurations, par exemple celle des aliases, il est possible d'utiliser la commande **makemap** :

   # makemap hash /etc/mail/aliases < /etc/mail/aliases

=== Configuration TLS ===

Il faut à présent créer les certificats en vue d'utiliser TLS sur les serveurs mail abordés précedemment. Pour des précisions sur la configuration à opérer, consultez **starttls(8)**.

<code>
% sudo mkdir /etc/mail/certs

% sudo openssl dsaparam 1024 -out dsa1024.pem
% sudo openssl req -x509 -nodes -days 365 -newkey dsa:dsa1024.pem
  -out /etc/mail/certs/mycert.pem
  -keyout /etc/mail/certs/mykey.pem

% sudo ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem
% sudo rm dsa1024.pem

% sudo chmod -R go-rwx /etc/mail/certs

SMTP Auth

Il est tout d'abord nécessaire d'installer le package cyrus-sasl, ce dernier étant présent dans ports.

La version de Sendmail intégrée dans OpenBSD ne supporte pas SMTP Auth. Pour y remédier, il faut recompiler ce dernier avec l'option WANT_SMTPAUTH=Yes.

# cd /usr/src/gnu/usr.sbin/sendmail
# env WANT_SMTPAUTH=Yes make depend
# env WANT_SMTPAUTH=Yes make
# make install

Sendmail utilisera le SMTP Auth grâce aux lignes :

define(`confAUTH_OPTIONS',`A,p')dnl
TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 LOGIN')dnl
define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 LOGIN')dnl

Il faut enfin indiquer à sendmail la méthode à employer pour solliciter SASL. La méthode la plus simple consiste à utiliser le backend saslauthd. Voici la configuration adéquate. Dans ${LOCALBASE}/lib/sasl2/Sendmail.conf :

pwcheck_method: saslauthd
auto_transition: false
mech_list: GSSAPI DIGEST-MD5 LOGIN

Statistiques

Sendmail écrit par défaut des “status” dans sendmail.st, consultable via mailstats. Voici un exemple d'utilisation :

% mailstats

Statistics from Sun Feb 13 22:31:01 2005
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis msgsqur Mailer
 3      121       3843K        1          1K        0       0       0 local
 4        0          0K      115       3721K        0       0       0 smtp
 5        0          0K        4        119K        0       0       0 esmtp
=====================================================================
 T      121       3843K      120       3841K        0       0       0
 C      126                  117                    0

Lancement automatisé

Sendmail utilise par défaut sur OpenBSD le fichier localhost.cf; afin de prendre en compte la nouvelle configuration, il est nécessaire de changer la ligne ci-dessous dans le /etc/rc.conf :

 sendmail_flags="-L sm-mta -C/etc/mail/demo.cf -bd -q30m"

Pour automatiser le démarrage de saslauthd, il faut ajouter dans /etc/rc.local :

if [ -x /usr/local/sbin/saslauthd ]; then    
	echo -n ' saslauthd'; /usr/local/sbin/saslauthd -a getpwent
fi

Lutte contre les messages non-sollicités

Le tarpit spamd

OpenBSD spamd est utilisé pour gérer des blacklists au niveau de Packet Filter. La première étape consiste à créer un fichier de configuration pour le packet filter du serveur mail principal, via /etc/pf.conf :

ext_if   = "le0"
ports_ok = "{ 22, 25, 110 }"

table <spamd> persist

scrub in all

rdr pass on $ext_if proto tcp from <spamd> to port smtp \
    -> 127.0.0.1 port spamd

block in
pass out keep state

pass quick on { lo }
antispoof quick for { lo $ext_if }

pass in on $ext_if proto tcp to ($ext_if) port $ports_ok keep state

Pour automatiser son lancement, via *rc.conf :

spamd_flags=""          # for normal use: "" and see spamd-setup(8)
spamd_black=NO          # set to YES to run spamd without greylisting

Les fonctionnalités de greylisting de spamd(8) sont désormais activées par défaut; dans la crontab de root, il est nécessaire de lancer spamd-setup régulièrement afin de mettre à jour les blacklists :

 0       *       *       *       *       /usr/libexec/spamd-setup

Filtrage des entêtes via milter-regex

Pour cette partie, mail/milter-regex est utilisé.

Exemple de /etc/milter-regex.conf :

# pièces jointes prohibées
reject "Prohibited attachment, contact postmaster@mydomain.com."
header ,^Content-Type$, ,multipart/mixed, and \
body ,name=".*.(wav|pif|exe|scr|com|bat|rar)"$,ei

# mots prohibés
reject "Banned word(s), contact postmaster@mydomain.com."
body /.*(sex|money).*/ei

# adresses email prohibées
reject "Banned email, contact postmaster@mydomain.com."
header /From/ /sex@*.*/i

milter-regex sera automatiquement invoqué par Sendmail, grâce à la ligne que vous avez utilisé lors de sa configuration :

INPUT_MAIL_FILTER(`milter-regex', `S=unix:/var/spool/milter-regex/sock,
T=S:30s;R:2m')dnl

Pour automatiser son lancement, ajoutez dans votre rc.local :

# milter-regex
if [ -x /usr/local/libexec/milter-regex ]; then
        echo -n ' milter-regex'; /usr/local/libexec/milter-regex
fi

Filtrage antispam via milter-spamd, Spamassassin et razor-agents

Cette partie est réalisée via mail/milter-spamd, mail/p5-Mail-Spamassassin et mail/razor-agents.

milter-spamd permet d'appeler spamassassin, et sera automatiquement invoqué par sendmail, grâce à la ligne précédemment utilisée lors de sa configuration :

INPUT_MAIL_FILTER(`milter-spamd', `S=unix:/var/spool/milter-spamd/sock,
T=S:30s;R:2m')dnl

Pour automatiser son lancement :

# milter-spamd
if [ -x /usr/local/libexec/milter-spamd ]; then
        echo -n ' milter-spamd'; /usr/local/libexec/milter-spamd
fi

Voici un exemple de configuration de spamassassin, /etc/mail/spamassassin/local.cf :

required_score 5.0
rewrite_header subject *****SPAM*****

report_safe 1

use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

skip_rbl_checks 0
use_pyzor 1

ok_languages en fr de
ok_locales en fr

score SPF_FAIL 0.5
score SPF_HELO_FAIL 0.5

Pour utiliser les directives ok_languages et ok_locales, il est nécessaire d'activer TextCat (module linguistique) en décommentant loadplugin Mail::SpamAssassin::Plugin::TextCat dans le fichier v310.pre.

Le système de whitelisting peut également dans certains cas être opportun. La fonctionnalité est présente par défaut dans les versions récentes de SpamAssassin, via le module AWL. Il vous suffit de constituer un fichier whitelist.cf contenant par exemple :

 whitelist_from email@domain.tld

L'ajout de fichiers de règles en sus de ceux fournis par défaut peut permettre de mettre en place un dispositif plus efficace. De nombreux jeux de règles existent, come SARE ou OpenProtect; ces règles peuvent être mises à jour automatiquement, par exemple via l'outil sa-update fournit avec SpamAssassin.

Crédits

Ecrit Par : Alexandre Anriot
Mis Sur Le Wiki Par : Azwaw OUSADOU

documentations/admin/sendmail_spamd_spamassassin_militer-spamd.txt · Dernière modification: 2010/07/22 17:53 par aanriot
OpenBSD Apache Driven by DokuWiki
CC Attribution-Noncommercial-Share Alike 3.0 Unported