Utiliser les fonctions anti-spam de pf(4)

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

OpenBSD, spam, spamd(8), spamdb(8), spamlogd(8), pf(4), blacklist, greylist, whitelist

Introduction

Ce document présente comment activer les fonctions d'anti-spam de pf(4) et de son comparse spamd(8), sur un système OpenBSD v4.0 et v4.1.

Si spamd(8) n'était au départ présent que sur OpenBSD, il est maintenant disponible sur les autres BSD : FreeBSD, NetBSD, DragonFly

Présentation de la maquette

Cette maquette utilise :

  • un serveur de courriers sous OpenBSD
  • un filtre de paquets sous OpenBSD

Ces deux éléments sont situés sur la même machine, mais ils pourraient être éclatés sur plusieurs.

Note

Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.

Pré-requis

Ce document considère les points suivants comme faits :

  • Le système OpenBSD installé et fonctionnel.
  • Le serveur de courriers installé, et fonctionnel.

Présentation

Présentation de spamd

spamd(8) est pseudo daemon de MTA (Mail Transfert Agent). Il se comporte comme sendmail(8), sauf qu'il ne route pas les mails, et ne gère pas les queues de mails. Son seul but est d'éliminer les faux mails, et de gaspiller les ressources machines des spammers.

spamd(8) s'utilise principalement couplé avec le filtre de paquets pf(4). pf(4) redirige les connexions SMTP (port tcp/25) entrantes vers le port où spamd(8) écoute. Les tables pf(4) sont utilisées pour forcer les connexions vers spamd(8) ou vers le vrai serveur SMTP (comme postfix ou sendmail).

SpamAssassin fournit aussi un daemon appelé spamd(1). Ces deux programmes n'ont rien de commun. SpamAssassin lutte contre les spams en oscultant le contenu de chaque mail, alors que spamd(8) travaille au niveau des connexions réseaux entre les MTA, et ne se préoccupe pas du contenu des messages.

Comment gaspiller les ressources des spammers ?

Lors de l'initiation d'une transaction SMTP, spamd(8) répond très très lentement au serveur distant (si celui-ci correspond à une entrée dans le fichier /etc/spamd.conf) : un caractère par seconde. Le serveur distant envoie tout le mail avant qu'il ne soit rejeté par spamd(8). Les spams sont toujours rejetés avec un message d'erreur de type “450” ou “550”.

Qu'est-ce que le greylisting ?

Le greylising est une technique anti-spam récente qui consiste à rejeter temporairement un message, par émission d’un code de refus temporaire au serveur émetteur. Le serveur émetteur réexpédie le mail après quelques minutes, la plupart des serveurs de spams ne prennent pas cette peine!

Voici une définition sur Wikipedia

Présentation des différents composants mis en oeuvre

Voici les composants qui peuvent interagir avec spamd(8) :

  • spamd(8) : le daemon principal, c'est lui qui s'occupe d'ajourner l'acceptation des mails
  • spamd-setup(8) : un outil optionnel de configuration de spamd(8).
  • spamlogd(8) : scrute pflog(4) pour gérer la liste des serveurs autorisés (“whiteliste”).
  • spamdb(8) : un outil pour lister, ou ajouter, supprimer des entrées dans la base de spamd.

Activer spamd(8) avec un OpenBSD 4.0

Le pseudo-MTA spamd(8) peux s'exécuter selon plusieurs modes. Deux modes sont utilisés ici : le gaspillage de ressource des spammers et le greylisting.

Pré-requis

Pour utiliser spamd(8) assurez-vous que :

  • le répertoire /var/empty,
  • l'utilisateur _spamd,
  • le groupe _spamd

existent. Ces éléments sont présents dans la configuration de base d'OpenBSD.

Au démarrage, spamd(8) change sa racine d'exécution (chroot(8)) dans le répertoire /var/empty et change ses privilèges vers l'utilisateur _spamd.

Vérifiez aussi que les entrées suivantes existent dans le fichier /etc/services :

spamd           8025/tcp                # spamd(8)
spamd-cfg       8026/tcp                # spamd(8) configuration

Modifier le fichier /etc/pf.conf

