Anti-spam adaptable et performant avec OpenBSD et Spamd
Signature : | Mis en ligne le : 20/05/2008
Catégorie(s) :
  • GNU/Linux Magazine
  • | Domaine :
    Commentez creative commons

    Retrouvez cet article dans : Linux Magazine 101

    Spamd est un programme antispam fourni dans le système de base OpenBSD. Il réglemente le trafic vers le MTA (Mail Transfer Agent) en interagissant avec PF (Packet Filter). Nous allons étudier ses mécanismes d’éradication, son intégration à PF et donner quelques retours sur son utilisation.

    1. Mécanismes

    1.1 Généralités

    Spamd est un daemon qui va s’intercaler entre le monde extérieur et votre MTA en simulant un faux MTA. La passerelle reçoit le mail (1), le trafic est redirigé vers Spamd (2). Spamd le traite et met éventuellement à jour les règles de filtrage de PF (3). Si le mail est licite, alors le vrai MTA reçoit le message.

    /img-articles/lm/101/cc-art-spam/fig-1.jpg

    Plusieurs points sont à noter :
    • Spamd est totalement indépendant du MTA réel (On pourrait, par exemple, le coupler avec Exchange).
    • Il agit de manière complémentaire à tout autre filtre anti-spam plus " haut niveau " du style SpamAssassin. Ce genre de combinaison est très intéressant car, malgré la montée en puissance au niveau calcul des machines, SpamAssassin est extrêmement gourmand en ressources et un examen systématique du trafic SMTP peut effondrer votre architecture mail. Idem pour l’analyse antivirale (avec Clamav par exemple).
    • Il est très efficace du point de vue utilisation des ressources. Son intégration à PF tire parti des performances de ce dernier.
    • Ajouter un premier niveau de filtrage mail sur le pare-feu est intéressant dans la mesure où les machines sont souvent surdimensionnées niveau puissance pour faire uniquement du filtrage IP (mais où l’on n’ajoute rien d’autre dans un souci de sécurité). Cet ajout est possible sans mettre en cause la sécurité de l’ensemble du fait que Spamd est présent dans la base d’OpenBSD et subit un audit sévère du code du point de vue sécurité.
    Le routage du trafic mail vers Spamd ou vers le MTA réel est réglementé par les listes. Ces listes contiennent des IP. Le fait pour un émetteur de mails d’appartenir à telle ou telle liste a différents effets sur la transaction SMTP dont il est l’auteur. Nous allons détailler ces différentes listes.

    1.2 Les Listes

    • Le black listing : cette liste est gérée par Spamd.
    Elle est alimentée via le fichier /etc/mail/spamd.conf et contient des adresses de supposés spammeurs. Lorsqu’une transaction arrive  sur le faux MTA Spamd avec comme source une de ces adresses, Spamd déclenche une action de tarpitting (c’est-à-dire qu’il va répondre extrêmement lentement à la machine source pour consumer les ressources de ce supposé spammeur) et répond avec un code 550 ou 450. En gros, un supposé spammeur sur black list n’est jamais autorisé à parler au vrai MTA. La table PF associée se nomme <spamd>.
    • Le white listing : cette liste contient les hôtes autorisés à parler directement au vrai MTA. Cette liste est alimentée par Spamd. Elle est le résultat du processus de décision de Grey Listing (point suivant) et des entrées taguées white dans le fichier /etc/mail/spamd.conf (voir la section " configuration "). La table PF associée se nomme <spamd-white>.
    • Le grey listing : Spamd n’a pas décidé s’il s’agit d’une connexion licite ou non. Le processus de décision se déroule ainsi : à la première connexion, Spamd renvoie une erreur 451 (serveur temporairement inaccessible, réessayez plus tard). Un timer est déclenché et un triplet temps passé au démarrage de Spamd est utilisé. Le premier élément du triplet fixe le temps (en minutes) au-delà duquel une tentative de reconnexion fait passer l’émetteur de liste grise à liste blanche (autorisée à parler directement au vrai MTA). Le second est une limite de temps (en heures) pour l’existence de l’entrée dans la base Spamd. Si aucune reconnexion n’a été tentée au-delà de cette période, alors l’entrée est supprimée de la base de données Spamd. Le dernier paramètre du triplet donne la durée de validité (en heure) d’une entrée passée de grey en white list. Si l’enregistrement concerné n’est pas utilisé pendant cette période de temps, alors il est supprimé de la white list.
    • Spamtrap : cette liste est composée d’adresses mails. Cette méthode définit une (ou plusieurs) adresse(s) mail(s) comme adresse(s) à Spam. Typiquement, on va utiliser des adresses qui ne sont plus usitées ou présentes sur des listes de spammeurs. Quand un hôte est en Grey List et essaie d’envoyer un message à une adresse de Spamtrap, cet hôte est blacklisté pendant 24h. Pas mal de gens s’amusent avec Spamtrap [1] ...

    1.3 Architecture & fonctionnement

    Spamd se compose de deux daemons :
    • Spamd, un faux MTA traditionnellement bindé sur l’interface de loopback. Son rôle est d’examiner les transactions mail (à destination du port SMTP) passant par le pare-feu. Il va gérer les listes blanches, grises et noires.
    • Spamlogd, programme qui surveille les requêtes mail (à destination du port SMTP) sur l’interface pflog. C’est lui qui va entretenir la liste blanche propre a Spamd. Les règles d’acceptation du trafic SMTP au niveau PF doivent être loguées. Un exemple :
    Note sur pflog L’interface pflog va produire un affichage lorsqu’une règle notée " log " va être appliquée par notre pare-feu. Cet affichage contient le numéro de la règle qui a déclenché l’action de log. Spamd va interagir avec PF de deux manières :
    • Statique sous la forme de redirections de ports (rdr).
    • Dynamique grâce aux tables. Ces tables sont utilisées par les règles de rdr pour orienter le trafic mail soit vers le daemon Spamd (black et grey list), soit vers le vrai MTA (white list).
    En pratique, nous allons déployer le banc de test suivant : le célèbre domaine " example.org " avec comme enregistrement MX (Mail Exchanger) l’IP publique 195.30.25.4 (Point d’entrée du trafic SMTP pour notre réseau). Une machine sur le réseau interne qui va servir de MTA réel (ici Postfix). Son IP privée est la 192.168.0.1.Une machine pare-feu sous OpenBSD avec Spamd bindé sur 127.0.0.1 port 8025 (par défaut).

    2. Configuration

    2.1 Règles PF

    Configurons le pare-feu pour intercaler Spamd entre notre MTA réel et le reste du monde. Voici un extrait de notre /etc/pf.conf (Section NAT/BiNAT/rdr) : Les règles (1) et (2) sont respectivement une whitelist et une blacklist qui vont court-circuiter complètement le mécanisme Spamd. Elles sont présentes sur le disque sous forme d’un fichier texte contenant des IP les unes à la suite des autres. Pour la whitelist (1), on redirige le trafic directement vers le MTA réel. Pour la blacklist (2), on envoie le trafic vers Spamd. Les tables associées à ces deux règles de redirection sont <whitelist> et <blacklist>. Les trois autres règles sont fournies par la documentation de Spamd. Elles utilisent deux tables <spamd> et <spamd-white>. La première table contient les IP des hôtes en cours d’approbation (grey listing) ou blacklistés (bit tarpitting). Ces hôtes sont envoyés vers Spamd (3). La seconde (4) contient les hôtes autorisés à parler directement au MTA réel (white list). L’obsolescence des enregistrements de cette liste est gérée par Spamlogd. La dernière règle (5) est un catch all pour récupérer le trafic SMTP non connu et l’envoyer à Spamd. À présent, le hook pour PF est prêt, nous pouvons passer à la configuration proprement dite de Spamd

    2.2 Spamd

    La configuration pour les listes whites/blacks se passe au niveau de /etc/mail/spamd.conf. On y définit les sources des différentes listes. Examinons notre spamd.conf. Deux choses intéressantes :
    • La section all donne l’ordre d’application des règles. Cet ordre est un peu tordu. Par exemple, si on a la séquence black1:white:black2 et qu’une IP est présente dans les trois listes, alors la transaction va se retrouver dans une blacklist (black2). Si on avait voulu donner la primeur aux whitelists (comme dans notre configuration), alors il faudrait enregistrer le quadruplé black1:white:black2:white.
    • La constitution des listes peut se faire à partir de fichiers (:method=file: et :file=chemin:) ou de ressources réseau (:method=http: et :file=URL:).
    La commande spamd-setup va lire le fichier, télécharger les ressources réseau, mettre à jour la base de données de Spamd et les tables PF associées. Hop, spamd-setup dans un petit cron et la vie est belle (/var/cron/tabs/root) : Pendant que l’on est dans les automatisations de tâches, il faut spécifier la rotation du fichier de log de Spamd, sinon il va faire exploser notre système de fichier. Ajoutons dans /etc/newsyslog.conf : Ce qui veut dire que /var/log/spamd va être " rotaté " sept fois avant d’être détruit. La whitelist utilisée dans notre spamd.conf en exemple est une composition de différentes sources : On vérifie que nos listes blanches sont bien synchrones : C’est un composé de domaines proposant des enregistrements SPF ($domain) et de la whitelist issue de puremagic [2]. On pourra également dumper la table <spamd-white> de temps en temps pour pouvoir le réinjecter dans Spamd en cas de catastrophe (par exemple, pour un établissement d’environ 200 personnes, on fait des pointes à près de 700 enregistrements en whitelist) : La commande spamdb manipule la base de données de Spamd. Pour consulter les mails en cours d’examen : Pour récupérer les transactions en cours pour une adresse mail : Cet enregistrement dispose de 10 champs :
    • le type d’enregistrement (WHITE ou GREY) ;
    • l’IP de l’émetteur du message ;
    • le message HELO envoyé par l’émetteur ;
    • adresse mail source ;
    • adresse mail destination ;
    • date de la première entrée dans la spamdb (première tentative de connexion) ;
    • date à laquelle l’enregistrement sera promu sur liste blanche ;
    • date d’expiration de l’enregistrement dans la spamdb ;
    • nombre de fois où une telle connexion a reçu une " temporary failure " de Spamd ;
    • nombre de fois où une telle connexion est passée sur liste blanche.
    Ajouter un hôte en whitelist (à utiliser avec le dump précédemment mentionné pour remonter sa liste blanche Spamd) :

    2.3 Lancement & paramètres

    Sans surprises, il faut ajouter des choses dans le /etc/rc.conf. Pour lancer Spamd :

    /img-articles/lm/101/cc-art-spam/t1.jpg

    our lancer Spamlogd : /usr/libexec/spamlogd -l pflog0

    3. Conclusion

    3.1 Retours

    On notera que nos paramètres sont plutôt sympas. Le man de Spamd propose une configuration plus dure du triplet temps. En le configurant par défaut, nous avons perdu des mails licites (Wanadoo et Gmail). La raison pour Wanadoo est un trop long délai de réémission (au-delà du second élément du triplet temps). Pour Gmail, c’est plus vicieux : le MTA de Gmail change à chaque tentative. Un coup, c’est le A qui va envoyer, puis le B va réessayer avant de retenter avec A, etc. Ainsi, le message reste indéfiniment en greylist jusqu’à ce que Gmail se lasse. Pour éliminer le spam résiduel, on peut ajouter une filtre supplémentaire au niveau du MTA (Amavisd-new + SpamAssassin serait un bon complément).

    3.2 Synchronisation

    À l’instar de pfsync pour PF, Spamd dispose d’un système de synchronisation de la spamdb. Cette synchronisation recopie les enregistrements d’une spamdb en cours d’utilisation vers un ou plusieurs hôtes de failover. Ces mises à jour peuvent se faire en unicast (dans le cas où l’on a une seule machine de backup) ou en multicast (plusieurs machines de backup). La sécurité des transmissions entre les différentes instances de Spamd est assurée par un algorithme HMAC. Pour mettre cette solution en œuvre, il faut commencer par générer un secret sur la machine " maître " et le répliquer sur la machine esclave : Supposons que nos deux machines aient une interface em0 dédiée à la synchronisation, il nous faudra renseigner Spamd sur le fait qu’il doit se synchroniser. Sur l’esclave, il faut accepter les messages de synchronisation, sur em0, il faut ajouter -y em0 dans les options de Spamd (spamd_flags du /etc/rc.conf) et sur le maître on ajoutera -Y <fqdn_esclave> pour spécifier l’esclave en cible de la synchronisation. Liens:

    Retrouvez cet article dans : Linux Magazine 101

    Vous souhaitez commenter cet article ?
    Brèves Flux RSS
    Édito : GNU/Linux Magazine 149
    Édito : GNU/Linux Magazine HS N°60
    Édito : Misc 61
    Édito : Linux Pratique 71
    Édito : Linux Essentiel N°25
    Communication RSS Com. RSS Presse
    Lancement de la plateforme de vente en ligne de PDF des Éditions Diamond ! Un...
    Misc N°61 – Communiqué de presse
    GNU/Linux Magazine N°149 – Communiqué de presse
    GNU/Linux Magazine HS N°60 – Communiqué de presse
    Linux Pratique N°71 – Communiqué de presse
    prochainement moteur de recherches des articles
     
    :
    :
    Jours heures minutes secondes
    En kiosque Flux RSS

    Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Misc est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau GNU/Linux Magazine HS est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Linux Essentiel est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Misc HS est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...