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 , filtrage heuristique, filtrage bayésien , installation de SpamAssassin , installation de razor, installation de DCC, installation de pyzor, configuration de SpamAssassin , prise en compte des spams , interfaçage avec sendmail  , lancement automatique , fonctionnement ) | Mettre en place un anti virus ( Présentation  et installation , configuration , premiers tests , lancement automatique ,  interfaçage avec sendmail ) ]

Dernière modification 30 septembre 2023

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 outils anti spam comme pyzor, razor et DCC qui sont vus également dans cette page. D'abord quelques définitions :

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...


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  razor.sourceforge.net/. On décompresse l'archive en tapant

tar xvfz razor-agents-2.84.tar.gz

Cela donne le répertoire razor-agents-2.84, 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.84 on tape maintenant

perl Makefile.PL

Puis

make

Puis en tant que root

make install

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


oct. 10 08:16:14 mana.kervao.fr spamd[1672]: razor2: part=0 noresponse
oct. 10 08:16:14 mana.kervao.fr spamd[1672]: razor2: results: spam? 0
oct. 10 08:16:14 mana.kervao.fr spamd[1672]: razor2: results: engine 8, highest cf score: 0
oct. 10 08:16:14 mana.kervao.fr spamd[1672]: razor2: results: engine 4, highest cf score: 0

(...)

oct. 10 08:16:14 mana.kervao.fr spamd[1672]: timing: total 1249 ms - read_scoreonly_config: 0.16 (0.0%), signal_user_changed: 1.83 (0.1%), parse: 1.15 (0.1%), extract_message_metadata: 25 (2.0%), get_uri_detail_list: 3.0 (0.2%), tests_pri_-1000: 3.4 (0.3%), tests_pri_-950: 2.3 (0.2%), tests_pri_-900: 2.1 (0.2%), tests_pri_-400: 22 (1.8%), check_bayes: 20 (1.6%), b_tokenize: 10 (0.8%), b_tok_get_all: 4.0 (0.3%), b_comp_prob: 3.2 (0.3%), b_tok_touch_all: 0.31 (0.0%), b_finish: 1.50 (0.1%), tests_pri_0: 1134 (90.8%), check_spf: 0.65 (0.1%), check_dkim_signature: 0.58 (0.0%), check_dkim_adsp: 36 (2.8%), check_dcc: 149 (11.9%), check_pyzor: 171 (13.7%), check_razor2: 592 (47.4%), tests_pri_500: 4.9 (0.4%), tests_pri_1000: 3.2 (0.3%), total_awl: 0.73 (0.1%), rewrite_mail: 0.73 (0.1%), copy_config: 39 (3.1%)

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.0.tar.gz

Cela donne le répertoire Mail-SpamAssassin-4.0.0. 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 lib64maxminddb0

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

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

perl Makefile.PL

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@localhost

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...

***************************************************************************
NOTE: the optional MaxMind::DB::Reader::XS module is not installed.

  Recommended much faster version of the optional MaxMind::DB::Reader module,
  used by RelayCountry / URILocalBL plugins.

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

optional module missing: MaxMind::DB::Reader::XS

warning: some functionality may not be available,
please read the above report before continuing!

Warning: prerequisite Devel::Cycle 0 not found.
Warning: prerequisite Perl::Critic::Policy::Perlsecret 0 not found.
Warning: prerequisite Perl::Critic::Policy::TestingAndDebugging::ProhibitNoStrict 0 not found.
Warning: prerequisite Text::Diff 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

Concernant le warning, j'ai un problème de version de la libraire MaxMind qui est installé sur mon système, ça rajoute juste de la performance au module RelayCountry qui permet de prendre en compte l'origine des mails et d'adapter en fonction du pays, mais ça n'est pas bloquant. On tape alors

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.168. 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

# 09/11/21 19:19:03 CEST  /var/dcc/map
# Re-resolve names after 21:01:06  Check RTTs after 19:34:03
# 1292.08 ms threshold, 1282.97 ms average    12 total, 10 working servers
IPv6 on   version=3

