Anti-Spam avec Exim
En tant que responsable réseau (à titre personnel ou professionnel), vous devez protéger les utilisateurs d'un des pires fléaux existant sur Internet : le spam. Un bref coup d' il au "Jargon Français" nous apprend que le terme spam est l'acronyme de Shoulder of Pork and hAM ("Epaule de porc et jambon"). SPAM est en fait la marque déposée d'un fabriquant de corned-beef.

En informatique, le spam désigne les messages publicitaires envoyés de manière automatique à un nombre important de destinataires. L'image qui explique le choix du terme est
grosso modo le fait de "balancer des morceaux de viande dans les pales d'un ventilateur". On imagine le résultat :)

Le spam est une technique promotionnelle relativement peu coûteuse puisqu'il suffit de posséder une connectivité Internet pour la mettre en uvre. Ainsi, la quasi totalité des utilisateurs d'Internet ont déjà au moins une fois dans leur vie reçu des messages faisant la promotion d'un produit quelconque, le plus souvent sans aucun rapport avec ses préférences.

Et c'est bien là le problème ! Le spam n'est pas ciblé, il concerne n'importe quelle personne et n'importe quelle promotion. En s'inscrivant ou en laissant traîner une adresse email sur un site douteux, on vient tout simplement enrichir un peu plus une base de données énorme contenant des milliers d'adresses. Il ne reste au spammeur qu'à automatiser l'expédition de mails pour saturer les pauvres utilisateurs de publicité vantant les mérites d'un produit miracle ou d'un site sublime.

Les adresses contenues dans les bases s'échangent rapidement entre spammeurs et la procédure est souvent tellement automatisée que répondre à un message promotionnel ne fait qu'empirer les choses.

Heureusement pour nous, tous les MTA (
Mail Transfer Agents) possèdent des capacités de filtrage permettant de limiter l'acceptation de mails. Il est ainsi possible de refuser tout message provenant d'une machine arbitraire ou d'une IP déterminée. Le spam est formellement interdit par la plupart des providers Internet et autres fournisseurs d'accès. De cette manière, le spammeur ne peut utiliser le MTA de son provider pour commettre ses méfaits et s'il utilise son propre serveur SMTP, il se verra rapidement repéré et interdit. L'astuce pour le spammeur consiste donc à rechercher des serveurs SMTP permettant l'expédition de messages sans restriction. Il cherche des MTA en Open Relay...

L'Open Relay est mal
La configuration la plus classique pour un serveur SMTP est d'envoyer et de recevoir des messages pour un certain nombre de personnes. Nous parlerons de la réception un peu plus loin dans l'article. En attendant, penchons-nous sur l'envoi de messages.

