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!
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 mailsspamd-setup(8): un outil optionnel de configuration despamd(8).spamlogd(8): scrutepflog(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 despamd.
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 parspamd(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 :