FUNIX

Mettez un manchot dans votre PC


Encourager FUNIX

La consultation du site est totalement libre et gratuite, sans publicités. Les dons sont néanmoins appréciés pour payer l'hébergement et encourager son auteur


Filtrer les mails avec SpamAssassin et ClamAV
[ Présentation de la configuration | filtrage basique avec procmail | filtrage anti-virus SpamAssassin , présentation , techniques et outils de filtrage ( filtrage heuristique, filtrage bayésien , DKIM, SPF ), installation ( SpamAssassin , razor, DCC, pyzor ) , configuration ( SpamAssassin  , interfaçage avec sendmail  , lancement automatique ) ,  fonctionnement ( prise en compte des spams , points divers ) | Mettre en place un anti virus ( Présentation  et installation , configuration , premiers tests , lancement automatique ,  interfaçage avec sendmail ) ]

Dernière modification 11 août 2024

Lutte anti spam et anti virus

Configuration Internet

( ce document est disponible au format pdf dans la rubrique téléchargement)

Présentation de la configuration

Depuis quelque temps, plus d'un email sur deux que je reçois est un spam ou contient un virus, la lutte anti spam et anti virus est donc devenue une nécessité car il devient vraiment pénible d'avoir sa boîte aux lettres polluée de "pourriels" en tout genre. La lutte est d'autant plus nécessaire si vous avez des utilisateurs sous windows qui sont des cibles privilégiées pour les virus.

Dans cette page sont présentées les outils des plus simples (et moins efficaces) aux plus sophistiqués (et plus efficaces mais moins faciles à mettre en place). On commencera par l'outil le plus simple:
procmail permet de filtrer avec des règles statiques des emails qui ont été déjà  délivrés par le serveur de mail local (MTA)
Les outils les plus sophistiqués sont
- SpamAssassin pour la lutte anti spam qui utilisent pour une meilleure efficacité trois autres outils du même genre à savoir Razor, Pyzor et DCC
- clam anti virus pour la lutte anti virus.

Ces deux derniers outils s'interfacent totalement avec sendmail ce qui permet un filtrage à  la source des emails sur votre réseau local sans que l'utilisateur final n'ait à  configurer quoi que ce soit.

Un schéma vaut mieux qu'un bon discours, voici comment ces outils s'intercalent dans le processus d'envoi et de réception des mails :





Pour la réception des mails et l'installation des serveurs POP, IMAP et du webmail on consultera cette page et cette autre page pour le MTA sendmail.

En mettant en place tous ces outils je peux vous garantir que vous aurez un excellent taux de rejet de "pourriels".


Filtrage basique avec procmail

procmail est une commande simple qui permet de faire beaucoup de choses. Il est très simple de définir des filtres. L'exemple ci-dessous  permet de supprimer les mails contenant dans le sujet I  Love You

 :0
  * ^Subject:.*ILOVEYOU
 /dev/null

Il suffit d'adapter cette règle en fonction du sujet (ou du from). Cette autre règle très utile permet de sauvegarder dans un fichier virus tous les mails arrivant avec les extensions qui y sont citées.

:0 H
*^Content-type: (multipart/mixed)
{
:0 B
*^Content-Disposition: (attachment|inline)
*filename=".*\.(ocx|vbs|wsf|shs|exe|com|bat|chm|pif|vbe|hta|scr)"
{
:0
virus
}
}

Le fichier virus pourra être ouvert en tant que boîte aux lettres avec un logiciel comme kmail. Le filtre suivant

:0
^Subject:.*[^ -~][^ -~][^ -~][^ -~]
/dev/null


supprime tous les mails dont le sujet commence par 4 caractères consécutifs non ASCII (cas particulier des mails écrits en asiatiques). Procmail est quand méme assez limité puisqu'il ne permet que de filtrer sur des règles précises (mot clef).

Filtrer les spams avec SpamAssassin

Présentation

SpamAssassin est un logiciel anti spam, il repose entre autres sur l'analyse heuristique et bayésienne des emails et utilise d'autres des techniques et outils anti spam comme pyzor, razor et DCC qui sont présentés ci-après

Techniques de filtrage

Le filtrage heuristique

C'est une technique qui permet d'identifier du spam en fonction de certaines caractéristiques communes (ponctuation, html, lien vers une image, ....)

Le filtrage bayésien

le filtrage bayésien repose sur le principe qu'un événement peut se produire en fonction des mêmes événements survenus précédemment. En clair pour le mail, si on rencontre certains mots ou phrases plus souvent dans du mail classé spam que dans du mail classé normal on peut penser que la prochaine fois qu'on rencontrera ces mêmes mots et phrases il y a de bonnes chances que ce soit dans un mail de spam.

Pour cela une base de données de mots et phrases est créée et enrichie au fur et à  mesure de la réception et de l'envoi de mails qui soient valides ou considérés comme spam. Chaque mot ou sentence reçoit une valeur calculée en fonction de la probabilité qu'il soit relié à  du spam, elle dépend du nombre de fois que le terme apparaît dans du spam par rapport au nombre de fois que le même terme est rencontré dans du courrier valide. Par conséquent certains mots pourront avoir une forte probabilité d'être rattaché à  du spam pour certains utilisateurs et pour d'autres pas, exemple concret une entreprise travaillant dans le domaine médical le terme "drug" aura une faible probabilité d'être rattaché à  du spam car il est très souvent employé dans les mails valides, pour d'autres personnes ce terme sera systématiquement rattaché à  du spams. Par conséquent le filtre bayésien a la particularité et l'avantage de s'adapter à  l'utilisateur, il réduit le risque des faux positifs (courrier valide considéré comme spam). Par ailleurs le filtre n'est pas statique, la base de donnée est en constante évolution et donc le filtre sera de plus en plus performant de jour en jour et s'adaptera en fonction des utilisateurs de votre réseau et des techniques nouvelles utilisées par les spammeurs.

Exemple concret du dernier point, jusqu'à  présent les spammeurs envoyaient des mails avec des mots du style "sex, free, viagra, ...", il était assez simple de mettre en place un filtre basé sur des mots clef pour supprimer les mails en question, les spammeurs ont donc modifié légèrement la sémantique de mots "s-e-x, f r e e" ou bien encore "v$i$a$g$r$a", avec un simple filtrage par mots clé, il est quasi impossible d'établir une règle efficace pour filtrer ces mails. Le filtre bayésien aura aucun problème pour lui attribuer une valeur de probabilité de spam élevée.

Autre avantage du filtre bayésien et non des moindres, il s'adapte à  toutes les langues.

En clair pour qu'un spammeur puisse tromper un filtre bayésien il doit connaître l'utilisateur qu'il veut toucher et éviter d'utiliser les mots que l'utilisateur en question utilise le moins...

[Retour haut de la page ]

DomainKeys Identified Mail (DKIM)

Le DKIM est une norme d'authentification qui garantit la fiabilité du nom de domaine de l'expéditeur d'un mail. Elle fonctionne sur la base d'une signature contenue dans le corps du mail. Exemple avec une signature DKIM d'un mail envoyé par leboncoin

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=news.leboncoin.fr;
        s=leboncoin; t=1723375141;
        bh=HAcQhfWcguB9ox41T/Matzz+tV45lns6A9KqbTYQ/78=;
        h=From:Subject:Date:To:MIME-Version:Message-ID:
         List-Unsubscribe-Post:List-Unsubscribe:Content-Type;
        b=pCqi9SNfg44gmKtLWTsgRQjnNm6oeWbiNzvFG0YhKoh/FvnnZwfBGl6hOCWxjUj4L
         67ejz/r3S1wHEeD5Z0VrQMPlEqPlc8b/yFZv4jX+7pUrWIeLUcZ1jDQABfRY3Kjgh1
         i/fvJHmYdjjGqoaXsu24hOsCWiR/35oYsRVpQDKF8nCAj05bRNB0VKyXzyZnf4gBKt
         lWGbiT4gNviIsBwloFY9Z6HZcZRbGfG+LnAbUYOEOyDSFOQMcc0AbMHRLH7z8gk10u
         PLdWf8JTakjCQVbQP0EmQekZwcprdeU3tukyisKGVrsuYeNtSFqUSibxJIT6PzIjia
         w/XAbguDMdq2A==

Pour vérifier l'authenticité du mail et de la signature, le système va la corréler en récupérant la clé publique de l'identifiant de domaine (on parle de SDID pour Signing Domain IDentifier).

SPF est une technique d'authentification de l'émetteur pour éviter l'usurpation de domaine, on vérifie si le nom de domaine est habilité à pouvoir envoyer un mail et on vérifie si son adresse IP est bien la bonne.

[Retour haut de la page ]

Installation

Installation de razor

Razor repose sur le principe d'un serveur central qui identifie les spams en leur attribuant une signature digitale. Chaque utilisateur de razor attribue une signature digitale à  chaque email reçu et la compare avec celles du serveur central, permettant ainsi le classement de l'email. Pour identifier les spammeurs, le serveur central  diffuse largement des emails valides pour recevoir un max de spams (uniquement du spam, pas de mails valides pour éviter les faux positifs), plus il en reçoit meilleur est razor !

Maintenant on va récupérer razor qui va compléter SpamAssassin dans la recherche de spam sur cet URL https://sourceforge.net/projects/razor/files/razor-agents/. On décompresse l'archive en tapant

tar xvfz razor-agents-2.85.tar.gz

Cela donne le répertoire razor-agents-2.85, avant d'aller plus loin il faudra installer en tant que root les modules de perl suivants

perl -MCPAN -e shell

Puis au prompt

install Digest::SHA1

install Digest::HMAC_MD5

Dans le répertoire razor-agents-2.85 on tape maintenant

perl Makefile.PL

Puis on édite le fichier Makefile pour mettre le bon chemin d'installation

INSTALL_BASE = /usr/local

et on tape make puis en tant que root

make install

Voilà  la trace de razor2 en tapant journalctl avec le mode debug de SpamAssassin

août 10 17:47:18 ultra.kervao.fr spamd[169810]: razor2: child process 171842 finished, reading results
août 10 17:47:18 ultra.kervao.fr spamd[169810]: razor2: part=0 engine=8 contested=0 confidence=0
août 10 17:47:18 ultra.kervao.fr spamd[169810]: razor2: part=1 engine=8 contested=0 confidence=0
août 10 17:47:18 ultra.kervao.fr spamd[169810]: razor2: results: spam? 0


(...)

août 10 17:47:21 ultra.kervao.fr spamd[169810]: timing: total 2261 ms - read_scoreonly_config: 15 (0.7%), signal_user_changed: 3.4 (0.2%), parse: 17 (0.8%), extract_message_metadata: 68 (3.0%), tests_pri_-10000: 67 (3.0%), get_uri_detail_list: 65 (2.9%), tests_pri_-2000: 10 (0.4%), tests_pri_-1000: 2.9 (0.1%), tests_pri_-2000: 10 (0.4%), tests_pri_-1000: 2.9 (0.1%), tests_pri_-950: 1.56 (0.1%), tests_pri_-900: 1.60 (0.1%), tests_pri_-100: 241 (10.6%), check_spf: 20 (0.9%), poll_dns_idle: 15 (0.7%), check_dkim_signature: 19 (0.8%), check_pyzor: 5 (0.2%), check_razor2: 1439 (63.7%), tests_pri_-90: 2.8 (0.1%), tests_pri_0: 326 (14.4%), tests_pri_500: 2.6 (0.1%), rewrite_mail: 1.86 (0.1%), copy_config: 27 (1.2%)

en cas de réponse positive pour un spam

août 11 12:21:53 ultra.kervao.fr spamd[422090]: razor2: child process 422176 finished, reading results
août 11 12:21:53 ultra.kervao.fr spamd[422090]: razor2: part=0 engine=8 contested=0 confidence=100
août 11 12:21:53 ultra.kervao.fr spamd[422090]: razor2: results: spam? 1
août 11 12:21:53 ultra.kervao.fr spamd[422090]: razor2: results: engine 8, highest cf score: 100

J'en déduis que razor2 marche correctement, en revanche si on a cette erreur

sept. 29 17:10:14 ultra.kervao.fr spamd[657127]: razor2: razor2 check failed: Connection reset by peer razor2: razor2 had unknown error during check at /usr/local/share/perl5/5.36/Mail/SpamAssassin/Plugin/Razor2.pm line 230, <GEN60> line 1. at /usr/local/share/perl5/5.36/Mail/SpamAssassin/Plugin/Razor2.pm line 350.

on va créer le répertoire suivant

mkdir /etc/mail/spamassassin/razor

puis on tapera la commande suivante

razor-admin -home=/etc/mail/spamassassin/razor -register

voilà le résultat

Register successful.  Identity stored in /etc/mail/spamassassin/razor/identity-ruX-WiLff-

on tape ensuite

razor-admin -home=/etc/mail/spamassassin/razor -create

razor-admin -home=/etc/mail/spamassassin/razor -discover

sous le répertoire /etc/mail/spamassassin/razor on retrouvera ces fichiers

lrwxrwxrwx 1 root root   19 sept. 29 17:19 identity -> identity-ruX-WiLff-
-rw------- 1 root root   90 sept. 29 17:19 identity-ruX-WiLff-
-rw-r--r-- 1 root root  706 sept. 29 17:20 razor-agent.conf
-rw-r--r-- 1 root root 1018 sept. 29 17:20 razor-agent.log
-rw-r--r-- 1 root root  785 sept. 29 17:19 server.n002.cloudmark.com.conf
-rw-r--r-- 1 root root   57 sept. 29 17:20 servers.catalogue.lst
-rw-r--r-- 1 root root   30 sept. 29 17:20 servers.discovery.lst
-rw-r--r-- 1 root root   76 sept. 29 17:20 servers.nomination.lst



Installation de SpamAssassin

On récupérera SpamAssassin sur le site www.spamassassin.org/. On décompresse l'archive en tapant

tar xvfz Mail-SpamAssassin-4.0.1.tar.gz