dcc1.dcc-servers.net,-      RTT+1000 ms  anon
#  72.18.213.51,-                                      x.dcc-servers ID 104
#     100% of 32 requests ok  273.71+1000 ms RTT       100 ms queue wait
#  74.92.232.243,-                                          Etherboy ID 1002
#     100% of 32 requests ok  275.47+1000 ms RTT       100 ms queue wait
#  184.23.168.46,-                                             sonic ID 1254
#     100% of 32 requests ok  289.95+1000 ms RTT       100 ms queue wait

dcc2.dcc-servers.net,-      RTT+1000 ms  anon
#  157.131.0.46,-                                              sonic ID 1255
#     100% of 32 requests ok  288.25+1000 ms RTT       100 ms queue wait
#  194.119.212.6,-                                              dcc1 ID 1182
#     100% of 32 requests ok  197.76+1000 ms RTT       100 ms queue wait
#  212.223.15.198,-                                                  ID 1481
#      88% of 32 requests ok  259.88+1000 ms RTT       100 ms queue wait

dcc3.dcc-servers.net,-      RTT+1000 ms  anon
#  69.171.29.33,-                                                    ID 1102
#      not answering
# *192.135.10.194,-                                           debian ID 1169
#     100% of 32 requests ok  181.27+1000 ms RTT       100 ms queue wait

dcc4.dcc-servers.net,-      RTT+1000 ms  anon
#  72.18.213.49,-                                      x.dcc-servers ID 104
#     100% of 32 requests ok  282.47+1000 ms RTT       100 ms queue wait

dcc5.dcc-servers.net,-      RTT+1000 ms  anon
#  192.84.137.21,-                                           INFN-TO ID 1233
#     100% of 32 requests ok  192.08+1000 ms RTT       100 ms queue wait
#  204.90.71.235,-                                       MGTINTERNET ID 1170
#     100% of 32 requests ok  244.54+1000 ms RTT       100 ms queue wait

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

################
# 09/11/21 19:19:03 CEST  greylist /var/dcc/map
# Re-resolve names after 21:18:22 
# 1 total, 0 working servers
# continue not asking greylist server 32 seconds after 1 failures

@,-                         Greylist 32768
# *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.168/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

oct. 10 08:16:13 mana.kervao.fr spamd[1673]: dcc: dccproc responded with 'X-DCC-URT-Metrics: mana.kervao.fr 1060; Body=1 Fuz1=1 Fuz2=1_'
oct. 10 08:16:13 mana.kervao.fr spamd[1673]: rules: ran eval rule __DKIM_DEPENDABLE ======> got hit (1)
oct. 10 08:16:13 mana.kervao.fr spamd[1673]: check: tagrun - tag DCCB is now ready, value: URT
oct. 10 08:16:13 mana.kervao.fr spamd[1673]: check: tagrun - tag DCCR is now ready, value: mana.kervao.fr 1060; Body=1 Fuz1=1 Fuz2=1

(...)

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%)

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

oct. 10 08:16:07 mana.kervao.fr spamd[1672]: pyzor: pyzor is available: /usr/bin/pyzor
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: dns: entering helper-app run mode
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: pyzor: opening pipe: /usr/bin/pyzor check < /tmp/.spamassassin167281DDAKtmp
oct. 10 08:16:07 mana.kervao.fr spamd[2520]: util: setuid: ruid=8 euid=8
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: pyzor: [2520] finished: exit 1
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: pyzor: got response: public.pyzor.org:24441 (200, 'OK') 0 0
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: dns: leaving helper-app run mode
oct. 10 08:16:07 mana.kervao.fr spamd[1672]: check: tagrun - tag PYZOR is now ready, value: Reported 0 times.

(...)

