====== Partie 5 : lutter contre le spam ======
===== Comment ça marche la détection de spam =====
Le spam est la plaie des e-mails. Si vous ne faites rien pour lutter contre, vous allez crouler sous les spams. Heureusement, il y a plusieurs moyens de lutter contre le spam. Plusieurs logiciels vont nous aider dans cette tâche.
==== Postgrey ====
À chaque e-mail reçu, Postgrey va vérifier la combinaison adresse IP de l'envoyeur, adresse e-mail de l'envoyeur et adresse e-mail du destinataire. Si cette combinaison n'a jamais été vue, il va rejeter l'e-mail. Les serveurs e-mail légitimes vont renvoyer l'e-mail alors que la plupart des serveurs envoyant du spam ne renvoient rien en cas de rejet
==== ClamAV ====
Pas grand-chose à dire dessus. C'est un antivirus qui va nous permettre d'éliminer les e-mails contenant des virus
==== Amavis ====
Amavis est un logiciel central. C’est un logiciel qui filtre le contenu des e-mails en se couplant avec d’autres logiciels. En se couplant avec Spamassassin il va pouvoir filtrer les spams et à l’aide de Clamav il va éliminer les e-mails contenant des virus. Le tout avec la coopération de Postfix, le serveur e-mail.
==== SpamAssassin ====
Pour finir, le logiciel le plus important, SpamAssassin. C’est un logiciel qui fait passer à chaque e-mail une série de tests, appelés règles, et dont on peut trouver la liste [[|https://spamassassin.apache.org/old/tests_3_3_x.htmlici]]. À chaque règle correspond une note, et le cumul des notes de toutes ces règles va représenter le score de l'-email. Par défaut, le système va considérer tous les e-mails avec un score supérieur à 6,31 comme un spam. Donc plus le score est haut, plus l'e-mail a de chance d’être un spam.
Prenons la règle SUBJ_ALL_CAPS comme exemple pour expliquer le principe un peu plus en détail. Cette règle vérifie si le sujet de l'e-mail est écrit uniquement en majuscule. Comme toutes les règles, une note est associée à cette règle. Par défaut, cette règle vaut 1,506.
Dès qu’un e-mail est reçu, cette règle, comme toutes les autres, va être jouée. Si le sujet du mail est écrit uniquement en majuscule, la règle va être activée pour cet e-mail et augmentera son score de 1,506. Si le sujet n’est pas uniquement en majuscule, elle ne sera pas activée et n’augmentera pas son score.
Toutes les règles fonctionnent sur le même principe, de manière binaire. Si elles sont vraies, elles augmentent ou diminuent le score du mail d’une valeur fixe propre à chaque règle et si elles sont fausses, elles ne modifient pas le score du mail.
Ca fera peut-être tiquer certains de lire que les règles augmentent ou diminuent le score. L’écrasante majorité des règles sont des malus, dans le sens où lorsqu’elles sont actives elles augmentent le score de l'e-mail pour augmenter les chances qu’il soit classé en tant que spam. Comme SUBJ_ALL_CAPS par exemple.
Mais quelques-unes sont des bonus. Comme USER_IN_SPF_WHITELIST par exemple, qui s’active si l’adresse de l’expéditeur est dans une liste blanche. Ces règles diminuent le score du mail lorsqu’elles sont actives pour augmenter les chances que le mail soit classé comme ham (l’inverse d’un spam, un e-mail désiré). La note de USER_IN_SPF_WHITELIST par exemple est de -100.
Les e-mails marqués comme spam vont voir leur titre modifié avec l’ajout du flag SPAM (suivant la configuration) et certains champs vont être ajoutés dans l’entête de l'e-mail :
* X-Spam-Flag : indique si le'-mail est considéré comme spam ou ham.
* X-Spam-Score : indique le score de l'e-mail calculé par Spamassassin.
* X-Spam-Level : indique le niveau de spam lié au score, sous forme d’étoile. Si le score de l'e-mail est 2,5 par exemple, le champ X-Spam-Level affichera “**”.
* X-Spam-Status : indique le détail du calcul du score en affichant les règles activées sur cet e-mail et la note de chacune d’elles.
Parmi toutes ces règles, il y en a une, ou plutôt un ensemble, qui est toujours activée. C’est un ensemble de règle utilisant un filtre bayésien (n’étant pas mathématicien, je vous laisse chercher sur Wikipédia comment fonctionne en détail un filtre bayésien 😉). À la différence des autres tests, le filtre bayésien est amélioré avec le temps chaque fois que vous marquez manuellement un e-mail comme spam ou comme ham via le programme sa-learn, un outil interne de Spamassassin qui sert à alimenter la base de donnée du filtre bayésien.
Pour chaque e-mail, il va calculer le pourcentage de chance que l'e-mail soit un spam. Si, par exemple, il estime qu'il a entre 40 et 60% de chance d’être un spam, il va activer la règle BAYES_50 et augmenter le score de 0,8. Si l’estimation est entre 60 et 80%, il va activer la règle BAYES_60 qui augmente le score de 1,5, et ainsi de suite.
Et comme je vous disais, il apprend de ses erreurs si vous lui expliquez que tel e-mail ne doit pas être considéré comme un spam. On va donc voir deux méthodes, qui peuvent être combinées, pour marquer manuellement des mails comme spam ou ham et ainsi alimenter la base donnée du filtre bayésien.
La première méthode va utiliser Roundcube, un des webmail les plus utilisés.
La seconde méthode va utiliser Thunderbird (ou tout autre gestionnaire de mail).
Le détail de ces méthodes est expliqué dans la [[serveur_hebergement:serveur_mail:partie_6_roundcube|partie 6]]
Fin des explications
===== Installation =====
Lancez la commande pour installer ces logiciels et leurs dépendances :
sudo aptitude install amavisd-new arj bzip2 cabextract cpio rpm2cpio file gzip lhasa nomarch pax rar unrar p7zip-full unzip zip lrzip lzip liblz4-tool lzop unrar-free clamav clamav-daemon spamassassin libnet-dns-perl libmail-spf-perl pyzor razor postgrey
===== Configuration =====
Passons à la configuration.
==== Amavis ====
Ouvrez le fichier 15-content_filter_mode avec la commande :
sudo nano /etc/amavis/conf.d/15-content_filter_mode
Décommentez les lignes suivantes pour activer la recherche de virus :
#@bypass_virus_checks_maps = (
# \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
Redémarrez Amavis :
sudo systemctl restart amavis
==== Postfix ====
Il va falloir indiquer à Postfix qu'il doit transférer les e-mails à Amavis et ensuite les récupérer après analyse.
Ouvrez le fichier main.cf :
sudo nano /etc/postfix/main.cf
Ajoutez la ligne suivante pour indiquer à Postfix qu'il doit transmettre chaque mail à Amavis, qui écoute sur le port 10024 :
content_filter = smtp-amavis:[127.0.0.1]:10024
Ouvrez le fichier master.cf :
sudo nano /etc/postfix/master.cf
Ajoutez les lignes suivantes :
#Connexion de Postfix à Amavis
smtp-amavis unix - - n - 2 smtp
-o syslog_name=postfix/amavis
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
-o smtp_tls_security_level=none
Explication des lignes :
* syslog_name=postfix/amavis -> Change le nom du processus dans les logs et le remplace par postfix/amavis
* smtp_data_done_timeout=1200 -> Temps limite pour recevoir une réponse du serveur
* smtp_send_xforward_command=yes -> Transfére le nom, l'adresse, le protocole et le nom HELO du client original au filtre, qui apparaissent également dans les logs au lieu de 127.0.0.1...
* disable_dns_lookups=yes -> Désactive la recherche de DNS pour se connecter à Amavis
* max_use=20 -> Nombre maximum de requête
* smtp_tls_security_level=none -> Désactive TLS pour se connecter à Amavis
Ajoutez également les lignes suivantes pour pouvoir récupérer les e-mails analysés par Amavis :
#Ajout d'un processus Postfix pour recevoir les e-mails analysés par Amavis
10025 inet n - n - - smtpd
-o syslog_name=postfix/10025
-o content_filter=
-o mynetworks_style=host
-o mynetworks=127.0.0.0/8
-o local_recipient_maps=
-o relay_recipient_maps=
-o strict_rfc821_envelopes=yes
-o smtp_tls_security_level=none
-o smtpd_tls_security_level=none
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_end_of_data_restrictions=
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_address_mappings
On va également en profiter pour optimiser Postfix dans la lutte contre le spam.
Ouvrez le fichier main.cf :
sudo nano /etc/postfix/main.cf
Ajoutez les lignes suivantes :
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, check_helo_access hash:/etc/postfix/helo_access, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname
La première ligne oblige les clients à envoyer la commande "HELO" avant "MAIL FROM".
La seconde ligne autorise les connexions dont le nom d'hôte passé avec HELO correspond au réseau local, à des utilisateurs enregistrés ou est en liste blanche et rejette les connexions dont le nom d'hôte passé avec HELO est en liste noire (check_helo_access gère la liste blanche et noire), a une syntaxe invalide, n'est pas sous la forme FQDN ou n'est associé à aucun enregistrement DNS de type A ou MX.
Pour la liste blanche/noire, il vous faut créér le fichier helo_access :
sudo nano /etc/postfix/helo_access
puis ajouter le nom d'hôte comme suit pour l'ajouter en liste blanche :
/^mail\.domaine\.fr$/ OK
et comme suit pour l'ajouter en liste noire :
/^mail\.domaine\.fr$/ REJECT
Puis lancez la commande suivante pour créer le fichier helo_access.db :
sudo postmap /etc/postfix/helo_access
Si vous modifiez le fichier helo_access, vous devrez relancer la commande postmap pour mettre à jour le fichier helo_access.db.
Toujours dans le fichier main.cf, modifiez la ligne smtpd_sender_restrictions pour avoir comme suit :
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/spam_exceptions, reject_unknown_client_hostname
On accepte les e-mails provenant du réseau local, des utilisateurs enregistrés, on refuse les e-mails non destiné au server et provenant d'un nom de domaine sans enregistrement DNS de type A ou MX, et on refuse également les e-mail lorsque l'adresse IP ne correspond pas au nom de domaine (et inversement) ou si l'adresse IP associée au nom de domaine ne correspond pas à l'adresse IP du client, sauf si l'adresse est dans la liste blanche spam_exceptions. Le reste des e-mails sont acceptés.
Pour la liste blanche, il vous faut créér le fichier spam_exceptions :
sudo nano /etc/postfix/spam_exceptions
puis ajouter le nom d'hôte comme suit pour l'ajouter en liste blanche :
/^mail\.domaine\.fr$/ OK
Puis lancez la commande suivante pour créer le fichier spam_exceptions.db :
sudo postmap /etc/postfix/spam_exceptions
Si vous modifiez le fichier spam_exceptions, vous devrez relancer la commande postmap pour mettre à jour le fichier spam_exceptions.db.
Modifiez la ligne smtpd_recipient_restrictions pour avoir comme suit :
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf, reject_rhsbl_helo dbl.spamhaus.org, reject_rhsbl_reverse_client dbl.spamhaus.org, reject_rhsbl_sender dbl.spamhaus.org, permit_dnswl_client list.dnswl.org=127.0.[0..255].[1..3], reject_rbl_client zen.spamhaus.org
On accepte les e-mails à destination d'une adresse locale, d'une adresse d'un utilisateur enregistré et on rejette l'e-mail s'il n'est pas à destination de notre domaine ou si l'adresse d'expédition, l'adresse IP ou le nom de domaine du client est dans une liste noire, à part si l'adresse IP se trouve dans la liste blanche dnswl.org
==== ClamAV ====
Ouvrez le fichier 15-content_filter_mode :
sudo nano /etc/amavis/conf.d/15-content_filter_mode
Décommentez les lignes suivantes pour activer la recherche de virus :
#@bypass_virus_checks_maps = (
# \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
Amavis va avoir besoin d'accéder au fichier /var/run/clamav/clamd.ctl pour communiquer avec ClamAV. On va donc ajouter l'utilisateur clamav au groupe amavis :
sudo adduser clamav amavis
Par défaut, Amavis écoute sur le port 10024 à la fois pour les e-mails entrant et sortant. Il est conseillé d'avoir un port pour les e-mails entrants et un autre pour les sortants.
Ouvrez le fichier 50-user :
sudo nano /etc/amavis/conf.d/50-user
Ajoutez la ligne suivante entre use "strict;" et "1;" pour ajouter un processus écoutant sur le port 10026 :
# Ajouter un processus sur le port 10026
$inet_socket_port = [10024,10026];
Ajoutez ensuite la ligne suivante pour appliquer la règle "ORIGINATING" à ce processus :
# Appliquer la règle ORIGINATING au processus écoutant sur le port 10026
$interface_policy{'10026'} = 'ORIGINATING';
Enfin, ajoutez les lignes suivantes pour définir la règle "ORIGINATING" :
# Configuration de la règle ORIGINATING
$policy_bank{'ORIGINATING'} = { # e-mails provenant apparemment d'un utilisateur enregistré ou local
originating => 1, # on déclare que cet e-mail provient de notre client smtp
allow_disclaimers => 1, # on active l'insertion d'un avertissement si pris en charge
# on notifie l'administrateur de l'apparition d'un malware dont la provenance est interne
virus_admin_maps => ["virusalert\@$mydomain"],
spam_admin_maps => ["virusalert\@$mydomain"],
warnbadhsender => 1,
# on force la conversion MTA sur 7-bit
smtpd_discard_ehlo_keywords => ['8BITMIME'],
bypass_banned_checks_maps => [1], # permet d'envoyer n'importe quel type ou nom de fichier
terminate_dsn_on_notify_success => 0, # on conserve l'option NOTIFY=SUCCESS activée
};
Ouvrez le fichier master.cf de Postfix :
sudo nano /etc/postfix/master.cf
Afin que les e-mails provenant d'utilisateurs enregistrés soient transférés au processus Amavis sur le port 10026, après "smtps inet n - y - - smtpd", ajoutez à la fin la ligne suivante :
-o content_filter=smtp-amavis:[127.0.0.1]:10026
Ajoutez également la ligne suivante pour éviter qu'OpenDKIM ne signe deux fois les messages (une fois avant le transfert à Amavis et une fois après l'avoir récupéré) :
-o receive_override_options=no_milters
==== SpamAssassin ====
Ouvrez le fichier 15-content_filter_mode :
sudo nano /etc/amavis/conf.d/15-content_filter_mode
Décommentez les lignes suivantes pour activer le filtre anti-spam :
#@bypass_spam_checks_maps = (
# \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Les options par défaut se trouvent dans le fichier
/etc/amavis/conf.d/20-debian_defaults
Si vous souhaitez modifier des valeurs, il vous faut modifier le fichier
/etc/amavis/conf.d/50-user
Si par exemple vous voulez que soit affiché pour tous les e-mails, spam et non spam, l'entête X-Spam-Status, il vous faut ajouter la ligne suivante :
# Toujours ajouter l'entête X-Spam-Status
$sa_tag_level_deflt = -9999;
Si vous souhaitez avoir l'en-tête X-Spam-Report sur les e-mails classés en spam, ajoutez la ligne suivante :
$allowed_added_header_fields{lc('X-Spam-Report')} = 1;
Pour que les modifications dans ce fichier soient prises en compte, il faut que $mydomain dans le fichier 05-domain_id correspondent bien à votre nom de domaine. La valeur par défaut de $mydomain est "head -n 1 /etc/mailname". Si cette commande ne renvoie pas "domaine.fr" (correspondant donc à votre nom de domaine), il faudra remplacer la ligne
chomp($mydomain = `head -n 1 /etc/mailname`);
par
$mydomain = "domaine.fr";
Si vous avez besoin de modifier le score d'une règle de SpamAssassin, il vous faudra modifier le fichier
/var/lib/amavis/.spamassassin/user_prefs
Il vous suffit d'ajouter la ligne "score nom_de_la_règle score_désiré". Vous pouvez également ajouter des adresses e-mail en liste blanche en ajoutant la ligne "whitelist_from adresse_e-mail"
Redémarrez Amavis, ClamAV et Postfix :
sudo systemctl restart amavis clamav-daemon postfix