Cela donne le répertoire Mail-SpamAssassin-4.0.1. Avant d'aller plus loin j'ai dû installer les packages

urpmi perl-devel perl-Net-DNS perl-NetAddr-IP perl-Archive-Tar perl-Mail-SPF perl-IP-Country perl-Net-Ident perl-IO-Socket-INET6 perl-Mail-DKIM perl-DBI perl-Encode-Detect perl-Geo-IP perl-Archive-Zip perl-Net-Patricia  perl-IO-String perl-BSD-Resource re2c perl-Email-Address-XS perl-Net-LibIDN perl-DBD-SQLite perl-Devel-Cycle perl-Text-Diff perl-Moo perl-MooX-StrictConstructor perl-Email-MIME

pour pouvoir bénéficier de la géolocalisation des adresses IP on installera MaxMind comme expliqué ici  et on tapera ensuite la commande (sans être root)

perl -MCPAN -e shell

et dans le shell

install Net::LibIDN2
install MaxMind::DB::Reader
install MaxMind::DB::Reader::XS
install IP::Country::DB_File
install Mail::DMARC

install Mail::DMARC::PurePerl

cela va créer un certain nombre de répertoire sous ~/perl5 de votre user qu'il faudra rendre accessible à tous en les copiant sous /usr/lib64/perl5

Maintenant revenons dans le répertoire Mail-SpamAssassin-4.0.1 où l'on tape

perl Makefile.PL PREFIX=/usr/local SYSCONFDIR=/etc

Voilà le résultat

What email address or URL should be used in the suspected-spam report
text for users who want more information on your filter installation?
(In particular, ISPs should change this to a local Postmaster contact)
default text: [the administrator of that system] olivier

NOTE: settings for "make test" are now controlled using "t/config.dist".
See that file if you wish to customize what tests are run, and how.

checking module dependencies and their versions...
checking binary dependencies and their versions...
dependency check complete...

Warning: prerequisite Perl::Critic::Policy::Perlsecret 0 not found.
Warning: prerequisite Perl::Critic::Policy::TestingAndDebugging::ProhibitNoStrict 0 not found.
Generating a Unix-style Makefile
Writing Makefile for Mail::SpamAssassin
Writing MYMETA.yml and MYMETA.json
Makefile written by ExtUtils::MakeMaker 7.64

On édite le fichier Makefile pour mettre les chemins d'installation qui vont bien

INSTALL_BASE = /usr/local
SYSCONFDIR = /etc
INSTALLCONF = /etc/mail/spamassassin
INSTALLSITECONF = /etc/mail/spamassassin
I_CONFDIR = /etc/mail/spamassassin

on tape ensuite

make

Puis en tant que  root

make install


Installation de DCC

DCC repose également sur un serveur central, chaque mail reçu reçoit une signature digitale, le serveur comptabilise toutes les signatures, plus le nombre d'une signature est élevé sur le serveur plus le risque que ce soit un spam est élevé.
Concrètement, à  la réception d'un mail le client DCC lui attribue une signature digitale (checksum), récupère sur le serveur le nombre de fois que cette signature apparaît dans le serveur central, si ce nombre dépasse une certaine valeur configurable (threshold) et que l'expéditeur du mail en question n'est pas dans la whitelist (configurable elle aussi), le mail est considéré comme spam et traité comme tel.

On va étoffer encore SpamAssassin avec DCC qu'on récupérera ici http://www.rhyolite.com/anti-spam/dcc/. On décompresse l'archive en tapant

tar xvfz dcc.tar.Z

Cela donne le répertoire dcc-2.3.169. Pensez maintenant à  installer le package sendmail-devel, on revient dans le répertoire de DCC dans lequel on tape successivement

./configure
make

Puis en tant que root

make install

Maintenant si on tape

cdcc 'info'

On obtient

# 08/10/24 08:43:18 CEST  /var/dcc/map
# Re-resolve names after 09:15:17  Check RTTs after 08:58:17
# 1270.85 ms threshold, 1237.84 ms average    12 total, 11 working servers
IPv6 on   version=3

dcc1.dcc-servers.net,-      RTT+1000 ms  anon
#  72.18.213.52,-                                      x.dcc-servers ID 104
#     100% of 32 requests ok  438.56+1000 ms RTT       300 ms queue wait
# *137.208.8.63,-                                             wuwien ID 1290
#     100% of 32 requests ok  138.30+1000 ms RTT       100 ms queue wait
#  193.30.34.11,-                                     www.nova53.net ID 1204
#     100% of 32 requests ok  170.85+1000 ms RTT        70 ms queue wait

dcc2.dcc-servers.net,-      RTT+1000 ms  anon
#  194.119.212.6,-                                              dcc1 ID 1182
#     100% of 32 requests ok  973.70+1000 ms RTT       100 ms queue wait
#  204.90.71.235,-                                       MGTINTERNET ID 1170
#     100% of 32 requests ok  195.75+1000 ms RTT       100 ms queue wait

dcc3.dcc-servers.net,-      RTT+1000 ms  anon
#  72.18.213.53,-                                      x.dcc-servers ID 104
#     100% of 32 requests ok  440.12+1000 ms RTT       300 ms queue wait
#  208.88.55.138,-                                                   ID 1006
#     100% of 32 requests ok 1075.27+1000 ms RTT       500 ms queue wait

dcc4.dcc-servers.net,-      RTT+1000 ms  anon
#  72.18.213.51,-                                      x.dcc-servers ID 104
#     100% of 32 requests ok  441.90+1000 ms RTT       300 ms queue wait
#  212.223.102.90,-                                                  ID 1480
#      88% of 32 requests ok 1540.71+1000 ms RTT      1200 ms queue wait

dcc5.dcc-servers.net,-      RTT+1000 ms  anon
#  157.131.0.46,-                                              sonic ID 1255
#     100% of 32 requests ok  257.89+1000 ms RTT       100 ms queue wait
#  193.30.34.14,-                                     www.nova53.net ID 1207
#     100% of 32 requests ok  232.64+1000 ms RTT       130 ms queue wait

@,-                         RTT-1000 ms  32768 secret114454481y1031
#  127.0.0.1,-                                    
#      not answering

################
# 08/10/24 08:43:18 CEST  greylist /var/dcc/map
# Re-resolve names after 10:43:17 
# 1 total, 0 working servers
# continue not asking greylist server 32 seconds after 1 failures

@,-                         Greylist 32768 secret114454481y1031
# *127.0.0.1,6276                                 
#      not answering

Le répertoire par défaut se trouve sous /var/dcc. les serveurs par défaut se trouvent dans le fichier /var/dcc/map, il est automatiquement créé à  l'installation à  partir du fichier dcc-2.3.169/homedir/map.txt. Dans ce dernier répertoire on trouve également le fichier whitelist, pour avoir la syntaxe il faut jeter un coup d’œil dans le fichier whitecommon.

En upgradant d'une version précédente j'ai eu droit à  l'erreur suivante

open(/var/dcc/map): Too many open files
open(/tmp/map1MdBL2): Too many open files
 ?

Je n'ai eu d'autres choix que de supprimer /var/run/dcc et de refaire un make install.

Voilà la trace de DCC en tapant journalctl en mode debug de SpamAssassin

août 11 10:08:08 ultra.kervao.fr spamd[233885]: util: executable for cdcc was found at /usr/local/bin/cdcc
août 11 10:08:08 ultra.kervao.fr spamd[233885]: dcc: dcc_pgm_path, found cdcc in env.path: /usr/local/bin/cdcc
août 11 10:08:08 ultra.kervao.fr spamd[233885]: dcc: `/usr/local/bin/cdcc -qV homedir libexecdir` reports '2.3.169 homedir=/var/dcc libexecdir=/var/dcc/libexec'
août 11 10:08:08 ultra.kervao.fr spamd[233885]: dcc: use 'dcc_libexec /var/dcc/libexec' from cdcc
août 11 10:08:08 ultra.kervao.fr spamd[233885]: dcc: use 'dcc_home /var/dcc' from cdcc
août 11 10:08:08 ultra.kervao.fr spamd[233885]: dcc: dccifd is not available; no r/w socket at /var/dcc/dccif

(...)

août 11 12:52:05 ultra.kervao.fr spamd[422090]: timing: total 7617 ms - read_scoreonly_config: 128 (1.7%), signal_user_changed: 2.0 (0.0%), parse: 6 (0.1%), extract_message_metadata: 49 (0.6%), tests_pri_-10000: 16 (0.2%), get_uri_detail_list: 29 (0.4%), tests_pri_-2000: 5 (0.1%), tests_pri_-1000: 2.8 (0.0%), tests_pri_-950: 1.48 (0.0%), tests_pri_-900: 1.72 (0.0%), tests_pri_-100: 4623 (60.7%), check_spf: 42 (0.6%), poll_dns_idle: 52 (0.7%), check_dkim_signature: 36 (0.5%), check_dcc: 4312 (56.6%), check_razor2: 1429 (18.8%), check_pyzor: 66 (0.9%), tests_pri_-90: 35 (0.5%), check_bayes: 31 (0.4%), b_tokenize: 14 (0.2%), b_tok_get_all: 7 (0.1%), b_comp_prob: 5 (0.1%), b_tok_touch_all: 0.57 (0.0%), b_finish: 2.4 (0.0%), tests_pri_0: 210 (2.8%), tests_pri_10: 6 (0.1%), tests_pri_500: 2.8 (0.0%), tests_pri_1000: 91 (1.2%), total_awl: 88 (1.2%), check_awl: 35 (0.5%),update_awl: 0.36 (0.0%), learn: 851 (11.2%), b_learn: 832 (10.9%), b_count_change: 23 (0.3%), rewrite_mail: 3.0 (0.0%), copy_config: 59 (0.8%)

Où on voit bien le check_dcc

Installation de pyzor

Pyzor repose sur le même principe que razor, c'est normal puisque le premier est issu du second et réécrit en python. Cela ne signifie pas qu'il marche exactement de la même manière en utilisant les mêmes serveurs, il a évolué différemment et les deux se complétent très bien.

pyzor s'interface également avec SpamAssassin, on le trouvera ici https://github.com/SpamExperts/pyzor, la dernière version est la 1.0.0 qui me générait dans les logs de SpamAssassin le message suivant

pyzor: internal error, python traceback seen in response: Traceback (most recent call last):

j'ai dû installer la version en développement, on décompresse l'archive en tapant

unzip pyzor-master.zip

Cela donne le répertoire pyzor-master dans lequel on tape

python setup.py build

il faudra sans doute installer préalablement le package python-setuptools

On passe root puis on tape

python setup.py install

voilà la trace de pyzor en tapant journalctl en mode debug de SpamAssassin

août 11 07:33:05 ultra.kervao.fr spamd[231738]: util: executable for pyzor was found at /usr/local/bin/pyzor
août 11 07:33:05 ultra.kervao.fr spamd[231738]: pyzor: pyzor is available: /usr/local/bin/pyzor

août 10 18:17:30 ultra.kervao.fr spamd[169810]: pyzor: child process 172014 finished, reading results
août 10 18:17:30 ultra.kervao.fr spamd[169810]: pyzor: got response: public.pyzor.org:24441\t(200, 'OK')\t0\t0
août 10 18:17:30 ultra.kervao.fr spamd[169810]: pyzor: result: COUNT=0/5 WELCOMELIST=0/10/0.0
août 10 18:17:30 ultra.kervao.fr spamd[169810]: check: tagrun - tag PYZOR is now ready, value: Reported 0 times, welcomelisted 0 times.

(...)

oct. 10 08:16:09 mana.kervao.fr spamd[1672]: timing: total 6413 ms - read_scoreonly_config: 1.53 (0.0%), signal_user_changed: 2.2 (0.0%), parse: 1.96 (0.0%), extract_message_metadata: 55 (0.9%), get_uri_detail_list: 2.5 (0.0%), tests_pri_-1000: 50 (0.8%), tests_pri_-950: 2.00 (0.0%), tests_pri_-900: 2.1 (0.0%), tests_pri_-400: 19 (0.3%), check_bayes: 16 (0.3%), b_tokenize: 6 (0.1%), b_tok_get_all: 3.5 (0.1%), b_comp_prob: 3.8 (0.1%), b_tok_touch_all: 0.38 (0.0%), b_finish: 1.53 (0.0%), tests_pri_0: 6179 (96.4%), check_spf: 17 (0.3%), poll_dns_idle: 0.17 (0.0%), check_dkim_signature: 0.71 (0.0%), check_dkim_adsp: 30 (0.5%), check_dcc: 4302 (67.1%), check_pyzor: 170 (2.6%), check_razor2: 1599 (24.9%), tests_pri_500: 10 (0.2%), tests_pri_1000: 6 (0.1%), total_awl: 4.1 (0.1%), check_awl: 0.36 (0.0%), update_awl: 0.21 (0.0%), learn: 6 (0.1%), b_learn: 2.6 (0.0%), rewrite_mail: 1.73 (0.0%), get_report: 0.58 (0.0%), copy_config: 39 (0.6%)

Où on voit bien le check_pyzor

Configuration de SpamAssassin

Revenons à  SpamAssassin, les fichiers de configuration se trouvent sous /etc/mail/spamassassin, on trouve init.pre qui est d'abord lu, puis les fichiers spécifiques à des versions (v310.pre, v312.pre, v320.pre, v330.pre, v340.pre, v343.pre à v401.pre) à noter que tous les fichiers sont lus, d'une version à une autre on retrouve que les nouvelles fonctionnalités implémentées dans les dernières versions, et enfin le configuration local local.cf.

Voilà le contenu du fichier init.pre

# RelayCountry - add metadata for Bayes learning, marking the countries
# a message was relayed through
#
# Note: This requires the Geo::IP Perl module
#
loadplugin Mail::SpamAssassin::Plugin::RelayCountry

# URIDNSBL - look up URLs found in the message against several DNS
# blocklists.
#
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL

# Hashcash - perform hashcash verification.
#
loadplugin Mail::SpamAssassin::Plugin::Hashcash

# SPF - perform SPF verification.
#
loadplugin Mail::SpamAssassin::Plugin::SPF


Voilà  mon fichier de configuration v310.pre qu'on trouvera sous /etc/mail/spamassassin

# DCC - perform DCC message checks.
#
# DCC is disabled here because it is not open source.  See the DCC
# license for more details.
#
loadplugin Mail::SpamAssassin::Plugin::DCC

# Pyzor - perform Pyzor message checks.
#
loadplugin Mail::SpamAssassin::Plugin::Pyzor

# Razor2 - perform Razor2 message checks.
#
loadplugin Mail::SpamAssassin::Plugin::Razor2

# SpamCop - perform SpamCop message reporting
#
loadplugin Mail::SpamAssassin::Plugin::SpamCop

# AntiVirus - some simple anti-virus checks, this is not a replacement
# for an anti-virus filter like Clam AntiVirus
#
loadplugin Mail::SpamAssassin::Plugin::AntiVirus

# AWL - do auto-whitelist checks
#
loadplugin Mail::SpamAssassin::Plugin::AWL

# AutoLearnThreshold - threshold-based discriminator for Bayes auto-learning
#
loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold

# TextCat - language guesser
# on activera ce plugin pour filtrer les mails écrits en chinois ou arabe ou autres
loadplugin Mail::SpamAssassin::Plugin::TextCat

# AccessDB - lookup from-addresses in access database
#
#loadplugin Mail::SpamAssassin::Plugin::AccessDB

# WhitelistSubject - Whitelist/Blacklist certain subject regular expressions
#
loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject

###########################################################################
# experimental plugins

# DomainKeys - perform DomainKeys verification
#
# This plugin has been removed as of v3.3.0.  Use the DKIM plugin instead,
# which supports both Domain Keys and DKIM.

# MIMEHeader - apply regexp rules against MIME headers in the message
#
loadplugin Mail::SpamAssassin::Plugin::MIMEHeader

# ReplaceTags
#
loadplugin Mail::SpamAssassin::Plugin::ReplaceTags

le fichier v312.pre

###############################################
# experimental plugins

# DKIM - perform DKIM verification
#
# Mail::DKIM module required for use, see INSTALL for more information.
#
# Note that if C<Mail::DKIM> version 0.20 or later is installed, this
# renders the DomainKeys plugin redundant.
#
loadplugin Mail::SpamAssassin::Plugin::DKIM

le fichier v320.pre

# Check - Provides main check functionality
#
loadplugin Mail::SpamAssassin::Plugin::Check

# HTTPSMismatch - find URI mismatches between href and anchor text
#
loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch

# URIDetail - test URIs using detailed URI information
#
loadplugin Mail::SpamAssassin::Plugin::URIDetail

# Shortcircuit - stop evaluation early if high-accuracy rules fire
#
loadplugin Mail::SpamAssassin::Plugin::Shortcircuit

# Plugins which used to be EvalTests.pm
# broken out into separate plugins
loadplugin Mail::SpamAssassin::Plugin::Bayes
loadplugin Mail::SpamAssassin::Plugin::BodyEval
loadplugin Mail::SpamAssassin::Plugin::DNSEval
loadplugin Mail::SpamAssassin::Plugin::HTMLEval
loadplugin Mail::SpamAssassin::Plugin::HeaderEval
loadplugin Mail::SpamAssassin::Plugin::MIMEEval
loadplugin Mail::SpamAssassin::Plugin::RelayEval
loadplugin Mail::SpamAssassin::Plugin::URIEval
loadplugin Mail::SpamAssassin::Plugin::WLBLEval

# VBounce - anti-bounce-message rules, see rules/20_vbounce.cf
#
loadplugin Mail::SpamAssassin::Plugin::VBounce

# Rule2XSBody - speedup by compilation of ruleset to native code
#
# loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody

# ASN - Look up the Autonomous System Number of the connecting IP
# and create a header containing ASN data for bayes tokenization.
# See plugin's POD docs for usage info.
#
# loadplugin Mail::SpamAssassin::Plugin::ASN

# ImageInfo - rules to match metadata of image attachments
#
loadplugin Mail::SpamAssassin::Plugin::ImageInfo


le fichier v330.pre

###################################################

# PhishTag - allows sites to rewrite suspect phish-mail URLs
# (Note: this requires configuration, see http://umut.topkara.org/PhishTag)
#
#loadplugin Mail::SpamAssassin::Plugin::PhishTag

# FreeMail - detect email addresses using free webmail services,
# usable as input for other rules
#

loadplugin Mail::SpamAssassin::Plugin::FreeMail

le fichier v340.pre

# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
# This file was installed during the installation of SpamAssassin 3.4.0,
# and contains plugin loading commands for the new plugins added in that
# release.  It will not be overwritten during future SpamAssassin installs,
# so you can modify it to enable some disabled-by-default plugins below,
# if you so wish.
#
# There are now multiple files read to enable plugins in the
# /etc/mail/spamassassin directory; previously only one, "init.pre" was
# read.  Now both "init.pre", "v310.pre", and any other files ending in
# ".pre" will be read.  As future releases are made, new plugins will be
# added to new files, named according to the release they're added in.
###########################################################################

# AskDNS - forms a DNS query based on 'tags' as supplied by other plugins
#
loadplugin Mail::SpamAssassin::Plugin::AskDNS

le fichier v341.pre

# TxRep - Reputation database that replaces AWL
# loadplugin Mail::SpamAssassin::Plugin::TxRep

# URILocalBL - Provides ISP and Country code based filtering as well as
# quick IP based blocks without a full RBL implementation - Bug 7060

# loadplugin Mail::SpamAssassin::Plugin::URILocalBL

# PDFInfo - Use several methods to detect a PDF file's ham/spam traits
# loadplugin Mail::SpamAssassin::Plugin::PDFInfo

le fichier v342.pre

# FromNameSpoof - help stop spam that tries to spoof other domains using
# the from name
loadplugin Mail::SpamAssassin::Plugin::FromNameSpoof

# Phishing - finds uris used in phishing campaigns detected by
# OpenPhish or PhishTank feeds.
loadplugin Mail::SpamAssassin::Plugin::Phishing

le fichier v343.pre n'a aucun aucun loadplugin activé, contenu de v400pre

# ExtractText - Extract text from documents or images for matching
#
# Requires manual configuration, see plugin documentation.
#
# loadplugin Mail::SpamAssassin::Plugin::ExtractText

# DecodeShortUrl - Check for shortened URLs
#
# Note that this plugin will send HTTP requests to different URL shortener
# services.  Enabling caching is recommended, see plugin documentation.
#
# loadplugin Mail::SpamAssassin::Plugin::DecodeShortURLs

# DMARC - Check DMARC compliance
#
# Requires Mail::DMARC module and working SPF and DKIM Plugins.
#
loadplugin Mail::SpamAssassin::Plugin::DMARC

et voilà mon fichier local.cf

allow_user_rules 1
#   Add *****SPAM***** to the Subject header of spam e-mails
#
rewrite_header Subject *****SPAM*****


#   Save spam messages as a message/rfc822 MIME attachment instead of
#   modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 1

# rajout de cette option pour bien prendre en compte
# les accents dans le rapport spamassassin
report_charset iso-8859-1

#   Set which networks or hosts are considered 'trusted' by your mail
#   server (i.e. not spammers)
#
# trusted_networks 212.17.35.


#   Set file-locking method (flock is not safe over NFS, but is faster)
#
# lock_method flock


#   Set the threshold at which a message is considered spam (default: 5.0)
#
required_score 5.0
score USER_IN_WELCOMELIST -100.0
score USER_IN_BLOCKLIST 100.0
use_auto_whitelist 1
#use_txrep 1

# pour filtrer les mails en chinois
# on autorise que ces langues, les autres sont
# considérés comme spam avec un score de 10
ok_languages en fr ca de es it pt
score UNWANTED_LANGUAGE_BODY 10
add_header all Languages _LANGUAGES_

#   Use Bayesian classifier (default: 1)
#
use_bayes 1
use_bayes_rules 1


#   Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn 1
#bayes_auto_learn_threshold_nonspam -2.0
bayes_auto_learn_threshold_spam 6.0

header AWL             eval:check_from_in_auto_whitelist()
describe AWL           From: address is in the auto white-list
tflags AWL             userconf noautolearn
priority AWL           1000

#header         TXREP   eval:check_senders_reputation()
#describe       TXREP   Score normalizing based on sender's reputation
#tflags         TXREP   userconf noautolearn
#priority       TXREP   1000

#tflags URIBL_DBL_SPAM autolearn_force
#tflags URIBL_JP_SURBL autolearn_force
#tflags URIBL_BLACK autolearn_force
#tflags INVALID_DATE autolearn_force

#   Set headers which may provide inappropriate cues to the Bayesian
#   classifier
#
# bayes_ignore_header X-Bogosity
# bayes_ignore_header X-Spam-Flag
# bayes_ignore_header X-Spam-Status

bayes_path /var/spool/mail/.spamassassin/bayes
bayes_file_mode 0777

#   Whether to decode non- UTF-8 and non-ASCII textual parts and recodeA
#
#   them to UTF-8 before the text is given over to rules processing.
#
# normalize_charset 1

#   Some shortcircuiting, if the plugin is enabled
#
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
#
#   default: strongly-whitelisted mails are *really* whitelisted now, if the
#   shortcircuiting plugin is active, causing early exit to save CPU load.
#   Uncomment to turn this on
#
shortcircuit USER_IN_WELCOMELIST       on
# shortcircuit USER_IN_DEF_WHITELIST   on
# shortcircuit USER_IN_ALL_SPAM_TO     on
# shortcircuit SUBJECT_IN_WHITELIST    on

#   the opposite; blacklisted mails can also save CPU
#
shortcircuit USER_IN_BLOCKLIST       on
# shortcircuit USER_IN_BLACKLIST_TO    on
# shortcircuit SUBJECT_IN_BLACKLIST    on

#   if you have taken the time to correctly specify your "trusted_networks",
#   this is another good way to save CPU
#
# shortcircuit ALL_TRUSTED             on

#   and a well-trained bayes DB can save running rules, too
#
# shortcircuit BAYES_99                spam
# shortcircuit BAYES_00                ham

#endif

et pour terminer le fichier v401.pre avec un plugin que je n'ai pas activé

# loadplugin Mail::SpamAssassin::Plugin::AuthRes

A noter le chemin bayes_path on doit mettre ici le chemin où sera stockée la base de données du filtrage bayésien, comme c'est l'utilisateur mail qui est propriétaire du process et que sa homedirectory est fixée à  /var/spool/mail, j'ai fixé la variable pour pointer vers cet endroit. Si vous voulez placer ces fichiers ailleurs, n'oubliez pas que l'utilisateur mail (ou celui propriétaire du process) doit avoir les droits en accés et écriture sur le répertoire en question.
A noter également USER_IN_WELCOMELIST avec un score à -100 si le mail est dans la whitelist et a contrario à +100 s'il est dans la blacklist.

J'ai eu un soucis quand je récupérais les mails de mes utilisateurs, l'utilisateur mail ne pouvant créer de fichier dans leur homedirectory

Oct  2 09:58:53 tosh spamd[1676]: debug: open of AWL file failed: lock: 1676 cannot create tmp lockfile /home/olivier/.spamassassin/auto-whitelist.lock.tosh.kervao.fr.1676 for /home/olivier/.spamassassin/auto-whitelist.lock: Permission denied

Pour résoudre cela, le répertoire .spamassassin de tous mes utilisateurs (à  créer éventuellement) appartient à  l'utilisateur mail ou de mettre les droits à 777. Pour info AWL (autowhitelist) permet de mettre un score aux adresses email que vous utilisez le plus pour mieux démarquer vos interlocuteurs habituels et les autres.

La configuration n'est pas simple car elle est dispersée dans plusieurs fichiers, un moyen simple de voir quels plugins sont chargés est de taper:

grep -i loadplugin *pre

cela va donner (de manière exhaustive)

init.pre:loadplugin Mail::SpamAssassin::Plugin::RelayCountry
init.pre:loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
init.pre:loadplugin Mail::SpamAssassin::Plugin::SPF
v310.pre:loadplugin Mail::SpamAssassin::Plugin::DCC
v310.pre:loadplugin Mail::SpamAssassin::Plugin::Pyzor
v310.pre:loadplugin Mail::SpamAssassin::Plugin::Razor2
v310.pre:loadplugin Mail::SpamAssassin::Plugin::SpamCop
v310.pre:loadplugin Mail::SpamAssassin::Plugin::AntiVirus
v310.pre:loadplugin Mail::SpamAssassin::Plugin::AWL
v310.pre:loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
v310.pre:loadplugin Mail::SpamAssassin::Plugin::TextCat
v310.pre:#loadplugin Mail::SpamAssassin::Plugin::AccessDB
v310.pre:loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
v310.pre:loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
v310.pre:loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
v312.pre:loadplugin Mail::SpamAssassin::Plugin::DKIM
v320.pre:loadplugin Mail::SpamAssassin::Plugin::Check
v320.pre:loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
v320.pre:loadplugin Mail::SpamAssassin::Plugin::URIDetail
v320.pre:loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
v320.pre:loadplugin Mail::SpamAssassin::Plugin::Bayes
v320.pre:loadplugin Mail::SpamAssassin::Plugin::BodyEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::DNSEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::HTMLEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::HeaderEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::MIMEEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::RelayEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::URIEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::WLBLEval
v320.pre:loadplugin Mail::SpamAssassin::Plugin::VBounce
v320.pre:# loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody
v320.pre:# loadplugin Mail::SpamAssassin::Plugin::ASN
v320.pre:loadplugin Mail::SpamAssassin::Plugin::ImageInfo
v330.pre:#loadplugin Mail::SpamAssassin::Plugin::PhishTag
v330.pre:loadplugin Mail::SpamAssassin::Plugin::FreeMail
v340.pre:loadplugin Mail::SpamAssassin::Plugin::AskDNS
v341.pre:# loadplugin Mail::SpamAssassin::Plugin::TxRep
v341.pre:# loadplugin Mail::SpamAssassin::Plugin::URILocalBL
v341.pre:# loadplugin Mail::SpamAssassin::Plugin::PDFInfo
v342.pre:# loadplugin Mail::SpamAssassin::Plugin::HashBL
v342.pre:# loadplugin Mail::SpamAssassin::Plugin::ResourceLimits
v342.pre:loadplugin Mail::SpamAssassin::Plugin::FromNameSpoof
v342.pre:loadplugin Mail::SpamAssassin::Plugin::Phishing
v343.pre:# loadplugin Mail::SpamAssassin::Plugin::OLEVBMacro
v400.pre:# loadplugin Mail::SpamAssassin::Plugin::ExtractText
v400.pre:# loadplugin Mail::SpamAssassin::Plugin::DecodeShortURLs
v400.pre:loadplugin Mail::SpamAssassin::Plugin::DMARC