oct. 10 08:16:15 mana.kervao.fr spamd[1673]: timing: total 1938 ms - read_scoreonly_config: 0.19 (0.0%), signal_user_changed: 2.9 (0.1%), parse: 1.58 (0.1%), extract_message_metadata: 13 (0.7%), get_uri_detail_list: 3.0 (0.2%), tests_pri_-1000: 3.7 (0.2%), tests_pri_-950: 2.4 (0.1%), tests_pri_-900: 1.81 (0.1%), tests_pri_-400: 22 (1.1%), check_bayes: 20 (1.0%), b_tokenize: 12 (0.6%), b_tok_get_all: 2.8 (0.1%), b_comp_prob: 1.96 (0.1%), b_tok_touch_all: 0.19 (0.0%), b_finish: 1.61 (0.1%), tests_pri_0: 1827 (94.3%), check_spf: 0.72 (0.0%), check_dkim_signature: 0.70 (0.0%), check_dkim_adsp: 43 (2.2%), check_dcc: 148 (7.7%), check_pyzor: 166 (8.6%), check_razor2: 1175 (60.6%), tests_pri_500: 4.1 (0.2%), tests_pri_1000: 2.7 (0.1%), total_awl: 0.76 (0.0%), rewrite_mail: 0.63 (0.0%), copy_config: 39 (2.0%)



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 à v400.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

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.

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 #.


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


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 2023-09-30 08:31:21 CEST; 6s ago
    Process: 677318 ExecStart=/usr/local/bin/spamd -d -u mail -H /var/spool/mail --pidfile /var/run/spamd.pid (code=exited, status=0/SUCCESS)
   Main PID: 677320 (spamd)
      Tasks: 3 (limit: 9264)
     Memory: 125.8M
        CPU: 2.833s
     CGroup: /system.slice/spamassassin.service
             ├─677320 spamd
             ├─677326 "spamd child"
             └─677327 "spamd child"

sept. 30 08:31:13 ultra.kervao.fr systemd[1]: Starting spamassassin.service...
sept. 30 08:31:13 ultra.kervao.fr spamd[677318]: logger: removing stderr method
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: spamd: server started on IO::Socket::IP [::1]:783, IO::Socket::IP [127.0.0.1]:783 (running version 4.0.0)
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: spamd: server pid: 677320
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: spamd: server successfully spawned child process, pid 677326
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: spamd: server successfully spawned child process, pid 677327
sept. 30 08:31:21 ultra.kervao.fr systemd[1]: Started spamassassin.service.
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: prefork: child states: IS
sept. 30 08:31:21 ultra.kervao.fr spamd[677320]: 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

Voilà  c'est fait, plus besoin de modifier le fichier .procmailrc (il peut être vide) sendmail va s'en charger pour vous en amont.

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.

Vous trouverez ici une idée de ce que donne journalctl -f avec un lancement en mode debug du daemon spamd à la réception d'un spam. A noter qu'il faut au moins 200 spams dans la base de données bayésienne pour que le filtre puisse fonctionner. Dans le cas de la mise à  jour, vous pouvez très bien récupérer vos fichiers bayes_seen et bayes_toks et les placer sous /var/spool/mail/.spamassassin avant lancement du daemon.
Voilà ce que ça donne en réception d'un spam (mode non debug) avec un spam