Comme nous l'avons vu dans le chapitre précédent, spamd(8), le serveur anti-spam, coopère étroitement avec pf(4). La modification de configuration de pf(4), fichier /etc/pf.conf suivante permet :

  • de définir les tables pf(4) utilisées par spamd(8) (section 1),
  • d'utiliser spamd(8) en mode “waste spammers time” (section 2),
  • d'utiliser spamd(8) en mode “greylisting” (section 3),
  • d'enregistrer les messages émis depuis le MTA local (section 4),
  • d'autoriser les mails acceptés par spamd(8) à joindre le vrai MTA (section 5).
### Dans la section des definitions ###
#section 1
# spamd(8) tables
table <spamd> persist
table <spamd-white> persist


### Dans la section des redirections ###
# anti-SPAM with OpenBSD'spamd(8)
#section 2
# wasting spammers ressources mode
rdr pass on egress inet proto tcp from <spamd> \
   to port smtp -> 127.0.0.1 port spamd
#section 3
# greylisting mode
rdr pass on egress inet proto tcp from !<spamd-white> \
   to port smtp -> 127.0.0.1 port spamd


### Dans la section du filtrage ###
#section 4
# Facultatif : Permet a spamlogd(8) de ne pas greylister 
# les reponses aux mails emis depuis le MTA.
# [ firewall ] -> smtp -> { wan } : for spamlogd(8)
pass out log quick on egress proto tcp from (egress) \
   to port smtp keep state

#section 5
# Traite les paquets acceptes par spamd(8)
# { wan } -> smtp -> [ firewall ]
pass in log on egress proto tcp to (egress) \
   port smtp flags S/SA keep state

Modifier le fichier /etc/rc.conf.local

Pour lancer automatiquement les services spamd(8) au démarrage du système, ajoutez les lignes suivantes au fichier /etc/rc.conf.local :

# PF'daemons
spamd_flags=""          # OpenBSD'mail deferral daemon
spamd_grey=""           # OpenBSD'spamd in greylisting mode
spamlogd_flags=""       # use eg. "-i interface" and see spamlogd(8)

Démarrer spamd(8) à la main

Pour démarrer les services liés à spamd(8) et prendre en compte les modifications des règles de pf(4), exécutez les commandes suivantes :

# /usr/libexec/spamd -g
# /usr/libexec/spamd-setup
# /usr/libexec/spamlogd
#
# pfctl -Fn -f /etc/pf.conf
# pfctl -Fr -f /etc/pf.conf

Activer spamd(8) avec un OpenBSD 4.1

Le pseudo-MTA spamd(8) peux s'exécuter selon plusieurs modes. Le mode par défaut, depuis la version 4.1 est le “greylisting”. Le mode “blacklist” (qui englobe la fonction “gaspillage de ressource”) est maintenant incompatible avec le mode “greylisting”.

Pré-requis

Pour utiliser spamd(8) assurez-vous que :

  • le répertoire /var/empty,
  • l'utilisateur _spamd,
  • le groupe _spamd

existent. Ces éléments sont présents dans la configuration de base d'OpenBSD.

Au démarrage, spamd(8) change sa racine d'exécution (chroot(8)) dans le répertoire /var/empty et change ses privilèges vers l'utilisateur _spamd.

Vérifiez aussi que les entrées suivantes existent dans le fichier /etc/services :

spamd           8025/tcp                # spamd(8)
spamd-cfg       8026/tcp                # spamd(8) configuration

Modifier le fichier /etc/pf.conf

Comme nous l'avons vu dans le chapitre précédent, spamd(8), le serveur anti-spam, coopère étroitement avec pf(4). La modification de configuration de pf(4) suivante permet :

  • de définir la tables pf(4) utilisée par spamd(8) (section 1),
  • d'utiliser spamd(8) en mode “greylisting” (section 2),
  • d'enregistrer les messages émis depuis le MTA local (section 3),
  • d'autoriser les mails acceptés par spamd(8) à joindre le vrai MTA (section 4).
### Dans la section des definitions ###
#section 1
# spamd(8) tables
table <spamd-white> persist


### Dans la section des redirections ###
# anti-SPAM with OpenBSD'spamd(8)
#section 2
no rdr on egress inet proto tcp from <spamd-white> \
   to any port smtp
# greylisting mode
rdr pass on egress inet proto tcp from any \
   to any port smtp -> 127.0.0.1 port spamd


### Dans la section du filtrage ###
#section 3
# Facultatif : Permet a spamlogd(8) de ne pas greylister 
# les reponses aux mails emis depuis le MTA.
# [ firewall ] -> smtp -> { wan } : for spamlogd(8)
pass out log quick on egress proto tcp from (egress) \
   to port smtp keep state