Le serveur SMTP est habituellement associé à un ou plusieurs nom(s) de domaines. Dans la plupart des cas, sur le même réseau, se trouve également un serveur HTTP (Web) et souvent, un partage de connectivité Internet existe (il peut également s'agir de la même machine physique). Les personnes sur le LAN utilisent donc le serveur SMTP pour envoyer leurs messages.

Les problèmes surviennent rapidement lorsque le MTA n'est pas configuré de manière à limiter l'expédition de messages aux seuls utilisateurs du LAN. Restreindre l'utilisation du serveur est pourtant une chose relativement facile à configurer. Une configuration de base où les connexions du LAN passent par une machine spécifique pour accéder à Internet permet par exemple de limiter l'expédition de messages aux connexions provenant de cette machine. Une simple ligne dans le fichier de configuration suffit à configurer Exim :

host_accept_relay = aaa.bbb.ccc.ddd

Dans ce cas, aaa.bbb.ccc.ddd désigne l'adresse IP, ou une plage d'adresses (en ajoutant /valeur qui correspond à un masque sur l'IP), autorisée à utiliser le serveur. De cette manière, les personnes rattachées à des machines n'utilisant pas cette adresse ou plage d'adresse ne pourront pas expédier de message avec votre serveur.

L'autre technique consiste à authentifier les utilisateurs par un mot de passe. Cette technique devra être choisie si un certain nombre d'utilisateurs du service SMTP ne se trouvent pas sur le LAN et ne peuvent donc pas être identifiés grâce à leur adresse IP.

Le système d'authentification d'Exim est relativement simple à comprendre. Dans un premier temps, nous ajouterons en plus de notre ligne
host_accept_relay une nouvelle ligne définissant la manière de réagir si un client utilisant une autre adresse IP voulait envoyer un message avec notre MTA :

host_auth_accept_relay = *

Ici, nous définissons que n'importe quel client (adresse IP) peut demander à être authentifié auprès de notre serveur. Mais la transaction ne sera acceptée que si l'authentification réussit. Il ne nous reste plus, ensuite, qu'à définir en quoi consistera cette authentification. Pour cela, nous ajoutons en fin du fichier de configuration les blocs suivants :

plain:
driver = plaintext
public_name = PLAIN
server_condition = "$if crypteq$2$extract1:$lookup$1lsearch/etc/exim/passwd$value*:*10"
server_set_id = $1

Nous définissons un nouvel authenticator. Il s'agit d'un mécanisme d'authentification PLAIN consistant à utiliser une chaîne de caractères spécifique. La condition de réussite de l'authentification est spécifiée par server_condition. Ici, nous parcourons le fichier /etc/exim/passwd afin de trouver une correspondance entre la chaîne fournie par le client une fois cryptée et l'entrée dans le fichier.

Ce mécanisme d'authentification est documenté dans la RFC2595. La chaîne fournie par le client doit être codée en MIME64. On pourra alors facilement tester l'authentification en fonction à l'aide d'un simple
telnet :

$ telnet mail.mondomaine.org 25
Trying xxx.xxx.xxx.xxx...
Connected to mail.mondomaine.org.
Escape character is '^]'.
220 mail ESMTP Exim 3.12 #1 Thu, 27 Sep 2001 18:20:57 +0200

Nous utilisons ensuite la commande EHLO qui devrait nous retourner les informations (entre autres) concernant l'authentification :

[...]
250-AUTH PLAIN
[...]

Enfin, nous pouvons nous authentifier avec :

AUTH PLAIN <la chaîne codée MIME64>

Il existe cependant un autre mécanisme d'authentification couvert par aucune RFC mais pourtant implémenté dans quelques clients SMTP : LOGIN. Ce mécanisme utilise un nom d'utilisateur et un mot de passe séparé :

login:
driver = plaintext
public_name = LOGIN
server_prompts = "Username:: : Password::"
server_condition = "$if crypteq$2$extract1:$lookup$1lsearch/etc/exim/passwd$value*:*10"
server_set_id = $1

Il est assez rare de voir des machines utiliser une authentification telle que celle-là. Il faut savoir que les chaînes échangées entre le serveur et le client circulent en clair (le codage MIME64 n'est pas un chiffrement de données). Si on possède la maîtrise des logiciels utilisés par les clients, on préférera une solution de tunneling basée sur stunnel ou ssh.

Laisser un système en
Open Relay est très dangereux. Non seulement n'importe qui peut utiliser votre serveur SMTP, ce qui est fortement dérangeant, mais il faut également savoir qu'un certain nombre de serveurs SMTP testeront le vôtre afin de s'assurer qu'il n'est pas en Open Relay. Si malheureusement c'est le cas, vous serez ajouté dans une liste de serveurs ouverts et dont il ne faut pas accepter de messages.

RBL
RBL signifie Realtime Blackhole List (ou Realtime Blocking List). Les serveurs envoyant du spam sont tous enregistrés dans une liste. La liste est remplie à l'aide de contributions d'utilisateurs spammés. N'hésitez donc pas à utiliser ce genre de service pour vous plaindre du comportement outrageusement commercial de certaines sociétés. Le retrait de la liste est plus difficile et nécessitera de prendre contact avec les responsables du serveur.

Le plus connu et le plus utilisé des systèmes anti-spam de ce type est le MAPS RBL (
Mail Abuse Prevention System Realtime Blackhole List).

Dans les deux cas, le système utilisé se base sur un serveur DNS. Les adresses des hôtes coupables de spam sont enregistrées sous la forme de
Resource Record sur le n ud blackholes.mail-abuse.org. Vous pourrez donc facilement tester l'existence d'une entrée avec :

$ nslookup <adresse IP inversée>.blackholes.mail-abuse.org

Si l'adresse ne se résout pas, l'hôte testé n'est pas dans la base. Inversement, une résolution du nom indique que cet hôte est listé parmi les spammeurs. L'adresse 127.0.0.2 permet de faire les tests ; elle a été choisie de manière arbitraire, mais ne devrait pas changer dans l'avenir :

$ nslookup 2.0.0.127.blackholes.mail-abuse.org
Server: rs1.nan2.fr.uu.net
Address: 194.98.65.65

Name: 2.0.0.127.blackholes.mail-abuse.org
Address: 127.0.0.2

Bien sûr, nous n'allons pas écrire un script pour faire cela à chaque message reçu par notre serveur SMTP, nous allons laisser le soin à Exim de le faire. Pour cela, il nous suffit d'ajouter quelques lignes dans le fichier de configuration :

- Nous commençons par spécifier le domaine MAPS RBL
rbl_domains = blackholes.mail-abuse.org/reject

- Nous éliminons les IP concernant notre réseau (par exemple, tout le réseau local, 192.168.0.0/24) mais incluons toutes les autres adresses (0.0.0.0/0)
rbl_hosts = !192.168.0.0/24:0.0.0.0/0

- Nous précisons cependant que le responsable de la machine SMTP peut être contacté par les hôtes rejetés
recipients_reject_except = postmaster@mon.domaine.org

De cette manière, chaque fois qu'Exim sera contacté par un autre serveur SMTP, il utilisera la technique exposée plus haut pour décider ou non de rejeter le message entrant.

Notez également qu'il existe un module Apache permettant d'appliquer cette politique et cette technique pour vos pages Web. Ceci peut paraître assez étrange à première vue, mais il ne faut pas oublier que les spammeurs n'hésitent pas à utiliser toutes les ressources du Web pour obtenir de nouvelles adresses email. Interdire l'accès aux spammeurs à vos pages Web peut donc être important si vous y regroupez un grand nombre d'adresses (un forum par exemple).


ORBL
ORBL signifie Open Relay Black List. Il s'agit d'une base de données régulièrement tenue à jour et regroupant des adresses IP et des noms de machine étant connus pour être des serveurs SMTP en Open Relay. Accepter ou non de recevoir des messages en fonction des entrées dans une telle base est une méthode brutale consistant à refuser tout message provenant d'un serveur SMTP, même dans le cas où il n'a jamais servi à envoyer du spam. Dans la plupart des cas, aucune différence n'est faite entre les gros providers Internet et de simples machines d'entreprise ou de particuliers.

Comprenez bien qu'en utilisant ce système, vous pouvez parfaitement être amené à refuser des messages provenant du plus important fournisseur d'accès du pays. Dans le cas d'une machine personnelle, il ne s'agit peut-être pas d'un gros problème. En revanche, dans un cadre professionnel, ceci peut vous apporter de bien fâcheuses surprises.

Vous pouvez construire à l'aide de scripts votre propre base ORBL. Il suffit pour cela de tenter d'envoyer un message en utilisant le serveur SMTP qui vient de vous contacter. Bien sûr, cela générera beaucoup de trafic réseau et une solution plus simple consiste à utiliser un serveur existant (voir Liens).

Ce type de liste fonctionne sur le même principe que le RBL et une configuration identique à celle exposée plus haut fera l'affaire.


Liens
MAPS RBL
http://mail-abuse.org/
http://mail-abuse.org/rbl/

Exim
http://www.exim.org
http://www.exim.org/howto/rbl.html

Le module RBL pour Apache
http://www.blars.org/mod_access_rbl.html

Un script intéressant permettant de tester un hôte avec MAPS RBL
http://www.unicom.com/sw/blq/