sept. 29 18:32:54 ultra.kervao.fr spamd[660514]: spamd: processing message <pdKgpIf.65482.900.HeB@spenden-malteser.online> for olivier:8
sept. 29 18:32:59 ultra.kervao.fr spamd[660514]: dcc: [660565] dccproc terminated: exit 241
sept. 29 18:33:00 ultra.kervao.fr spamd[660514]: spamd: identified spam (9.8/5.0) for olivier:8 in 5.8 seconds, 13041 bytes.
sept. 29 18:33:00 ultra.kervao.fr spamd[660514]: spamd: result: Y  9 - BAYES_60,FROM_SUSPICIOUS_NTLD,FROM_SUSPICIOUS_NTLD_FP,HK_RANDOM_FROM,HTML_MESSAGE,LOCALPART_IN_SUBJECT,MIME_HTML_ONLY,RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L3,RCVD_IN_SBL_CSS,RDNS_NONE,SPF_HELO_PASS,TO_NAME_SUBJ_NO_RDNS,T_REMOTE_IMAGE scantime=5.8,size=13041,user=olivier,uid=8,required_score=5.0,rhost=::1,raddr=::1,rport=38798,mid=<pdKgpIf.65482.900.HeB@spenden-malteser.online>,bayes=0.771229,autolearn=no autolearn_force=no,shortcircuit=no
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) add: header: X-Spam-Flag: YES
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) add: header: X-Spam-Status: Yes, score=9.8 required=5.0 tests=BAYES_60,FROM_SUSPICIOUS_NTLD,\n\tFROM_SUSPICIOUS_NTLD_FP,HK_RANDOM_FROM,HTML_MESSAGE,\n\tLOCALPART_IN_SUBJECT,MIME_HTML_ONLY,RCVD_IN_MSPIKE_BL,\n\tRCVD_IN_MSPIKE_L3,RCVD_IN_SBL_CSS,RDNS_NONE,SPF_HELO_PASS,\n\tTO_NAME_SUBJ_NO_RDNS,T_REMOTE_IMAGE shortcircuit=no autolearn=no\n\tautolearn_force=no version=4.0.0
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) add: header: X-Spam-Level: *********
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) add: header: X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-14) on ultra.kervao.fr
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) change: header Subject: from   olivier.hoarau, =?UTF-8?B?TnV0emVuIFNpZSBJaHJlIENoYW5jZSwgZWluIEFwcGxlIGlQaG9uZSAxNSBQcm8genUgZ2V3aW5uZW4h?= to *****SPAM***** olivier.hoarau, =?UTF-8?B?TnV0emVuIFNpZSBJaHJlIENoYW5jZSwgZWluIEFwcGxlIGlQaG9uZSAxNSBQcm8genUgZ2V3aW5uZW4h?=
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) change: header Content-Type: from  text/html; charset=UTF-8 to multipart/mixed; boundary="----------=_6516FC3C.6CD835A9"
sept. 29 18:33:00 ultra.kervao.fr sendmail[660558]: 38TGWsSQ660558: Milter (spamassassin) message: body replaced
sept. 29 18:33:00 ultra.kervao.fr spamd[660508]: prefork: child states: II
sept. 29 18:33:00 ultra.kervao.fr fetchmail[660550]: lecture du message olivier.hoarau@funix.org@pop.online.net:1 parmi 2 (12562 octets) éliminé
sept. 29 18:33:00 ultra.kervao.fr sendmail[660568]: 38TGWsSQ660558: to=<olivier@localhost>, delay=00:00:06, xdelay=00:00:00, mailer=local, pri=47936, dsn=2.0.0, stat=Sent



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

Return-Path: <firewall@rufflandkennels.us>
Received: from online.net
        by online.net (8.17.1/8.17.1/Sendmail de FUNIX) with ESMTP id 38U6gXNt677427
        for <olivier@localhost>; Sat, 30 Sep 2023 08:42:33 +0200
Delivered-To: <olivier.hoarau@funix.org>
Received: from pop.online.net [62.210.16.34]
        by ultra.kervao.fr with POP3 (fetchmail-6.4.34)
        for <olivier@localhost> (single-drop); Sat, 30 Sep 2023 08:42:33 +0200 (CEST)
Received: from par1-wbh-prd-eximproxy02.internal.scaleway.com ([10.42.126.8])
        by exim-backend-x-trusty.mutu.online.net (Dovecot) with LMTP id zfOGOzkqF2WOLgAA6t61wQ
        for <olivier.hoarau@funix.org>; Fri, 29 Sep 2023 21:49:40 +0200
Received: from Debian-exim by par1-wbh-prd-eximproxy02.internal.scaleway.com with spam-scanned (Exim 4.93)
        (envelope-from <firewall@rufflandkennels.us>)
        id 1qmJUZ-0011s5-ON
        for r=dovecot+f=17+a=olivier.hoarau@funix.org; Fri, 29 Sep 2023 21:49:40 +0200