#section 4
# Traite les paquets acceptes par spamd(8)
# { wan } -> smtp -> [ firewall ]
pass in log on egress proto tcp to (egress) \
   port smtp flags S/SA keep state

Modifier le fichier /etc/rc.conf.local

Pour lancer automatiquement les services spamd(8) au démarrage du système, ajoutez les lignes suivantes au fichier /etc/rc.conf.local :

# PF'daemons
spamd_flags=""          # OpenBSD'mail deferral daemon
spamlogd_flags=""       # use eg. "-i interface" and see spamlogd(8)

Démarrer spamd(8) à la main

Pour démarrer les services liés à spamd(8) et prendre en compte les modifications des règles de pf(4), exécutez les commandes suivantes :

# /usr/libexec/spamd
# /usr/libexec/spamd-setup
# /usr/libexec/spamlogd
#
# pfctl -Fn -f /etc/pf.conf
# pfctl -Fr -f /etc/pf.conf

Contourner les problèmes avec certains domaines émetteurs

Présentation

Le greylising est une technique anti-spam récente qui consiste à rejeter temporairement un message, par émission d’un code de refus temporaire au serveur émetteur. Le serveur émetteur réexpédie le mail après quelques dizaines minutes. Cette technique est confrontée à un problème quand le domaine émetteur possède de larges pools de serveurs SMTP sortants. Dans ce cas, il est rare que lors de la deuxième tentative d'envoi du mail, ce soit le même serveur SMTP (avec la même adresse IP) qui se présente devant spamd(8). Ce dernier, puisqu'il ne connaît pas cette adresse IP, la “greylist”. Et ainsi de suite. Il arrive alors que le serveur SMTP émetteur n'arrivant pas à émettre son message abandonne au bout de plusieurs jours.

Pour contourner ce problème, il faut créer une base des grands pools de serveurs SMTP sortants.

Modifier le fichier /etc/pf.conf

Cas d'un OpenBSD 4.0

Modifiez comme suit les sections de définition des “tables” et celle de définition des “redirections”. Le reste du fichier /etc/pf.conf est inchangé.

table <spamd> persist
table <spamd-white> persist
table <spamd-manual-white> persist file "/etc/mail/spamd-manual-white.txt"

[...]
### Dans la section des redirections ###
# anti-SPAM with OpenBSD'spamd(8)
# wasting spammers ressources mode
rdr pass on egress inet proto tcp from <spamd> \
   to port smtp -> 127.0.0.1 port spamd
# manual whitelist
rdr pass on egress inet proto tcp from <spamd-manual-white> \
   to port smtp -> 127.0.0.1 port smtp
# greylisting mode
rdr pass on egress inet proto tcp from !<spamd-white> \
   to port smtp -> 127.0.0.1 port spamd

Cas d'un OpenBSD 4.1

Modifiez comme suit les sections de définition des “tables” et celle de définition des “redirections”. Le reste du fichier /etc/pf.conf est inchangé.

table <spamd> persist
table <spamd-manual-white> persist file "/etc/mail/spamd-manual-white.txt"

[...]
### Dans la section des redirections ###
no rdr on egress inet proto tcp from { <spamd-white>, <spamd-manual-white> } \
   to any port smtp
# greylisting mode
rdr pass on egress inet proto tcp from any \
   to any port smtp -> 127.0.0.1 port spamd

Créer le fichier de base whitelist

Comment connaître les serveurs SMTP sortants valides d'un domaine ? En interrogeant le DNS bien-sûr. Par exemple, utilisez les commandes suivantes :

# dig apple.com TXT +short
"v=spf1 ip4:17.0.0.0/8 ~all"
#
# dig gmail.com TXT +short
"v=spf1 redirect=_spf.google.com"

Il faut remarquer que le domaine “apple.com” indique directement la plage d'adresses IP utilisées par ses serveurs SMTP sortants valides. En revanche, “google.com” indique la demande à formuler pour obtenir cette liste. Par exemple :

# dig _spf.google.com TXT +short
"v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:209.85.128.0/17 ip4:66.102.0.0/20 ?all"

Il ne reste plus qu'à copier-coller ces adresses dans le fichier /etc/mail/spamd-manual-white.txt.