ceux qui ne sont pas chargés sont précédés d'un #.

Interfaçage avec sendmail

SpamAssassin s'interface facilement avec sendmail, le filtrage s'opère aussi bien à  la réception qu'à  l'envoi d'email de manière totalement transparente ou presque, car il faut savoir que SpamAssassin est assez gourmand en ressource et que ça ralentit beaucoup la réception et l'envoi de mails.

On va récupérer ensuite une "rustine" pour que SpamAssassin puisse s'interfacer avec sendmail sur le site http://savannah.nongnu.org/projects/spamass-milt. Avant d'aller plus loin, il faudra installer le package sendmail-devel si ce n'est pas déjà  fait. On décompresse l'archive en tapant

tar xvfz spamass-milter-0.4.0.tar.gz

Cela donne le répertoire spamass-milter-0.4.0 dans le quel on tape successivement

./configure
make

Puis en tant que root

make install

Tout d'abord on doit lancer le daemon SpamAssassin en tant que root

spamd -d  -D -u mail -H /var/spool/mail

-d mode daemon
-D mode debug (optionnel, utile au tout début)
-u mail l'utilisateur mail sera propriétaire du process.
-H le répertoire où se trouve la base de données bayésienne

Toujours en tant que root on lance spamass-milter en tapant

spamass-milter -u mail -p /var/run/spamass.sock -f

On modifie à  présent le fichier de configuration de sendmail, en supposant qu'il soit sous /usr/share/sendmail-cf/cf et qu'il s'appelle config.mc

cd /usr/share/sendmail-cf/cf

On rajoute à  la fin les lignes suivantes

INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
define(`confMILTER_MACROS_CONNECT',`t, b, j, _, {daemon_name}, {if_name}, {if_addr}')dnl
define(`confMILTER_MACROS_HELO',`s, {tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}')dnl
define(`confMILTER_MACROS_ENVFROM',`i, {auth_authen}, {auth_type}')dnl
define(`confMILTER_MACROS_ENVRCPT',`r, v, Z')dnl

on génère un nouveau fichier de configuration de sendmail en tapant

m4 config.mc > /etc/mail/sendmail.cf

dans ce fichier au niveau de

# Milter options
#O Milter.LogLevel
O Milter.macros.connect=t, b, j, _, {daemon_name}, {if_name}, {if_addr}
O Milter.macros.helo=s, {tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}
O Milter.macros.envfrom=i, {auth_authen}, {auth_type}
O Milter.macros.envrcpt=r, v, Z
O Milter.macros.eom={msg_id}
#O Milter.macros.eoh
#O Milter.macros.data

on modifie ainsi

# Milter options
#O Milter.LogLevel
O Milter.macros.connect=t, b, j, _, {daemon_name}, {if_name}, {if_addr}
O Milter.macros.helo=s, {tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}
O Milter.macros.envfrom=i
O Milter.macros.envfrom=i, {auth_authen}, {auth_type}
O Milter.macros.envrcpt=r, v, Z
O Milter.macros.eom={msg_id}
#O Milter.macros.eoh
#O Milter.macros.data

cette modification est utile pour éviter ce genre d'erreur

spamass-milter[2246]: Could not retrieve sendmail macro "i"!.  Please add it to confMILTER_MACROS_ENVFROM for better spamassassin results


On relance sendmail

systemctl stop sendmail
systemctl start sendmail


Lancement automatique

Pour un lancement automatique de spamd et spamass-milter on créera le fichier spamassassin.service qu'on place sous /usr/lib/systemd/system/ voilà son contenu

[Unit]
Description=Spamassassin daemon
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/spamd -d  -D -u mail -H /var/spool/mail --pidfile /var/run/spamd.pid

[Install]
WantedBy=multi-user.target  
 
à noter que l'option -D correspond au mode debug facultatif, maintenant pour que le service soit lancé à chaque boot de la machine il faudra taper

systemctl enable spamassassin.service

voillà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/spamassassin.service to /usr/lib/systemd/system/spamassassin.service.

pour le lancer il suffit maintenant de taper

systemctl  start spamassassin.service

A noter que si lors d'un upgrade vous obtenez l'erreur suivante avec la commande suivante

oct. 04 20:59:54 mana.kervao.fr spamd[1634]: config: no rules were found! Do you need to run 'sa-update'?
oct. 04 20:59:55 mana.kervao.fr spamd[1516]: child process [1634] exited or timed out without signaling production of a PID file: exit 25...ne 2989.

il faudra penser à taper d'abord sa-update voilà ce que donne la commande suivante systemctl status spamassassin

● spamassassin.service - Spamassassin daemon
     Loaded: loaded (/usr/lib/systemd/system/spamassassin.service; enabled; preset: disabled)
     Active: active (running) since Sat 2024-08-10 08:26:24 CEST; 5s ago
    Process: 96542 ExecStart=/usr/local/bin/spamd -d -u mail -H /var/spool/mail --pidfile /var/run/spamd.pid (code=exited, status=0/SUCCESS)
   Main PID: 96544 (spamd)
      Tasks: 3 (limit: 9239)
     Memory: 137.6M
        CPU: 2.907s
     CGroup: /system.slice/spamassassin.service
             ├─96544 spamd
             ├─96548 "spamd child"
             └─96549 "spamd child"

août 10 08:26:21 ultra.kervao.fr systemd[1]: Starting spamassassin.service...
août 10 08:26:21 ultra.kervao.fr spamd[96542]: logger: removing stderr method
août 10 08:26:24 ultra.kervao.fr spamd[96544]: spamd: server started on IO::Socket::IP [::1]:783, IO::Socket::IP [127.0.0.1]:783 (running version 4.0.1)
août 10 08:26:24 ultra.kervao.fr spamd[96544]: spamd: server pid: 96544
août 10 08:26:24 ultra.kervao.fr spamd[96544]: spamd: server successfully spawned child process, pid 96548
août 10 08:26:24 ultra.kervao.fr systemd[1]: Started spamassassin.service.
août 10 08:26:24 ultra.kervao.fr spamd[96544]: spamd: server successfully spawned child process, pid 96549
août 10 08:26:24 ultra.kervao.fr spamd[96544]: prefork: child states: IS
août 10 08:26:24 ultra.kervao.fr spamd[96544]: prefork: child states: II

passons maintenant à spamass-milter on va créer le fichier spamass-milter.service sous /usr/lib/systemd/system voici son contenu

[Unit]
Description = Mail filter for SpamAssassin
Wants = spamassassin.service
After = syslog.target local-fs.target network.target remote-fs.target nss-lookup.target spamassassin.service
Before = sendmail.service

[Service]
Type = simple
ExecStart = /usr/local/sbin/spamass-milter -u mail -p /var/run/spamass.sock

[Install]

WantedBy = multi-user.target

maintenant pour que le service soit lancé à chaque boot de la machine il faudra taper

systemctl enable spamass-milter.service

voillà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/spamass-milter.service to /usr/lib/systemd/system/spamass-milter.service.

pour le lancer il suffit maintenant de taper

systemctl  start spamass-milter.service

voilà le résultat de la commande systemctl status spamass-milter.service

● spamass-milter.service - Mail filter for SpamAssassin
     Loaded: loaded (/usr/lib/systemd/system/spamass-milter.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2021-09-11 14:08:35 CEST; 5h 15min ago
   Main PID: 2094 (spamass-milter)
      Tasks: 2 (limit: 4677)
     Memory: 552.0K
        CPU: 126ms
     CGroup: /system.slice/spamass-milter.service
             └─2094 /usr/local/sbin/spamass-milter -u mail -p /var/run/spamass.sock

sept. 11 14:08:35 mana.kervao.fr systemd[1]: Started Mail filter for SpamAssassin.
sept. 11 14:08:35 mana.kervao.fr spamass-milter[2094]: spamass-milter 0.4.0 starting


Fonctionnement

Prise en compte des spams

Voilà deux techniques pour prendre en compte les spams

Technique Procmail

Maintenant j'ai créé un fichier .procmailrc sous ma homedirectory qui contient

:0fw: spamassassin.lock
* < 256000
| spamassassin

:0:
* ^X-Spam-Status: Yes
caughtspam

Tous les fichiers ayant une taille inférieur à  256000 octets passent à  la moulinette SpamAssassin, car la plupart des spams ne dépassent pas cette taille, ceux qui sont considérés comme spams sont sauvegardés dans le fichier caughtspam. Maintenant j'ai configuré kmail pour qu'il puisse lire ce fichier (capture d'écran ci-dessous)


Technique Thunderbird

Vous ne créez pas ce fichier .procmailrc par contre dans la configuration de votre compte dans le paramétrage des indésirables.


Il faut bien prendre soin de cocher la case "Se fier aux en-têtes de courrier indésirable placés par SpamAssassin".
Dans ce cas, les mails classés spams se retrouveront automatiquement dans le dossier "indésirables". Dans le cas où un mail est faussement classé comme spam, vous devez l'exporter au formal eml dans un répertoire particulier fauxspams, de la même manière un spam non détecté doit être exporté au format eml dans un répertoire marqué spams.

Pour les deux techniques

Pour tous vos utilisateurs il faudra créer un répertoire .spamassassin dans chaque homedirectory, ce répertoire .spamassassin doit avoir les droits 777 pour que l'utilisateur mail puisse y avoir accès. Maintenant si un mail venant d'un expéditeur particulier (les sites de vente par internet par exemple avec leur email bourré de HTML) est considéré comme spam alors qu'il ne devrait pas l'être. Rajoutez  dans le fichier de configuration de l'utilisateur /home/user/.spamassasin/user_prefs la ligne

whitelist_from *@ldlc.fr *@rueducommerce.com *@fnac.com

C'est pas des masses pratiques d'avoir à modifier un fichier pour rajouter des adresses e-mails, on pourra passer par webmin pour gérer les listes autorisées ou pas pour que ça soit plus convivial

Les listes seront communes à tous les utilisateurs et sauvegardées dans le fichier /etc/mail/spamassassin/local.cf. Attention pour que le fichier global soit pris en compte il faudra supprimer le fichier user_prefs. Ce n'est pas l'idéal d'avoir à rajouter ces listes dans le fichier local.cf, du coup je les ai placés dans un fichier /etc/mail/spamassassin/white-black-list.cf. Petit bémol les modifications de ce fichier ne sont prises en compte qu'en relançant SpamAssassin et non pas de manière dynamique.

Plus d'info sur le fichier de configuration de SpamAssassin à  cet endroit http://spamassassin.org/doc/Mail_SpamAssassin_Conf.html

En plus de la méthode manuelle, il existe une méthode automatique de classement dite auto-whitelist qui se base sur certains algorithmes (voir par là https://cwiki.apache.org/confluence/display/SPAMASSASSIN/AutoWhitelist). La base de donnée de cette méthode est sauvegardée dans le fichier auto-whitelist qui se trouve sous .spamassassin de chaque utilisateur. Pour visualiser ce qu'il y a dedans il faudra taper

sa-awl ~/.spamassassin/auto-whitelist

cela va donner quelque chose comme cela (extrait)

   12.3        (12.3/1)  --  antoine-poirier@vme-147.com|ip=37.59
    15.3        (15.3/1)  --  edm@e8.zonfrontek.com|ip=70.39
    28.9        (28.9/1)  --  geykrapulyngalwyan@outlook.com|ip=37.207
    16.8        (16.8/1)  --  hicks+1761@bdis.fr|ip=79.247
    14.8        (14.8/1)  --  investissement-residence-service-211748@vme-uyt.com|ip=81.93
    11.3        (22.6/2)  --  mail6@nouvelle-vision.net|ip=178.33
    15.1        (15.1/1)  --  mutuelle_senior@cible-directe.fr|ip=185.52
    10.0        (20.0/2)  --  news@unmailundeal.com|ip=212.18
     2.0         (6.1/3)  --  newsletter@mabellephoto.com|ip=85.158
    12.7        (12.7/1)  --  protection@news7.sedem.info|ip=5.135
     4.9         (4.9/1)  --  abidjahan9@gmail.com|ip=209.85
     4.6         (4.6/1)  --  automated@e.airbnb.com|ip=199.7
     7.2        (28.7/4)  --  bcastuae@gmail.com|ip=110.36
    17.9        (17.9/1)  --  contact@efsr26.info|ip=37.59
    11.0        (11.0/1)  --  contact@infos-pro.com|ip=8.8

Le premier chiffre est le score moyen, entre parenthèse le premier correspond au score total des mails et le deuxième le nombre de mails concernés. Pour supprimer un mail de la liste on tapera

spamassassin --remove-addr-from-whitelist=foo@bar

la commande suivante permettra de supprimer les entrées vues moins de trois fois

sa-awl --clean --min 3 ~/.spamassassin/auto-whitelist

Voilà ce que ça donne en réception d'un spam (mode non debug) avec un spam

août 10 10:16:03 ultra.kervao.fr spamd[97375]: spamd: connection from localhost [::1]:57010 to port 783, fd 5
août 10 10:16:03 ultra.kervao.fr spamd[97375]: spamd: processing message <20240809201546.4FFA3B4A28658309@easywealthmgt.com> for olivier:8
août 10 10:16:07 ultra.kervao.fr spamd[97375]: async: aborting after 4.654 s, deadline shrunk: AskDNS, A/easywealthmgt.com.fresh.fmb.la, rules: __FROM_FMBLA_NEWDOM14, __FROM_FMBLA_NEWDOM28, __FROM_FMBLA_NEWDOM, __FROM_FMBLA_NDBLOCKED
août 10 10:16:07 ultra.kervao.fr spamd[97375]: spamd: identified spam (17.4/5.0) for olivier:8 in 4.7 seconds, 3679 bytes.
août 10 10:16:07 ultra.kervao.fr spamd[97375]: spamd: result: Y 17 - ADVANCE_FEE_3_NEW_FRM_MNY,DKIM_ADSP_NXDOMAIN,DMARC_MISSING,FILL_THIS_FORM,FILL_THIS_FORM_LOAN,FILL_THIS_FORM_LONG,HTML_MESSAGE,LOTS_OF_MONEY,MILLION_USD,MIME_HTML_ONLY,MONEY_FORM,MONEY_FRAUD_3,RCVD_IN_BL_SPAMCOP_NET,RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_PBL,RCVD_IN_SBL_CSS,RCVD_IN_VALIDITY_RPBL,RCVD_IN_XBL,RDNS_NONE scantime=4.7,size=3679,user=olivier,uid=8,required_score=5.0,rhost=localhost,raddr=::1,rport=57010,mid=<20240809201546.4FFA3B4A28658309@easywealthmgt.com>,autolearn=no autolearn_force=no
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899: Milter (spamassassin) add: header: X-Spam-Status: Yes, score=17.4 required=5.0 tests=ADVANCE_FEE_3_NEW_FRM_MNY,\n\tDKIM_ADSP_NXDOMAIN,DMARC_MISSING,FILL_THIS_FORM,FILL_THIS_FORM_LOAN,\n\tFILL_THIS_FORM_LONG,HTML_MESSAGE,LOTS_OF_MONEY,MILLION_USD,\n\tMIME_HTML_ONLY,MONEY_FORM,MONEY_FRAUD_3,RCVD_IN_BL_SPAMCOP_NET,\n\tRCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_PBL,RCVD_IN_SBL_CSS,\n\tRCVD_IN_VALIDITY_RPBL,RCVD_IN_XBL,RDNS_NONE autolearn=no\n\tautolearn_force=no version=4.0.1
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899[1]: Milter (spamassassin) delete: header X-Spam-Report: \n\t*  1.2 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in\n\t*      bl.spamcop.net\n\t*      [Blocked - see <https://www.spamcop.net/bl.shtml?139.99.220.252>]\n\t*  2.7 RCVD_IN_PSBL RBL: Received via a relay in PSBL\n\t*      [139.99.220.252 listed in psbl.surriel.com]\n\t*  3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS\n\t*      [139.99.220.252 listed in zen.spamhaus.org]\n\t*  3.6 RCVD_IN_PBL RBL: Received via a relay in Spamhaus PBL\n\t*  0.7 RCVD_IN_XBL RBL: Received via a relay in Spamhaus XBL\n\t*  0.8 DKIM_ADSP_NXDOMAIN No valid author signature and domain not in\n\t*      DNS\n\t*  0.1 MIME_HTML_ONLY BODY: Message only has text/html MIME parts\n\t*  0.0 HTML_MESSAGE BODY: HTML included in message\n\t*  2.5 RCVD_IN_MSPIKE_L5 RBL: Very bad reputation (-5)\n\t*      [139.99.220.252 listed in bl.mailspike.net]\n\t*  1.3 RCVD_IN_RP_RNBL RBL: Relay in RNBL,\n\t*     ...
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899[2]:   https://senderscore.org/blacklistlookup/\n\t*      [139.99.220.252 listed in bl.score.senderscore.com]\n\t* -3.0 RCVD_IN_RP_CERTIFIED RBL: Sender in ReturnPath Certified -\n\t*      Contact cert-sa@returnpath.net\n\t*      [Excessive Number of Queries | <https://knowledge.validity.com/hc/en-us/articles/20961730681243>]\n\t* -2.0 RCVD_IN_RP_SAFE RBL: Sender in ReturnPath Safe - Contact\n\t*      safe-sa@returnpath.net\n\t*  1.3 RDNS_NONE Delivered to internal network by a host with no rDNS\n\t*  0.0 LOTS_OF_MONEY Huge... sums of money\n\t*  0.0 RCVD_IN_MSPIKE_BL Mailspike blacklisted\n\t*  1.0 HELO_MISC_IP Looking for more Dynamic IP Relays\n\t*  0.0 FILL_THIS_FORM Fill in a form with personal information\n\t*  2.0 FILL_THIS_FORM_LONG Fill in a form with personal information\n\t*  0.0 T_FILL_THIS_FORM_LOAN Answer loan question(s)\n\t*  1.0 MONEY_FORM Lots of money if you fill out a form\n\t*  1.0 MONEY_FRAUD_3 Lots of money and several fraud  ...
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899[3]: phrases
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899: Milter (spamassassin) add: header: X-Spam-Level: *****************
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899: Milter (spamassassin) change: header X-Spam-Checker-Version: from  SpamAssassin 3.4.4 (2020-01-24) on\n\tpar1-wbh-prd-eximproxy02.internal.scaleway.com to SpamAssassin 4.0.1 (2024-03-26) on ultra.kervao.fr
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899: Milter (spamassassin) change: header Content-Type: from  text/html;\n\tcharset="iso-8859-1" to multipart/mixed; boundary="----------=_66B721C7.18CD7D78"
août 10 10:16:07 ultra.kervao.fr sendmail[101899]: 47A8G0Eu101899: Milter (spamassassin) message: body replaced
août 10 10:16:07 ultra.kervao.fr spamd[97371]: prefork: child states: II

Et voilà une partie du corps d'un spam après traitement par SpamAssassin.

From: "Kauf.land =?UTF-8?B?8J+bkg==?="  <Kundensupport5623800@litcharts.com>
Message-Id: <NngOtqW.56902.970.JDT@litcharts.com>
Date: Sun, 11 Aug 2024 07:45:37 +0200
MIME-Version: 1.0
Subject: *****SPAM***** Sie sich Anfang August-Geschenk🔥
Reply-To: reply_to@litcharts.com
To: olivier.hoarau@funix.org
Content-Type: multipart/mixed; boundary="----------=_66B889AF.9A4D3319"
Content-Transfer-Encoding: 8bit
X-online-proxy-in: FLEX_RVVNa01vc1lvVXlReUE4Sw==EOHC2hIK3H6k4v9o4asxECWLUUNEt7LA
X-online-to: olivier.hoarau@funix.org
X-original-for: olivier.hoarau@funix.org
X-Virus-Scanned: clamav-milter 1.2.0 at ultra.kervao.fr
X-Virus-Status: Clean
X-Spam-Flag: YES
X-Spam-Status: Yes, score=23.7 required=5.0 tests=AMAZON_IMG_NOT_RCVD_AMZN,
    BAYES_99,BAYES_999,DCC_CHECK,DCC_REPUT_99_100,DIGEST_MULTIPLE,
    DMARC_NONE,FONT_INVIS_MSGID,FSL_BULK_SIG,HOSTED_IMG_DIRECT_MX,
    HTML_FONT_TINY_NORDNS,HTML_IMAGE_RATIO_08,HTML_MESSAGE,MIME_HTML_ONLY,
    RAZOR2_CF_RANGE_51_100,RAZOR2_CHECK,RCVD_IN_BL_SPAMCOP_NET,
    RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_SBL_CSS,RDNS_NONE,
    SPF_HELO_NEUTRAL,T_REMOTE_IMAGE,URIBL_DBL_SPAM shortcircuit=no
    autolearn=spam autolearn_force=no version=4.0.1
X-Spam-Level: ***********************
X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on ultra.kervao.fr

This is a multi-part message in MIME format.

------------=_66B889AF.9A4D3319
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

------------------ Début de Rapport SpamAssassin ---------------------
Ce message est probablement du SPAM (message non sollicité envoyé en
masse, publicité, escroquerie...).

Cette notice a été ajoutée par le système d'analyse "SpamAssassin" sur
votre serveur de courrier "ultra.kervao.fr", pour vous
aider à identifier ce type de messages.

Le système SpamAssassin ajoute un en-tête "X-Spam-Flag: YES" aux
messages qu'il considère comme étant probablement du Spam.
Vous pouvez si vous le souhaitez utiliser cette caractéristique
pour régler un filtre dans votre logiciel de lecture de courrier,
afin de détruire ou de classer à part ce type de message.

Si ce robot a classifié incorrectement un message qui vous était
destiné, ou pour toute question, veuillez contacter l'administrateur
du système par e-mail à olivier .

Voir https://spamassassin.apache.org/tag/ pour plus de détails (en anglais).

Détails de l'analyse du message:   (23.7 points, 5.0 requis)
 1.3 RCVD_IN_BL_SPAMCOP_NET RBL: Relais listé dans
                            http://spamcop.net/bl.shtml
              [Blocked - see <https://www.spamcop.net/bl.shtml?23.228.85.170>]
 3.3 RCVD_IN_SBL_CSS        RBL: Received via a relay in Spamhaus SBL-CSS
                            [23.228.85.170 listed in zen.spamhaus.org]
 2.5 URIBL_DBL_SPAM         Contains a spam URL listed in the Spamhaus DBL
                            blocklist
                            [URI: www.addimprovement.bumbleshrimp.com]
 0.1 SPF_HELO_NEUTRAL       SPF: HELO does not match SPF record (neutral)
 1.1 DCC_CHECK              Message listé par DCC: http://www.www.dcc-servers.net/dcc/
 0.0 RCVD_IN_MSPIKE_BL      Mailspike blocklisted
 0.0 RCVD_IN_MSPIKE_ZBI     No description available.
 0.1 DMARC_NONE             DMARC none policy
 3.5 BAYES_99               BODY: L'algorithme Bayésien a évalué la probabilité de spam
                            entre 99 et 100%
                            [score: 1.0000]
 0.2 BAYES_999              BODY: L'algorithme Bayésien a évalué la probabilité de spam
                             entre 99.9 et 100%
                            [score: 1.0000]
 0.0 HTML_IMAGE_RATIO_08    BODY: HTML Faible ratio de texte par rapport aux
                            images
 0.1 MIME_HTML_ONLY         BODY: Le message possède uniquement des parties MIME
                            text/html
 0.0 HTML_MESSAGE           BODY: HTML inclus dans le message
 0.8 RDNS_NONE              Delivered to internal network by a host with no rDNS
 2.0 HTML_FONT_TINY_NORDNS  Font too small to read, no rDNS
 2.2 AMAZON_IMG_NOT_RCVD_AMZN Amazon hosted image but message not from
                            Amazon
 1.9 FONT_INVIS_MSGID       Invisible text + suspicious message ID
 0.0 HOSTED_IMG_DIRECT_MX   Image hosted at large ecomm, CDN or hosting
                            site, message direct-to-mx
 0.0 T_REMOTE_IMAGE         Message contains an external image
 1.4 DCC_REPUT_99_100       DCC reputation between 99 % or higher (spam)
 0.9 RAZOR2_CHECK           Message listé par Razor2, voir
                            http://razor.sourceforge.net
 1.9 RAZOR2_CF_RANGE_51_100 Razor2 donne un indice de confiance entre 51
                            et 100
                            [cf: 100]
 0.0 FSL_BULK_SIG           Bulk signature with no Unsubscribe
 0.3 DIGEST_MULTIPLE        Message hits more than one network digest check

-------------------- Fin de Rapport SpamAssassin ---------------------


Chaque mail reçoit les informations suivantes en en tête du style (pour un spam)

X-Spam-Status: Yes, score=17.4 required=5.0 tests=ADVANCE_FEE_3_NEW_FRM_MNY,
    DKIM_ADSP_NXDOMAIN,DMARC_MISSING,FILL_THIS_FORM,FILL_THIS_FORM_LOAN,
    FILL_THIS_FORM_LONG,HTML_MESSAGE,LOTS_OF_MONEY,MILLION_USD,
    MIME_HTML_ONLY,MONEY_FORM,MONEY_FRAUD_3,RCVD_IN_BL_SPAMCOP_NET,
    RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_PBL,RCVD_IN_SBL_CSS,
    RCVD_IN_VALIDITY_RPBL,RCVD_IN_XBL,RDNS_NONE autolearn=no
    autolearn_force=no version=4.0.1
X-Spam-Level: *****************

et pour un non spam

X-Spam-Status: No, score=-98.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,
        DKIM_VALID_AU,DMARC_PASS,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,
        RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,RDNS_NONE,SPF_HELO_NONE,
        T_REMOTE_IMAGE,USER_IN_WELCOMELIST autolearn=no autolearn_force=no
        version=4.0.1
X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on ultra.kervao.fr

En cas de réception de mail en langue arabe ou chinois, vous allez voir apparaître dans le rapport spamassassin en plus cette mention

10 UNWANTED_LANGUAGE_BODY BODY: Message dans une langue non désirée
                             (config locale)


et dans le corps du mail on retrouve UNWANTED_LANGUAGE_BODY

X-Spam-Flag: YES
X-Spam-Status: Yes, score=11.7 required=5.0 tests=BAYES_40,DKIM_SIGNED,
        DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,
        FREEMAIL_FROM,HTML_MESSAGE,NO_RDNS_DOTCOM_HELO,RCVD_IN_DNSWL_NONE,
        RDNS_NONE,SPF_HELO_NONE,UNWANTED_LANGUAGE_BODY shortcircuit=no
        autolearn=no autolearn_force=no version=4.0.1
X-Spam-Level: ***********

Il peut arriver que vous ayez un spam qui ne soit pas analysé par spamassassin, dans les logs vous allez avoir le message suivant

févr. 12 02:36:41 ultra.kervao.fr spamc[3659916]: skipped message, greater than max message size (512000 bytes)

En fait c'est une petite faille du système, par défaut spamc ne va pas analyser le mail dès lors que la taille du fichier dépasse 512ko, les spammeurs profitent de cela et attachent une image de quelques Mo pour passer au travers. Il suffit donc d'augmenter la taille en créant le fichier /etc/mail/spamassassin/spamc.conf qui contiendra

-s 5000000

Si la blacklist a bien été prise en compte vous devriez voir quelque chose comme cela

Détails de l'analyse du message:   (100.0 points, 5.0 requis)
 0.0 SHORTCIRCUIT           Not all rules were run, due to a shortcircuited
                            rule
 100 USER_IN_BLOCKLIST      From: address is in the user's black-list

et voilà ce que ce qu'on retrouve dans le corps du mail pour un expéditeur qui se trouve dans la whitelist

X-Spam-Status: No, score=-100.0 required=5.0 tests=SHORTCIRCUIT,
        USER_IN_WHITELIST,USER_IN_WELCOMELIST shortcircuit=ham
        autolearn=disabled version=4.0.1

L'activation du shortcircuit (cour circuit) permet de stopper tous les tests dès lors que l'expéditeur se trouve dans la blacklist ou dans la whitelist. A présent vous devez aider SpamAssassin à  identifier les spams en lui indiquant les mails qui auraient du être qualifiés de spam et ceux qui n'auraient pas du être identifiés comme spam. Avec la technique procmail/kmail qui me sert à  lire la boîte aux lettres de spam, j'ai créé un dossier fauxspams où je déplace les mails qui n'auraient pas du être classés comme spams.
Maintenant la commande à  taper en tant que root pour qu'il ne prenne plus en compte les mails comme spams est la suivante

sa-learn --ham --dir /home/olivier/.Mail/fauxspam/cur

Avec la technique thunderbird qui me sert à  lire la boîte aux lettres des mails normaux, j'ai créé deux répertoires spams et fauxspams dans lequel je déplace les mails qui auraient dû être classés comme spam. Maintenant la commande à  taper en tant que root pour qu'il ne prenne plus en compte les mails comme spams est la suivante

/usr/local/bin/sa-learn --ham --dir /export/home/user/fauxspams
/usr/local/bin/sa-learn --spam --dir /export/home/user/spams

Voilà le résultat

Learned from 3 message(s) (3 message(s) examined).

Pour  automatiser tout cela vous pouvez créer le fichir /etc/cron.daily/bayes contenant

#!/bin/bash
/usr/local/bin/sa-learn --ham --dir /export/home/user1/fauxspams
/usr/local/bin/sa-learn --spam --dir /export/home/user1/spams
/usr/local/bin/sa-learn --ham --dir /export/home/user2/fauxspams
/usr/local/bin/sa-learn --spam --dir /export/home/user2/spams


Et lui donner des droits en exécution

chmod 755 /etc/cron.daily/bayes

Si dans un mail classé comme spam, je vois dans les entêtes

-2.3 AWL                    AWL: From: address is in the auto white-list

c'est qu'il n'a pas été considéré comme spam au titre de l'auto whitelist, dans ce cas il faudra déplacer le mail dans le répertoire spams pour apprentissage ou simplement rajouter l'expéditeur dans la blacklist.

Autres astuces si vous voulez sauvegarder votre base de données bayes il faudra taper

sa-learn --backup > base-bayes.txt

puis pour la restaurer

sa-learn --restore base-bayes.txt

Cette sauvegarde peut être évidemment automatisée. Pour voir ce que la base contient on tapera

sa-learn --dump magic

voilà le résultat

0.000          0          3          0  non-token data: bayes db version
0.000          0       9041          0  non-token data: nspam
0.000          0      12164          0  non-token data: nham
0.000          0     171108          0  non-token data: ntokens
0.000          0 1603119662          0  non-token data: oldest atime
0.000          0 1605952921          0  non-token data: newest atime
0.000          0 1605952891          0  non-token data: last journal sync atime
0.000          0 1605927677          0  non-token data: last expiry atime
0.000          0    2764800          0  non-token data: last expire atime delta
0.000          0       3481          0  non-token data: last expire reduction count

Dans l'exemple ci-dessus, il y a 9041 spams et 12164 non spams et 171108 "tokens" les tokens sont des éléments qui caractérisent le spam ou a contrario le non spam.

A noter que si vous obtenez cela dans les logs

févr. 23 11:58:10 mana.kervao.fr spamd[1635]: dns: sendto() to [127.0.0.1]:53 failed: Connection refused, failing over to [::1]:53
févr. 23 11:58:10 mana.kervao.fr spamd[1635]: dns: sendto() to [::1]:53 failed: Connection refused, failing over to [127.0.0.1]:53
févr. 23 11:58:10 mana.kervao.fr spamd[1635]: dns: bad dns reply: bgread: recv() failed: Connection refused at /usr/local/share/perl5/Mail/SpamAssassin/DnsResolver.pm line 742, <GEN353> line 525.
févr. 23 11:58:10 mana.kervao.fr spamd[1635]: dns: bad dns reply: bgread: recv() failed: Connection refused at /usr/local/share/perl5/Mail/SpamAssassin/DnsResolver.pm line 742.

c'est que SpamAssassin s'est lancé avant que le service DNS soit opérationnel, il suffit de relancer le service spamd pour supprimer l'erreur.

En activant le mode debug de spamd vous pouvez voir également que la localisation des adresses IP est bien activée

août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP2: city database not found from default locations
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP2: country database not found from default locations
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: versions: Geo::IP 1.51, C library 1.6.12
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: search found city /usr/share/GeoIP/GeoLiteCity.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: search found city /usr/share/GeoIP/GeoLiteCityv6.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: search found country /usr/share/GeoIP/GeoIP.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: search found country /usr/share/GeoIP/GeoIPv6.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: loaded city from /usr/share/GeoIP/GeoLiteCity.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: GeoIP: loaded country from /usr/share/GeoIP/GeoIP.dat
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: database info: Geo::IP IPv4 city: GEO-533LITE 20180327 Build 1 Copyright (c) 2018 MaxMind Inc All Rights R>
août 11 10:28:14 ultra.kervao.fr spamd[359354]: geodb: database info: Geo::IP IPv4 country: GEO-106FREE 20180327 Build 1 Copyright (c) 2018 MaxMind Inc All Right>

ainsi que DKIM

août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: DKIM signature verification result: PASS
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: performing public ARC key lookup and signature verification
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: ARC signature verification result: none
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: adsp not retrieved, author domain signature is valid
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: adsp result: - (valid a. d. signature), author domain 'news.leboncoin.fr'
août 11 13:22:07 ultra.kervao.fr spamd[422090]: spf: welcomelist_from_spf: already checked spf and didn't get pass, skipping welcomelist check
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: VALID signature by news.leboncoin.fr, author info@news.leboncoin.fr, no valid matches
août 11 13:22:07 ultra.kervao.fr spamd[422090]: dkim: author info@news.leboncoin.fr, not in any dkim welcomelist


Mettre en place un anti virus

Présentation et installation

Clam Anti virus (clamav) comme son nom l'indique est un anti virus qui est totalement libre, le site officiel est http://www.clamav.net/ on y récupérera l'archive qu'on décompresse en tapant

tar xvfz clamav-1.3.1.tar.gz

Cela donne clamav-1.3.1 avant d'aller plus loin vous pouvez récupérer la trés bonne documentation  disponible à  cet endroit http://wiki.clamav.net/Main/WebHome. En suivant les instructions on doit d'abord en tant que root créer un utilisateur clamav

groupadd clamav
useradd -g clamav -s /bin/false -c "Clam Anti Virus" clamav

Ensuite en tant que simple utilisateur dans le répertoire clamav-1.3.1 on doit taper

mkdir build
cd build
cmake ..

il sera peut être nécessaire d'installer les packages lib64pcre2-devel, cargo, rust, lib64check-devel, lib64json-c-devel et sendmail-devel et python3-pytest

voilà le résultat

-- Configuration Options Summary --
    Package Version:        ClamAV 1.3.1
    libclamav version:      12:2:0
    libfreshclam version:   3:1:0
    Install prefix:         /usr/local
    Install database dir:   /usr/local/share/clamav
    Install config dir:     /usr/local/etc
    Host system:            Linux-6.6.43-desktop-1.mga9
    Target system:          Linux-6.6.43-desktop-1.mga9
    Compiler:              
        Build type:         RelWithDebInfo
        C compiler:         /usr/bin/cc
        C++ compiler:       /usr/bin/c++
        Rust toolchain:     /usr/bin/cargo (1.74.0)
        CFLAGS:             -O2 -g  
        CXXFLAGS:           -O2 -g  
        WARNCFLAGS:          -Wall -Wextra -Wformat-security
    Build Options:         
        Build apps:         ON
        Shared library:     ON
        Static library:     OFF
        Enable UnRAR:       ON
        Examples:           OFF
        Tests:              ON
        Build man pages:    ON
        Build doxygen HTML: OFF
        Maintainer Mode:    OFF
    Build Extras:          
        Build milter:       ON  (toggle with -DENABLE_MILTER=ON/OFF)
        Build clamonacc:    ON  (toggle with -DENABLE_CLAMONACC=ON/OFF)
-- Engine Options --
        Bytecode Runtime:  
            interpreter           
-- Test Dependencies --
        Unit Test Framework:
            libcheck        /usr/include
                            /usr/lib64/libcheck.so
        Feature Test Framework:
            python3         /usr/bin/python3.10
            test command    pytest;-v
-- libclamav Dependencies --
        Compression support:
            bzip2           /usr/include
                            /usr/lib64/libbz2.so
            zlib            /usr/include
                            /usr/lib64/libz.so
        XML support:       
            libxml2         /usr/include/libxml2;/usr/include/libxml2
                            /usr/lib64/libxml2.so
        RegEx support:     
            libpcre2        /usr/include
                            /usr/lib64/libpcre2-8.so
        Crypto support:    
            openssl         /usr/include
                            /usr/lib64/libssl.so;/usr/lib64/libcrypto.so
        JSON support:      
            json-c          /usr/include/json-c
                            /usr/lib64/libjson-c.so
        Threading support: 
            pthread        
        Locale support:    
            iconv           /usr/include
                            /usr/lib64/libc.so
-- libfreshclam Extra Dependencies --
        HTTP support:      
            curl            /usr/include
                            /usr/lib64/libcurl.so
-- Application Extra Dependencies --
        GUI support:       
            ncurses         /usr/include
                            /usr/lib64/libncurses.so;/usr/lib64/libtinfo.so
        systemd:           
            unit directory  /usr/lib/systemd/system
        systemd ctl support:
            libsystemd      /usr/include
                            /usr/lib64/libsystemd.so
        Milter Support:    
            libmilter       /usr/include
                            /usr/lib64/libmilter.so

-- Warning: libjson-c is known to share symbol names with other JSON libraries which may result in crashes for applications that use libclamav. Consider providing a static json-c library that was compiled with: CFLAGS="-fPIC". Default build settings for json-c 0.15+ should also work. Use the `-DENABLE_JSON_SHARED=OFF` option to prefer detection of the static library, or use -DJSONC_INCLUDE_DIR and -DJSONC_LIBRARY to specify the static JSON library.
-- Configuring done (24.8s)
-- Generating done (0.2s)
-- Build files have been written to: /usr/local/linux/mail/clamav-1.3.1/build

j'ai passé outre l'avertissement car la compilation se passe mal si je rajoute l'option -DENABLE_JSON_SHARED=OFF On tape ensuite

make

puis en tant que root

make install

On rajoute si ce n'est déjé fait la ligne /usr/local/lib (et /usr/local/lib64 pour une version 64bits) dans le fichier /etc/ld.so.conf et on tape

ldconfig

Maintenant on crée le répertoire de log de clamav, l'utilisateur clamav doit en étre propriétaire

mkdir /var/log/clamav
chown clamav:clamav /var/log/clamav

Configuration

On édite le fichier /usr/local/etc/clamd.conf voici comment je l'ai configuré

##
## Example config file for the Clam AV daemon
## Please read the clamd.conf(5) manual before editing this file.
##


# Comment or remove the line below.
#Example

# Uncomment this option to enable logging.
# LogFile must be writable for the user running daemon.
# A full path is required.
# Default: disabled
#LogFile /tmp/clamd.log
LogFile /var/log/clamav/clamd.log

# By default the log file is locked for writing - the lock protects against
# running clamd multiple times (if want to run another clamd, please
# copy the configuration file, change the LogFile variable, and run
# the daemon with --config-file option).
# This option disables log file locking.
# Default: no
#LogFileUnlock yes

# Maximum size of the log file.
# Value of 0 disables the limit.
# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes)
# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes). To specify the size
# in bytes just don't use modifiers. If LogFileMaxSize is enabled, log
# rotation (the LogRotate option) will always be enabled.
# Default: 1M
LogFileMaxSize 2M

# Log time with each message.
# Default: no
#LogTime yes

# Also log clean files. Useful in debugging but drastically increases the
# log size.
# Default: no
#LogClean yes

# Use system logger (can work together with LogFile).
# Default: no
#LogSyslog yes

# Specify the type of syslog messages - please refer to 'man syslog'
# for facility names.
# Default: LOG_LOCAL6
#LogFacility LOG_MAIL

# Enable verbose logging.
# Default: no
#LogVerbose yes

# Enable log rotation. Always enabled when LogFileMaxSize is enabled.
# Default: no
#LogRotate yes

# Log additional information about the infected file, such as its
# size and hash, together with the virus name.
#ExtendedDetectionInfo yes

# This option allows you to save a process identifier of the listening
# daemon (main thread).
# Default: disabled
PidFile /var/log/clamav/clamd.pid

# Optional path to the global temporary directory.
# Default: system specific (usually /tmp or /var/tmp).
TemporaryDirectory /tmp

# Path to the database directory.
# Default: hardcoded (depends on installation options)
DatabaseDirectory /usr/local/share/clamav

# Only load the official signatures published by the ClamAV project.
# Default: no
#OfficialDatabaseOnly no

# The daemon can work in local mode, network mode or both.
# Due to security reasons we recommend the local mode.

# Path to a local socket file the daemon will listen on.
# Default: disabled (must be specified by a user)
#LocalSocket /tmp/clamd.socket
LocalSocket  /var/log/clamav/clamd.sock


# Sets the group ownership on the unix socket.
# Default: disabled (the primary group of the user running clamd)
#LocalSocketGroup virusgroup

# Sets the permissions on the unix socket to the specified mode.
# Default: disabled (socket is world accessible)
#LocalSocketMode 660

# Remove stale socket after unclean shutdown.
# Default: yes
FixStaleSocket yes

# TCP port address.
# Default: no
#TCPSocket 3310

# TCP address.
# By default we bind to INADDR_ANY, probably not wise.
# Enable the following to provide some degree of protection
# from the outside world. This option can be specified multiple
# times if you want to listen on multiple IPs. IPv6 is now supported.
# Default: no
#TCPAddr 127.0.0.1

# Maximum length the queue of pending connections may grow to.
# Default: 200
#MaxConnectionQueueLength 30

# Clamd uses FTP-like protocol to receive data from remote clients.
# If you are using clamav-milter to balance load between remote clamd daemons
# on firewall servers you may need to tune the options below.

# Close the connection when the data size limit is exceeded.
# The value should match your MTA's limit for a maximum attachment size.
# Default: 25M
#StreamMaxLength 10M

# Limit port range.
# Default: 1024
#StreamMinPort 30000
# Default: 2048
#StreamMaxPort 32000

# Maximum number of threads running at the same time.
# Default: 10
MaxThreads 20

# Waiting for data from a client socket will timeout after this time (seconds).
# Default: 120
ReadTimeout 300

# This option specifies the time (in seconds) after which clamd should
# timeout if a client doesn't provide any initial command after connecting.
# Default: 5
#CommandReadTimeout 5

# This option specifies how long to wait (in miliseconds) if the send buffer is full.
# Keep this value low to prevent clamd hanging
#
# Default: 500
#SendBufTimeout 200

# Maximum number of queued items (including those being processed by MaxThreads threads)
# It is recommended to have this value at least twice MaxThreads if possible.
# WARNING: you shouldn't increase this too much to avoid running out  of file descriptors,
# the following condition should hold:
# MaxThreads*MaxRecursion + (MaxQueue - MaxThreads) + 6< RLIMIT_NOFILE (usual max is 1024)
#
# Default: 100
#MaxQueue 200

# Waiting for a new job will timeout after this time (seconds).
# Default: 30
#IdleTimeout 60

# Don't scan files and directories matching regex
# This directive can be used multiple times
# Default: scan all
#ExcludePath ^/proc/
#ExcludePath ^/sys/

# Maximum depth directories are scanned at.
# Default: 15
#MaxDirectoryRecursion 20

# Follow directory symlinks.
# Default: no
#FollowDirectorySymlinks yes

# Follow regular file symlinks.
# Default: no
#FollowFileSymlinks yes

# Scan files and directories on other filesystems.
# Default: yes
#CrossFilesystems yes

# Perform a database check.
# Default: 600 (10 min)
#SelfCheck 600

# Execute a command when virus is found. In the command string %v will
# be replaced with the virus name.
# Default: no
#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v"

# Run as another user (clamd must be started by root for this option to work)
# Default: don't drop privileges
User clamav

# Initialize supplementary group access (clamd must be started by root).
# Default: no
#AllowSupplementaryGroups no

# Stop daemon when libclamav reports out of memory condition.
#ExitOnOOM yes

# Don't fork into background.
# Default: no
Foreground yes

# Enable debug messages in libclamav.
# Default: no
# Debug yes

# Do not remove temporary files (for debug purposes).
# Default: no
#LeaveTemporaryFiles yes

# Permit use of the ALLMATCHSCAN command. If set to no, clamd will reject
# any ALLMATCHSCAN command as invalid.
# Default: yes
#AllowAllMatchScan no

# Detect Possibly Unwanted Applications.
# Default: no
#DetectPUA yes

# Exclude a specific PUA category. This directive can be used multiple times.
# See https://github.com/vrtadmin/clamav-faq/blob/master/faq/faq-pua.md for
# the complete list of PUA categories.
# Default: Load all categories (if DetectPUA is activated)
#ExcludePUA NetTool
#ExcludePUA PWTool

# Only include a specific PUA category. This directive can be used multiple
# times.
# Default: Load all categories (if DetectPUA is activated)
#IncludePUA Spy
#IncludePUA Scanner
#IncludePUA RAT

# In some cases (eg. complex malware, exploits in graphic files, and others),
# ClamAV uses special algorithms to provide accurate detection. This option
# controls the algorithmic detection.
# Default: yes
AlgorithmicDetection yes

# This option causes memory or nested map scans to dump the content to disk.
# If you turn on this option, more data is written to disk and is available
# when the LeaveTemporaryFiles option is enabled.
#ForceToDisk yes

# This option allows you to disable the caching feature of the engine. By
# default, the engine will store an MD5 in a cache of any files that are
# not flagged as virus or that hit limits checks. Disabling the cache will
# have a negative performance impact on large scans.
# Default: no
#DisableCache yes

##
## Executable files
##

# PE stands for Portable Executable - it's an executable file format used
# in all 32 and 64-bit versions of Windows operating systems. This option allows
# ClamAV to perform a deeper analysis of executable files and it's also
# required for decompression of popular executable packers such as UPX, FSG,
# and Petite. If you turn off this option, the original files will still be
# scanned, but without additional processing.
# Default: yes
ScanPE yes

# Certain PE files contain an authenticode signature. By default, we check
# the signature chain in the PE file against a database of trusted and
# revoked certificates if the file being scanned is marked as a virus.
# If any certificate in the chain validates against any trusted root, but
# does not match any revoked certificate, the file is marked as whitelisted.
# If the file does match a revoked certificate, the file is marked as virus.
# The following setting completely turns off authenticode verification.
# Default: no
#DisableCertCheck yes

# Executable and Linking Format is a standard format for UN*X executables.
# This option allows you to control the scanning of ELF files.
# If you turn off this option, the original files will still be scanned, but
# without additional processing.
# Default: yes
ScanELF yes

##
## Documents
##

# This option enables scanning of OLE2 files, such as Microsoft Office
# documents and .msi files.
# If you turn off this option, the original files will still be scanned, but
# without additional processing.
# Default: yes
ScanOLE2 yes

# With this option enabled OLE2 files with VBA macros, which were not
# detected by signatures will be marked as "Heuristics.OLE2.ContainsMacros".
# Default: no
#OLE2BlockMacros no

# This option enables scanning within PDF files.
# If you turn off this option, the original files will still be scanned, but
# without decoding and additional processing.
# Default: yes
ScanPDF yes

# This option enables scanning within SWF files.
# If you turn off this option, the original files will still be scanned, but
# without decoding and additional processing.
# Default: yes
ScanSWF yes


##
## Mail files
##

# Enable internal e-mail scanner.
# If you turn off this option, the original files will still be scanned, but
# without parsing individual messages/attachments.
# Default: yes
ScanMail yes

# Scan RFC1341 messages split over many emails.
# You will need to periodically clean up $TemporaryDirectory/clamav-partial directory.
# WARNING: This option may open your system to a DoS attack.
#          Never use it on loaded servers.
# Default: no
ScanPartialMessages yes

# With this option enabled ClamAV will try to detect phishing attempts by using
# signatures.
# Default: yes
PhishingSignatures yes

# Scan URLs found in mails for phishing attempts using heuristics.
# Default: yes
PhishingScanURLs yes

# Always block SSL mismatches in URLs, even if the URL isn't in the database.
# This can lead to false positives.
#
# Default: no
#PhishingAlwaysBlockSSLMismatch no

# Always block cloaked URLs, even if URL isn't in database.
# This can lead to false positives.
#
# Default: no
#PhishingAlwaysBlockCloak no

# Detect partition intersections in raw disk images using heuristics.
# Default: no
#PartitionIntersection no

# Allow heuristic match to take precedence.
# When enabled, if a heuristic scan (such as phishingScan) detects
# a possible virus/phish it will stop scan immediately. Recommended, saves CPU
# scan-time.
# When disabled, virus/phish detected by heuristic scans will be reported only at
# the end of a scan. If an archive contains both a heuristically detected
# virus/phish, and a real malware, the real malware will be reported
#
# Keep this disabled if you intend to handle "*.Heuristics.*" viruses
# differently from "real" malware.
# If a non-heuristically-detected virus (signature-based) is found first,
# the scan is interrupted immediately, regardless of this config option.
#
# Default: no
#HeuristicScanPrecedence yes


##
## Data Loss Prevention (DLP)
##

# Enable the DLP module
# Default: No
#StructuredDataDetection yes

# This option sets the lowest number of Credit Card numbers found in a file
# to generate a detect.
# Default: 3
#StructuredMinCreditCardCount 5

# This option sets the lowest number of Social Security Numbers found
# in a file to generate a detect.
# Default: 3
#StructuredMinSSNCount 5

# With this option enabled the DLP module will search for valid
# SSNs formatted as xxx-yy-zzzz
# Default: yes
#StructuredSSNFormatNormal yes

# With this option enabled the DLP module will search for valid
# SSNs formatted as xxxyyzzzz
# Default: no
#StructuredSSNFormatStripped yes


##
## HTML
##

# Perform HTML normalisation and decryption of MS Script Encoder code.
# Default: yes
# If you turn off this option, the original files will still be scanned, but
# without additional processing.
#ScanHTML yes


##
## Archives
##

# ClamAV can scan within archives and compressed files.
# If you turn off this option, the original files will still be scanned, but
# without unpacking and additional processing.
# Default: yes
ScanArchive yes

# Mark encrypted archives as viruses (Encrypted.Zip, Encrypted.RAR).
# Default: no
#ArchiveBlockEncrypted no


##
## Limits
##

# The options below protect your system against Denial of Service attacks
# using archive bombs.

# This option sets the maximum amount of data to be scanned for each input file.
# Archives and other containers are recursively extracted and scanned up to this
# value.
# Value of 0 disables the limit
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 100M
#MaxScanSize 150M

# Files larger than this limit won't be scanned. Affects the input file itself
# as well as files contained inside it (when the input file is an archive, a
# document or some other kind of container).
# Value of 0 disables the limit.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 25M
#MaxFileSize 30M

# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR
# file, all files within it will also be scanned. This options specifies how
# deeply the process should be continued.
# Note: setting this limit too high may result in severe damage to the system.
# Default: 16
#MaxRecursion 10

# Number of files to be scanned within an archive, a document, or any other
# container file.
# Value of 0 disables the limit.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 10000
#MaxFiles 15000

# Maximum size of a file to check for embedded PE. Files larger than this value
# will skip the additional analysis step.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 10M
#MaxEmbeddedPE 10M

# Maximum size of a HTML file to normalize. HTML files larger than this value
# will not be normalized or scanned.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 10M
#MaxHTMLNormalize 10M

# Maximum size of a normalized HTML file to scan. HTML files larger than this
# value after normalization will not be scanned.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 2M
#MaxHTMLNoTags 2M

# Maximum size of a script file to normalize. Script content larger than this
# value will not be normalized or scanned.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 5M
#MaxScriptNormalize 5M

# Maximum size of a ZIP file to reanalyze type recognition. ZIP files larger
# than this value will skip the step to potentially reanalyze as PE.
# Note: disabling this limit or setting it too high may result in severe damage
# to the system.
# Default: 1M
#MaxZipTypeRcg 1M

# This option sets the maximum number of partitions of a raw disk image to be scanned.
# Raw disk images with more partitions than this value will have up to the value number
# partitions scanned. Negative values are not allowed.
# Note: setting this limit too high may result in severe damage or impact performance.
# Default: 50
#MaxPartitions 128

# This option sets the maximum number of icons within a PE to be scanned.
# PE files with more icons than this value will have up to the value number icons scanned.
# Negative values are not allowed.
# WARNING: setting this limit too high may result in severe damage or impact performance.
# Default: 100
#MaxIconsPE 200

##
## On-access Scan Settings
##

# Enable on-access scanning. Currently, this is supported via fanotify.
# Clamuko/Dazuko support has been deprecated.
# Default: no
#ScanOnAccess yes

# Don't scan files larger than OnAccessMaxFileSize
# Value of 0 disables the limit.
# Default: 5M
#OnAccessMaxFileSize 10M

# Set the include paths (all files inside them will be scanned). You can have
# multiple OnAccessIncludePath directives but each directory must be added
# in a separate line. (On-access scan only)
# Default: disabled
#OnAccessIncludePath /home
#OnAccessIncludePath /students

# Set the exclude paths. All subdirectories are also excluded.
# (On-access scan only)
# Default: disabled
#OnAccessExcludePath /home/bofh

# With this option you can whitelist specific UIDs. Processes with these UIDs
# will be able to access all files.
# This option can be used multiple times (one per line).
# Default: disabled
#OnAccessExcludeUID 0


##
## Bytecode
##

# With this option enabled ClamAV will load bytecode from the database.
# It is highly recommended you keep this option on, otherwise you'll miss detections for many new viruses.
# Default: yes
Bytecode yes

# Set bytecode security level.
# Possible values:
#       None - no security at all, meant for debugging. DO NOT USE THIS ON PRODUCTION SYSTEMS
#         This value is only available if clamav was built with --enable-debug!
#       TrustSigned - trust bytecode loaded from signed .c[lv]d files,
#                insert runtime safety checks for bytecode loaded from other sources
#       Paranoid - don't trust any bytecode, insert runtime checks for all
# Recommended: TrustSigned, because bytecode in .cvd files already has these checks
# Note that by default only signed bytecode is loaded, currently you can only
# load unsigned bytecode in --enable-debug mode.
#
# Default: TrustSigned
#BytecodeSecurity TrustSigned

# Set bytecode timeout in miliseconds.
#
# Default: 5000
# BytecodeTimeout 1000

##
## Statistics gathering and submitting
##

# Enable statistical reporting.
# Default: no
#StatsEnabled yes

# Disable submission of individual PE sections for files flagged as malware.
# Default: no
#StatsPEDisabled yes

# HostID in the form of an UUID to use when submitting statistical information.
# Default: auto
#StatsHostID auto

# Time in seconds to wait for the stats server to come back with a response
# Default: 10
#StatsTimeout 10


Le fichier de configuration de clamav-milter s'appelle /usr/local/etc/clamav-milter.conf le voici, voilà  les lignes que j'ai modifiées

#Example

MilterSocket /var/log/clamav/clmilter.sock

ClamdSocket unix:/var/log/clamav/clamd.sock

AddHeader Replace

LogFile /var/log/clamav/clamav-milter.log

pour le reste tout est en commentaire

On configure maintenant le fichier /usr/local/etc/freshclam.conf en mettant en commentaire la ligne suivante

#Example

Puis en modifiant la ligne suivante conformément à  ce qui a été défini dans le fichier clamd.conf

# définition de la base des données des virus
DatabaseDirectory /usr/local/share/clamav

J'ai modifié ensuite les lignes suivantes

# définition du fichier de log de freshclam
UpdateLogFile /var/log/clamav/freshclam.log

# serveur miroir à contacter pour récupérer les mises oà jour
DatabaseMirror db.fr.clamav.net

# database.clamav.net is a round-robin record which points to our most
# reliable mirrors. It's used as a fall back in case db.XY.clamav.net is
# not working. DO NOT TOUCH the following line unless you know what you
# are doing.
DatabaseMirror database.clamav.net

on pensera à créer préalablement les fichiers de log

touch /var/log/clamav/clamd.log
touch
/var/log/clamav/freshclam.log
touch
/var/log/clamav/clamav-milter.log

clamav
doit être le propriétaire des deux premiers fichiers

chown clamav:clamav /var/log/clamav/clamd.log
chown clamav:clamav /var/log/clamav/freshclam.log
 
on doit créer préalablement le répertoire contenant la base de données des virus et clamav doit en être propriétaire

mkdir /usr/local/share/clamav
chown clamav:clamav /usr/local/share/clamav

La commande freshclam permet de mettre à jour la base de données à  partir d'informations récupérées sur internet, en tant que root tapez freshclam --datadir=/usr/local/share/clamav voilà le résultat:

ClamAV update process started at Fri Sep 29 18:20:04 2023
daily database available for download (remote version: 27046)
Time:    1.4s, ETA:    0.0s [========================>]   58.97MiB/58.97MiB
Testing database: '/usr/local/share/clamav/tmp.9fe36bd938/clamav-3557261998181640b08c431851ade988.tmp-daily.cvd' ...
Database test passed.
daily.cvd updated (version: 27046, sigs: 2041850, f-level: 90, builder: raynman)
main database available for download (remote version: 62)
Time:    3.1s, ETA:    0.0s [========================>]  162.58MiB/162.58MiB
Testing database: '/usr/local/share/clamav/tmp.9fe36bd938/clamav-e27b8ca5d89e3bbf79e40fce342cd482.tmp-main.cvd' ...
Database test passed.
main.cvd updated (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
bytecode database available for download (remote version: 334)
Time:    0.2s, ETA:    0.0s [========================>]  285.12KiB/285.12KiB
Testing database: '/usr/local/share/clamav/tmp.9fe36bd938/clamav-1d907c928e30a2ab4a04169388540564.tmp-bytecode.cvd' ...
Database test passed.
bytecode.cvd updated (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

Pour information quand cette commande est lancée c'est l'utilisateur clamav qui devient propriétaire du process.

Premiers tests

On lance maintenant clamd en tant que root

clamd

On va faire un test maintenant sur le répertoire clamav-1.3.1 en tant que simple utilisateur

clamscan -r -l log.txt clamav-1.3.1

L'option -r permet d'avoir une recherche récursive (à travers le répertoire et ses sous répertoires), -l pour logger dans le fichier log.txt. Voilà  un extrait du contenu du dit-fichier aprés l'exécution de la commande

----------- SCAN SUMMARY -----------
Known viruses: 8697141
Engine version: 1.3.1
Scanned directories: 1966
Scanned files: 13624
Infected files: 52
Data scanned: 2676.77 MB
Data read: 2142.18 MB (ratio 1.25:1)
Time: 436.179 sec (7 m 16 s)
Start Date: 2024:08:10 08:53:20
End Date:   2024:08:10 09:00:37


Il y a des virus qui ont été volontairement placés dans ce répertoire pour mener des essais. Pour scanner le répertoire de mail /var/spool/mail il faudra être root et rajouter l'option --mbox.

Lancement automatique

On peut configurer un lancement automatique pour les mises à  jour de la base de donnée avec cron, pour une mise à  jour tous les jours on créera dans le fichier /etc/cron.daily le fichier freshclam

#!/bin/bash
/usr/local/bin/freshclam --datadir=/usr/local/share/clamav --quiet -l /var/log/clamav/clam-update.log

Avec les droits d'exécution

chmod 755 freshclam

On va créer maintenant un fichier de log pour les mises à  jour et rendre l'utilisateur clamav propriétaire

touch /var/log/clamav/clam-update.log
chmod 600 /var/log/clamav/clam-update.log
chown clamav:clamav /var/log/clamav/clam-update.log

Autre solution pour un lancement simple en tant que daemon (lancement six fois par jour) on tape

freshclam --datadir=/usr/local/share/clamav -d -c 6 -l /var/log/clamav/clam-update.log

Maintenant pour un lancement automatique du daemon clamd on va créer le fichier clamd.service sous /usr/lib/systemd/system voici son contenu

[Unit]

Description = clamd scanner daemon
After = syslog.target nss-lookup.target network.target

[Service]
Type = simple
ExecStart = /usr/local/sbin/clamd -c /usr/local/etc/clamd.conf
Restart = on-failure
PrivateTmp = true

[Install]
WantedBy=multi-user.target

maintenant pour que le service soit lancé à chaque boot de la machine il faudra taper

systemctl enable clamd.service

voillà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/clamd.service to /usr/lib/systemd/system/clamd.service.

pour le lancer il suffit maintenant de taper

systemctl  start clamd.service

et voilà ce que ça donne quand on tape systemctl status clamd

● clamd.service - clamd scanner daemon
     Loaded: loaded (/usr/lib/systemd/system/clamd.service; enabled; preset: disabled)
     Active: active (running) since Sat 2024-08-10 08:52:49 CEST; 8min ago
   Main PID: 97655 (clamd)
      Tasks: 2 (limit: 9239)
     Memory: 1.2G
        CPU: 21.897s
     CGroup: /system.slice/clamd.service
             └─97655 /usr/local/sbin/clamd -c /etc/clamd.conf

août 10 08:53:11 ultra.kervao.fr clamd[97655]: Mail files support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: Mail: RFC1341 handling enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: OLE2 support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: PDF support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: SWF support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: HTML support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: XMLDOCS support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: HWP3 support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: OneNote support enabled.
août 10 08:53:11 ultra.kervao.fr clamd[97655]: Self checking every 600 seconds



Lancement automatique du scanner

Pour un lancement automatique du scanner vous pouvez utiliser cron, créer un fichier scanvirus à  placer sous /etc/cron.daily (chaque jour) ou /etc/cron.hourly (chaque heure) contenant

#!/bin/bash
/usr/local/bin/clamscan -r -l /var/log/clamscan/scan.log /home
/usr/local/bin/clamscan -r --mbox /var/spool/mail

Il faut le rendre exécutable

chmod 755 /etc/cron.daily/scanvirus.

Il scannera tous les jours les répertoires /home et /var/spool/mail. Libre à vous de rajouter des scans dans les partages samba ou vos partitions windows.


Interfaçage avec sendmail

L'intérêt maintenant d'un anti virus est un scan automatique à la réception mais également à  l'envoi d'emails. Pour cela Clam Anti Virus peut très facilement s'interfacer avec sendmail. Si la compilation s'est bien passée vous devriez trouver un fichier clamav-milter sous /usr/local/sbin. Dans le fichier de config de sendmail (sous /etc/mail/ ou /usr/share/sendmail-cf/cf) on rajoutera tout à  la fin les lignes

INPUT_MAIL_FILTER(`clmilter', `S=local:/var/log/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')

Dans l'hypothèse où SpamAssassin est déjà  interfacé avec sendmail, il faudra modifier les dernières lignes comme cela.

INPUT_MAIL_FILTER(`clmilter', `S=local:/var/log/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
define(`confMILTER_MACROS_CONNECT',`t, b, j, _, {daemon_name}, {if_name}, {if_addr}')dnl
define(`confMILTER_MACROS_HELO',`s, {tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}')dnl
define(`confMILTER_MACROS_ENVFROM',`i, {auth_authen}, {auth_type}')dnl
define(`confMILTER_MACROS_ENVRCPT',`r, v, Z')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter,spamassassin')

Dans le fichier /etc/clamd.conf on modifiera la ligne suivante

# Path to the local socket. The daemon doesn't change the mode of the
# created file (portability reasons). You may want to create it in a directory
# which is only accessible for a user running daemon.
# je n'ai pas mis le répertoire par défaut car l'utilisateur clamav
# ne peut écrire sous /var/run
LocalSocket /var/log/clamav/clamd.sock

On relance maintenant clamd

systemctl restart clamd.service

Et on lance clamav-milter

clamav-milter -c /usr/local/etc/clamav-milter.conf

Pour information même en le lançant en tant que root, ce sera l'utilisateur clamav qui sera le propriétaire du process clamav-milter. Maintenant on relance sendmail en supposant que votre fichier de conf se trouve sous /usr/share/sendmail-cf/cf et se nomme config.mc

systemctl stop sendmail
cd
  /usr/share/sendmail-cf/cf/
m4  config.mc > /etc/mail/sendmail.cf
systemctl start sendmail

Maintenant pour lancer clamav-milter automatiquement, on créera le fichier clamav-milter.service dans le répertoire /usr/lib/systemd/system/

[Unit]
Description='ClamAV Milter'
After=clamd.service

[Service]
Type=forking
ExecStart=/usr/local/sbin/clamav-milter --config-file /usr/local/etc/clamav-milter.conf

[Install]
WantedBy=multi-user.target

maintenant pour que le service soit lancé à chaque boot de la machine il faudra taper

systemctl enable clamav-milter.service

voillà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/clamav-milter.service to /usr/lib/systemd/system/clamav-milter.service.

pour le lancer il suffit maintenant de taper

systemctl  start clamav-milter.service

et voilà ce que donne la commande systemctl status clamav-milter.service

● clamav-milter.service - 'ClamAV Milter'
     Loaded: loaded (/usr/lib/systemd/system/clamav-milter.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2021-09-11 20:34:04 CEST; 6s ago
    Process: 292092 ExecStart=/usr/local/sbin/clamav-milter --config-file /usr/local/etc/clamav-milter.conf (code=exited, status=0/SUCCESS)
   Main PID: 292093 (clamav-milter)
      Tasks: 3 (limit: 4677)
     Memory: 2.6M
        CPU: 10ms
     CGroup: /system.slice/clamav-milter.service
             └─292093 /usr/local/sbin/clamav-milter --config-file /usr/local/etc/clamav-milter.conf

sept. 11 20:34:04 mana.kervao.fr systemd[1]: Starting 'ClamAV Milter'...
sept. 11 20:34:04 mana.kervao.fr systemd[1]: Started 'ClamAV Milter'.

Si au lancement vous avez l'erreur suivante

/usr/local/sbin/clamav-milter: --max-children must be given if --external is not given

Vérifiez bien que vous avez décommenté la ligne suivante dans le fichier /usr/local/etc/clamd.conf

# Maximal number of threads running at the same time.
# Default: 10
MaxThreads 20

Maintenant comment sait-on si un virus a été intercepté ? Avec fetchmail quand on récupére le courrier on a un message de ce genre

fetchmail: lecture du message olivier.hoarau@funix.org@pop.pro.proxad.net:36 parmi 37 (3143 octets) fetchmail:   éliminé
fetchmail: Le serveur SMTP a refusé de délivrer le courrier

Pour que le mail soit purement et simplement supprimé. Dans votre fichier .fetchmailrc il faudra rajouter la ligne suivante

 poll pop.fai.net protocol pop3
 user olivier.hoarau@funix.org with password machinchose is olivier here
  options antispam 550 554;

Sinon il restera dans /var/spool/mail. Plus en détail avec journalctl on obtient

sept. 29 17:40:37 ultra.kervao.fr sendmail[658550]: 38TFebXF658550: from=<adriana@spartoo.com>, size=44494, class=0, nrcpts=1, msgid=<0.0.3DE.F.1D9F2E9F7CCA362.0@email.spartoo.com>, bodytype=8BITMIME, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
sept. 29 17:40:37 ultra.kervao.fr sendmail[658550]: 38TFebXF658550: Milter (clmilter) add: header: X-Virus-Scanned: clamav-milter 0.105.1 at ultra.kervao.fr
sept. 29 17:40:37 ultra.kervao.fr sendmail[658550]: 38TFebXF658550: Milter (clmilter) add: header: X-Virus-Status: Clean

Chaque mail se voit rajouter la ligne suivante dans son entête
X-Virus-Scanned: clamav-milter 1.2.0 at ultra.kervao.fr
X-Virus-Status: Clean

 
[Retour page d'accueil FUNIX]