X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-14) on ultra.kervao.fr
Received: from [10.41.2.137] (helo=firewall.rufflandkennels.us)
        by par1-wbh-prd-eximproxy02.internal.scaleway.com with esmtp (Exim 4.93)
        (envelope-from <firewall@rufflandkennels.us>)
        id 1qmJUZ-0011s0-Kf
        for olivier.hoarau@funix.org; Fri, 29 Sep 2023 21:49:39 +0200
Received: from firewall.rufflandkennels.us ([45.141.59.47])
        by mx-vit.online.net (MXproxy) for olivier.hoarau@funix.org ;
        Fri, 29 Sep 2023 21:49:39 +0200 (CEST)
X-ProXaD-SC: state=SPAM score=240
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=root; d=rufflandkennels.us;
 h=From:Subject:To:Content-Type:MIME-Version:Date:Message-ID;
 i=firewall@rufflandkennels.us;
 bh=hDGfx2/Yv0GGvSDQrjmhtfNilXE2h1OHqh9661pCYLY=;
 b=WJdWnP8LXYNYnT34gdElk0S8idHpLclRWx/cQjtxRxkr/Z6rQAxP9RZrCnLiQTxc9IghL9Qktnjn
   WnmCFGfH0GI9dxH9id38lOuuEWhz0yTeKASoSWqKngEgbzUQZbHuednxd2UZF+WkHGoy//qT0ZT6
   wQE/I0FgIZdl7/zDNHU=
From: "Apotheke" <firewall@rufflandkennels.us>
Subject: *****SPAM***** olivier hoarau r-ezeptfrei anfordern
To: "olivier.hoarau" <olivier.hoarau@funix.org>
Content-Type: multipart/mixed; boundary="----------=_6517C360.9F396276"
MIME-Version: 1.0
Date: Fri, 29 Sep 2023 21:48:20 +0200
Message-ID: <0.0.9.183.1D9F30DE5F2C558.0@firewall.rufflandkennels.us>
X-online-proxy-in: FLEX_TVc0MG8wNk1PWTZVa3l5SQ==34dnEIREGlnsaVEbPACglK+9zqG0GQga
X-online-to: olivier.hoarau@funix.org
X-original-for: r=dovecot+f=17+a=olivier.hoarau@funix.org
X-Virus-Scanned: clamav-milter 0.105.1 at ultra.kervao.fr
X-Virus-Status: Clean
X-Spam-Flag: YES
X-Spam-Status: Yes, score=8.0 required=5.0 tests=BAYES_99,BAYES_999,
        DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,HTML_MESSAGE,
        RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L4,RDNS_NONE,SPF_HELO_NONE,
        URIBL_ABUSE_SURBL,URIBL_BLOCKED,URIBL_DBL_SPAM shortcircuit=no
        autolearn=no autolearn_force=no version=4.0.0
X-Spam-Level: ********

This is a multi-part message in MIME format.

------------=_6517C360.9F396276
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 à the administrator of that system .

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

Détails de l'analyse du message:   (8.0 points, 5.0 requis)
 2.5 URIBL_DBL_SPAM         Contains a spam URL listed in the Spamhaus DBL
                            blocklist
                            [URI: www.discounterpillen.nl]
 0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 1.2 URIBL_ABUSE_SURBL      Contains an URL listed in the ABUSE SURBL blocklist
                            [URI: www.discounterpillen.nl]
 0.0 URIBL_BLOCKED          ADMINISTRATOR NOTICE: The query to URIBL was blocked.
                            See
                            http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block
                             for more information.
                            [URI: rufflandkennels.us]
                            [URI: discounterpillen.nl]
 0.0 RCVD_IN_MSPIKE_L4      RBL: Bad reputation (-4)
                            [45.141.59.47 listed in bl.mailspike.net]
-0.1 DKIM_VALID             Message has at least one valid DKIM or DK signature
-0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from author's
                            domain
 0.1 DKIM_SIGNED            Message has a DKIM or DK signature, not necessarily valid