Note : Créer comme suit un fichier /etc/mail/spamd-manual-white.txt vide :

# > /etc/mail/spamd-manual-white.txt
# chown root:wheel /etc/mail/spamd-manual-white.txt
# chmod 644 /etc/mail/spamd-manual-white.txt

Créer un script pour générer la base whitelist

La méthode précédente peux s'avérer fastidieuse. Alors, voici un script whitelist.sh qui permet d'automatiser la création de la base de whitelist.

Pour être sûr de garder votre base “whitelist” à jour, vous pouvez faire appel à ce script dans le fichier /etc/weekly.local. Ainsi, toutes les semaines, le script whitelist.sh générera une nouvelle base.

Maintenir les bases de données de spamd(8)

Maintenir la base de spammers

Introduction

L'outil spamd-setup(8) envoie les informations blacklistées à spamd(8), et configure les messages de refus de mails pour les entrées blacklistées.

Quand spamd-setup(8) est utilisé en mode “blacklist only” (comme spamd(8)), il n'envoie plus directement les informations à spamd(8), mais les envoie à la table <spamd> de pf(4).

Utiliser spamd-setup(8) en mode greylist

Pour mettre à jour la liste des adresses blacklistées, modifiez comme suit la crontab(5) de l'utilisateur 'root'.

# crontab -e
0       *       *       *       *       /usr/libexec/spamd-setup

Utiliser spamdb(8)

L'outil spamdb(8) sert à manipuler les entrées dans la base /var/db/spamd utilisées par spamd(8) en mode “greylisting”. Il ne sert pas directement à mettre à jour la table <spamd-white>.

Il peut y avoir 4 types d'entrées dans la base /var/db/spamd :

  • SPAMTRAP : adresses mails utilisées pour le “greytraping” (non utilisé dans ce document),
  • TRAPPED : adresses IP des serveurs qui ont tenté d'envoyer des mails aux adresses de “greytrapping” (non utilisé dans ce document),
  • WHITE : adresses IP qui sont autorisées à communiquer avec le MTA local. Ces adresses doivent correspondre avec celles de la table <spamd-white>,
  • GREY : adresses IP qui sont dans la phase de “greylisting”

Afficher le contenu de la base

Executez la commande suivante :

# spamdb
GREY|219.84.60.50|<>|<rlkv@leaves.org>|1166628289|1166642689|1166642689|1|0
WHITE|68.187.189.32|||1166607665|1166609802|1169722113|3|1
GREY|69.263.23.233|<npwf@thief.com>|<yapshw@leaves.org>|1166636191|1166650591|1166650591|4|0

Présentation des différents champs :

  • type,
  • adresse IP de l'émetteur,
  • adresse mail de l'émetteur (vide quand l'adresse IP est whiteliste),
  • adresse mail du destinataire (inexistant quand l'adresse IP est whiteliste),
  • date de la première apparition de l'adresse IP en “Unix time”,
  • date de la dernière apparition (ou du greslisting) de l'adresse IP en “Unix time”,
  • date de l'expiration du greylist de l'adresse IP en “Unix time”,
  • nombre de tentatives de connexions échouées pour cette entrée,
  • nombre de connexions qui ont été envoyées au vrai MTA (utilisé par spamlogd(8)).

Ajouter une entrée à la base

Pour ajouter manuellement une entrée dans la base de spamd(8), exécutez la commande suivante :

# spamdb -a 72.247.126.240

Cette entrée est considérée de type WHITE.

Supprimer une entrée à la base

Pour supprimer manuellement une entrée dans la base de spamd(8), exécutez la commande suivante :

# spamdb -d 72.247.126.240

Afficher le contenu des tables de pf(4)

Afficher le contenu de la table <spamd-white>

Comme présenté mentionné plus haut, le daemon spamd(8) utilise la base/var/db/spamd pour maintenir la table pf(4) <spamd-white>. Pour afficher le contenu de cette table, exécutez la commande suivante :

# pfctl -t spamd-white -T show

Afficher le contenu de la table <spamd>

Le daemon spamd(8) place les adresses IP blacklistées dans la table <spamd>. Pour afficher le contenu de cette table, exécutez la commande suivante :

# pfctl -t spamd -T show

Liens

Pour plus d'informations, voir les pagesde manuel suivantes :

 
doc/openbsd/pfspamd.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page