-0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from
                            envelope-from domain
 0.0 RCVD_IN_MSPIKE_BL      Mailspike blocklisted
 0.2 BAYES_999              BODY: L'algorithme Bayésien a évalué la probabilité de spam
                             entre 99.9 et 100%
                            [score: 1.0000]
 3.5 BAYES_99               BODY: L'algorithme Bayésien a évalué la probabilité de spam
                            entre 99 et 100%
                            [score: 1.0000]
 0.0 HTML_MESSAGE           BODY: HTML inclus dans le message
 0.8 RDNS_NONE              Delivered to internal network by a host with no rDNS

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

Le message original n'étant pas au format text brut, il est peut-être
dangereux de l'ouvrir avec votre logiciel e-mail ; en particulier il
pourrait contenir un virus, ou confirmer à l'expéditeur que votre
adresse e-mail est active, et peut recevoir du spam. Si vous voulez
lire ce message, et n'êtes pas certain de la sécurité de votre logiciel
e-mail, il est plus prudent d'enregistrer ce message sur votre disque
dur, et de l'afficher ensuite avec un éditeur de texte.

Chaque mail reçoit les informations suivantes en en tête du style

X-Spam-Status: Yes, score=13.9 required=5.0 tests=BAYES_50,DKIM_ADSP_NXDOMAIN,
        FSL_BULK_SIG,FSL_HELO_NON_FQDN_1,HELO_LOCALHOST,HTML_MESSAGE,
        MIME_HTML_ONLY,RAZOR2_CF_RANGE_51_100,RAZOR2_CHECK,RCVD_IN_SORBS_WEB,
        RCVD_IN_VALIDITY_RPBL,RDNS_NONE,URIBL_ABUSE_SURBL,URIBL_BLOCKED,
        URIBL_PH_SURBL shortcircuit=no autolearn=spam autolearn_force=no
        version=4.0.0
X-Spam-Level: *************

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.0
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.0

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.

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.2.0.tar.gz

Cela donne clamav-1.2.0 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.2.0 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.2.0
    libclamav version:      12:1: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.4.9-desktop-4.mga9
    Target system:          Linux-6.4.9-desktop-4.mga9
    Compiler:              
        Build type:         RelWithDebInfo
        C compiler:         /usr/bin/cc
        C++ compiler:       /usr/bin/c++
        Rust toolchain:     /usr/bin/cargo (1.70.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      not found
        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 (19.0s)
-- Generating done (0.4s)
-- Build files have been written to: /usr/local/linux/mail/clamav-1.2.0/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

# With this option clamav will try to detect broken executables (both PE and
# ELF) and mark them as Broken.Executable.
# Default: no
DetectBrokenExecutables 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.2.0 en tant que simple utilisateur

clamscan -r -l log.txt clamav-1.2.0

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: 8673658
Engine version: 1.2.0
Scanned directories: 1801
Scanned files: 13763
Infected files: 49
Data scanned: 2630.91 MB
Data read: 1954.63 MB (ratio 1.35:1)
Time: 438.421 sec (7 m 18 s)
Start Date: 2023:09:29 17:31:32
End Date:   2023:09:29 17:38:50

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 Fri 2023-09-29 17:57:34 CEST; 2min 2s ago
   Main PID: 659581 (clamd)
      Tasks: 2 (limit: 9264)
     Memory: 443.9M
        CPU: 6.131s
     CGroup: /system.slice/clamd.service
             └─659581 /usr/local/sbin/clamd -c /etc/clamd.conf

sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: ELF support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: Mail files support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: Mail: RFC1341 handling enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: OLE2 support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: PDF support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: SWF support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: HTML support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: XMLDOCS support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: HWP3 support enabled.
sept. 29 17:57:41 ultra.kervao.fr clamd[659581]: 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 0.105.1 at mana.kervao.fr
X-Virus-Status: Clean


 
[Retour page d'accueil FUNIX]