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


[ 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 24 décembre 2016

Lutte anti spam et 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 complètement interfaçables à  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.

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 bayesienne 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émanthique 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.

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

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

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 -MCPAN -e shell
install Net::CIDR::Lite
install Net::Patricia

Maintenant revenons dans le répertoire Mail-SpamAssassin-3.4.1 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 customise what tests are run, and how.

checking module dependencies and their versions...
checking binary dependencies and their versions...

***************************************************************************
NOTE: the optional fetch binary is not installed.

   Sa-update will use curl, wget or fetch to download updates. 
   Because perl module LWP does not support IPv6, sa-update as of
   3.4.0 will use these standard programs to download rule updates
   leaving LWP as a fallback if none of the programs are found.

   *IMPORTANT NOTE*: You only need one of these programs.

dependency check complete...

optional binary missing or nonfunctional: fetch

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

Generating a Unix-style Makefile
Writing Makefile for Mail::SpamAssassin
Writing MYMETA.yml and MYMETA.json
Makefile written by ExtUtils::MakeMaker 6.98

Concernant le warning, pas d'inquiétude si vous avez curl ou wget installé sur votre système. 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 whiteliste (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-1.3.158. 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

# 10/04/15 11:28:27 CEST  /var/dcc/map
# Re-resolve names after 13:28:15  Check RTTs after 11:43:26
# 1257.96 ms threshold, 1237.35 ms average    12 total, 11 working servers
IPv6 on   version=3

dcc1.dcc-servers.net,-      RTT+1000 ms  anon
#  74.92.232.243,-                                          Etherboy ID 1002
#     100% of  1 requests ok  211.81+1000 ms RTT       100 ms queue wait
#  209.169.14.27,-                                     x.dcc-servers ID 104
#     100% of  1 requests ok  254.24+1000 ms RTT       100 ms queue wait
#  209.169.14.30,-                                     x.dcc-servers ID 104
#     100% of  1 requests ok  254.26+1000 ms RTT       100 ms queue wait

dcc2.dcc-servers.net,-      RTT+1000 ms  anon
#  67.66.138.141,-                                                   ID 1356
#     100% of  1 requests ok  240.42+1000 ms RTT       100 ms queue wait
#  69.12.208.70,-                                          sonic.net ID 1156
#     100% of  1 requests ok  280.20+1000 ms RTT       100 ms queue wait
#  194.119.212.6,-                                              dcc1 ID 1182
#     100% of  1 requests ok  173.16+1000 ms RTT       100 ms queue wait

dcc3.dcc-servers.net,-      RTT+1000 ms  anon
#  38.124.232.176,-                                                  ID 1102
#     100% of  1 requests ok  207.19+1000 ms RTT       100 ms queue wait
#  209.169.14.29,-                                     x.dcc-servers ID 104
#     100% of  1 requests ok  254.25+1000 ms RTT       100 ms queue wait

dcc4.dcc-servers.net,-      RTT+1000 ms  anon
#  192.135.10.194,-                                           debian ID 1169
#     100% of  1 requests ok  162.00+1000 ms RTT       100 ms queue wait

dcc5.dcc-servers.net,-      RTT+1000 ms  anon
# *136.199.199.160,-                                             URT ID 1060
#     100% of  1 requests ok  137.34+1000 ms RTT       100 ms queue wait
#  192.84.137.21,-                                           INFN-TO ID 1233
#     100% of  1 requests ok  157.96+1000 ms RTT       100 ms queue wait

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

################
# 10/04/15 11:28:27 CEST  greylist /var/dcc/map
# Re-resolve names after 13:28:20 
# 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-1.3.158/homedir/map.txt. Dans ce dernier répertoire on trouve également le fichier whitelist, pour avoir la syntaxe il faut jeter un coup d'oeil 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 pyzor.sourceforge.net, on décompresse l'archive en tapant

tar xvfj pyzor-0.7.0.tar.bz2

Cela donne le répertoire pyzor-0.7.0 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 et v341.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. A noter qu'on peut générer un fichier de config interactivement à  la page www.yrex.com/spam/spamconfig.php.

Voilà le contenu du fichier init.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 contains plugin activation commands for plugins included
# in SpamAssassin 3.0.x releases.  It will not be installed if you
# already have a file in place called "init.pre".
#
# 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.
###########################################################################

# 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

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

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

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

# 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


et voilà  mon fichier local.cf

# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
# Only a small subset of options are listed below
#
###########################################################################

#   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


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


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


#   Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn 1


#   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_WHITELIST       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_BLACKLIST       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 # Mail::SpamAssassin::Plugin::Shortcircuit

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.


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 /home/user/.spamassasin/user_prefs la ligne

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

Dans ce répertoire on retrouve un fichier de préférence local qui a pour nom user_prefs. Plus d'info sur le fichier de configuration de SpamAssassin à  cet endroit http://spamassassin.org/doc/Mail_SpamAssassin_Conf.html

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

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)
   Active: active (running) since dim. 2015-10-04 21:18:02 CEST; 8s ago
  Process: 1982 ExecStart=/usr/local/bin/spamd -d -D -u mail -H /var/spool/mail --pidfile /var/run/spamd.pid (code=exited, status=0/SUCCESS)
 Main PID: 1984 (spamd)
   CGroup: /system.slice/spamassassin.service
           ├─1984 /usr/bin/perl -T -w /usr/local/bin/spamd -d -D -u mail -H /var/spool/mail --pidfile /var/run/spamd.pid
           ├─1988 spamd child
           └─1989 spamd child

oct. 04 21:18:02 mana.kervao.fr spamd[1989]: plugin: Mail::SpamAssassin::Plugin::Bayes=HASH(0x24e3858) implements 'spamd_child_init', priority 0
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: child 1988: entering state 1
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: new lowest idle kid: 1988
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: child reports idle
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: child states: IS
oct. 04 21:18:02 mana.kervao.fr spamd[1989]: prefork: sysread(12) not ready, wait max 300.0 secs
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: child 1989: entering state 1
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: new lowest idle kid: 1988
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: prefork: child reports idle
oct. 04 21:18:02 mana.kervao.fr spamd[1984]: 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)
   Active: active (running) since dim. 2015-10-04 21:30:36 CEST; 5s ago
 Main PID: 2274 (spamass-milter)
   CGroup: /system.slice/spamass-milter.service
           └─2274 /usr/local/sbin/spamass-milter -d 3 -u mail -p /var/run/spamass.sock

oct. 04 21:30:36 mana.kervao.fr spamass-milter[2274]: Setting debug level to 0x3f
oct. 04 21:30:36 mana.kervao.fr spamass-milter[2274]: smfi_register succeeded
oct. 04 21:30:36 mana.kervao.fr spamass-milter[2274]: 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. l'AWL est activé par défaut, pour le désactiver dans le fichier /etc/mail/spamassassin/local.cf il suffit de rajouter la ligne

use_auto_whitelist 0

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)

oct. 10 08:26:06 mana.kervao.fr spamd[4025]: logger: removing stderr method
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: spamd: server started on IO::Socket::IP [::1]:783, IO::Socket::IP [127.0.0.1]:783 (running version 3.4.1)
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: spamd: server pid: 4027
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: spamd: server successfully spawned child process, pid 4031
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: spamd: server successfully spawned child process, pid 4032
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: prefork: child states: IS
oct. 10 08:26:10 mana.kervao.fr spamd[4027]: prefork: child states: II
oct. 10 08:26:30 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: from=<Benkyi@hinet.net>, size=4903, class=0, nrcpts=1, msgid=<DE97D6B6.9CC36D3B@hinet.net>, bodytype=7BIT, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
oct. 10 08:26:30 mana.kervao.fr spamd[4031]: spamd: connection from mana.kervao.fr [::1]:49009 to port 783, fd 5
oct. 10 08:26:30 mana.kervao.fr spamd[4031]: spamd: processing message <DE97D6B6.9CC36D3B@hinet.net> for olivier:8
oct. 10 08:26:32 mana.kervao.fr spamd[4031]: spamd: identified spam (30.2/4.0) for olivier:8 in 2.3 seconds, 5266 bytes.
oct. 10 08:26:32 mana.kervao.fr spamd[4031]: spamd: result: Y 30 - BAYES_99,BAYES_999,CK_HELO_DYNAMIC_SPLIT_IP,CK_HELO_GENERIC,GOOG_REDIR_NORDNS,HELO_DYNAMIC_IPADDR2,HTML_MESSAGE,HTTP_EXCESSIVE_ESCAPES,IMPOTENCE,MIME_HTML_ONLY,RCVD_IN_BRBL_LASTEXT,RCVD_IN_PBL,RCVD_IN_RP_RNBL,RCVD_IN_XBL,RDNS_NONE,TVD_RCVD_SPACE_BRACKET,T_ANY_PILL_PRICE,UNPARSEABLE_RELAY,URIBL_BLACK,URIBL_DBL_SPAM,URIBL_JP_SURBL,URIBL_SBL,URIBL_SBL_A,URIBL_WS_SURBL scantime=2.3,size=5266,user=olivier,uid=8,required_score=4.0,rhost=mana.kervao.fr,raddr=::1,rport=49009,mid=<DE97D6B6.9CC36D3B@hinet.net>,bayes=1.000000,autolearn=unavailable autolearn_force=no
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter add: header: X-Spam-Flag: YES
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter add: header: X-Spam-Status: Yes, score=30.2 required=4.0 tests=BAYES_99,BAYES_999,\n\tCK_HELO_DYNAMIC_SPLIT_IP,CK_HELO_GENERIC,GOOG_REDIR_NORDNS,\n\tHELO_DYNAMIC_IPADDR2,HTML_MESSAGE,HTTP_EXCESSIVE_ESCAPES,IMPOTENCE,\n\tMIME_HTML_ONLY,RCVD_IN_BRBL_LASTEXT,RCVD_IN_PBL,RCVD_IN_RP_RNBL,RCVD_IN_XBL,\n\tRDNS_NONE,TVD_RCVD_SPACE_BRACKET,T_ANY_PILL_PRICE,UNPARSEABLE_RELAY,\n\tURIBL_BLACK,URIBL_DBL_SPAM,URIBL_JP_SURBL,URIBL_SBL,URIBL_SBL_A,\n\tURIBL_WS_SURBL autolearn=unavailable autolearn_force=no version=3.4.1
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter add: header: X-Spam-Level: ******************************
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter add: header: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mana.kervao.fr
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter change: header Content-Type: from  text/html;\n\tcharset="UTF-8" to multipart/mixed; boundary="----------=_5618AF98.65DFB357"
oct. 10 08:26:32 mana.kervao.fr sendmail[4042]: t9A6QUn6004042: Milter message: body replaced
oct. 10 08:26:32 mana.kervao.fr spamd[4027]: prefork: child states: II
oct. 10 08:26:32 mana.kervao.fr sendmail[4047]: t9A6QUn6004042: to=<olivier@localhost>, delay=00:00:02, xdelay=00:00:00, mailer=local, pri=42382, dsn=2.0.0, stat=Sent


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

From Benkyi@hinet.net  Sat Oct 10 08:26:32 2015
Return-Path: <Benkyi@hinet.net>
Received: from fai.fr
        by fai.fr (8.15.1/8.15.1/Sendmail de FUNIX) with ESMTP id t9A6QUn6004042
        for <olivier@localhost>; Sat, 10 Oct 2015 08:26:30 +0200
Delivered-To: <olivier.hoarau@funix.org>
Received: from pop.online.net [62.210.16.34]
        by mana.kervao.fr with POP3 (fetchmail-6.3.26)
        for <olivier@localhost> (single-drop); Sat, 10 Oct 2015 08:26:30 +0200 (CEST)
Received: from exim-proxy-1.online.net ([10.42.2.124])
        by exim-backend-17.online.net (Dovecot) with LMTP id +YoSKz+VGFY8GgAAi1FXbQ
        for <olivier.hoarau@funix.org>; Sat, 10 Oct 2015 06:37:00 +0200
Received: from [10.42.2.120] (helo=111-253-90-139.dynamic.hinet.net)
        by exim-proxy-1.online.net with esmtp (Exim 4.76)
        (envelope-from <Benkyi@hinet.net>)
        id 1Zklu0-0006fE-Dl
        for olivier.hoarau@funix.org; Sat, 10 Oct 2015 06:37:00 +0200
Received: from 111-253-90-139.dynamic.hinet.net ([111.253.90.139])
        by mx-vit.online.net (MXproxy) for olivier.hoarau@funix.org ;
        Sat, 10 Oct 2015 06:16:06 +0200 (CEST)
X-ProXaD-SC: state=SPAM score=300
Received: from snmp.otwaloow.com ([Fri, 09 Oct 2015 20:36:37 -0700])
        by snmp.otwaloow.com with ASMTP; Fri, 09 Oct 2015 20:36:37 -0700
Message-ID: <DE97D6B6.9CC36D3B@hinet.net>
Date: Fri, 09 Oct 2015 20:36:37 -0700
Reply-To: "Shirley" <Benkyi@hinet.net>
From: "Shirley" <Benkyi@hinet.net>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.6a) Gecko/20031030
X-Accept-Language: en-us
MIME-Version: 1.0
To: "Shirley" <olivier.hoarau@funix.org>
Subject: Perfect sexual activity and longevity can be achieved with the help of these nice little pills!
Content-Type: multipart/mixed; boundary="----------=_5618AF98.65DFB357"
Content-Transfer-Encoding: 7bit
X-online-proxy-in: FLEX_NE9LczhXR0lPeVN5c3lzaw==uxDrwFiP0cgbr1/ulm28FoeUko7Nz/te
X-online-to: olivier.hoarau@funix.org
X-original-for: olivier.hoarau@funix.org
X-Spam-Flag: YES
X-Spam-Status: Yes, score=30.2 required=4.0 tests=BAYES_99,BAYES_999,
        CK_HELO_DYNAMIC_SPLIT_IP,CK_HELO_GENERIC,GOOG_REDIR_NORDNS,
        HELO_DYNAMIC_IPADDR2,HTML_MESSAGE,HTTP_EXCESSIVE_ESCAPES,IMPOTENCE,
        MIME_HTML_ONLY,RCVD_IN_BRBL_LASTEXT,RCVD_IN_PBL,RCVD_IN_RP_RNBL,RCVD_IN_XBL,
        RDNS_NONE,TVD_RCVD_SPACE_BRACKET,T_ANY_PILL_PRICE,UNPARSEABLE_RELAY,
        URIBL_BLACK,URIBL_DBL_SPAM,URIBL_JP_SURBL,URIBL_SBL,URIBL_SBL_A,
        URIBL_WS_SURBL autolearn=unavailable autolearn_force=no version=3.4.1
X-Spam-Level: ******************************
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mana.kervao.fr

This is a multi-part message in MIME format.

------------=_5618AF98.65DFB357
Content-Type: text/plain; charset=UTF-8
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 "mana.kervao.fr", pour vous
aider à identifier ce type de messages.

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

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

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

Détails de l'analyse du message:   (30.2 points, 4.0 requis)
 3.5 BAYES_99               BODY: L'algorithme Bayésien a évalué la probabilité de spam
                            entre 99 et 100%
                            [score: 1.0000]
 0.2 CK_HELO_GENERIC        Relay used name indicative of a Dynamic Pool or
                            Generic rPTR
 1.5 CK_HELO_DYNAMIC_SPLIT_IP Relay HELO'd using suspicious hostname
                            (Split IP)
 0.0 TVD_RCVD_SPACE_BRACKET No description available.
 1.6 URIBL_WS_SURBL         Contains an URL listed in the WS SURBL blocklist
                            [URIs: purecuringcompany.ru]
 1.2 URIBL_JP_SURBL         Contains an URL listed in the JP SURBL blocklist
                            [URIs: purecuringcompany.ru]
 1.3 RCVD_IN_RP_RNBL        RBL: Relay in RNBL,
                            https://senderscore.org/blacklistlookup/
                           [111.253.90.139 listed in bl.score.senderscore.com]
 2.5 URIBL_DBL_SPAM         Contains a spam URL listed in the DBL blocklist
                            [URIs: purecuringcompany.ru]
 1.7 URIBL_BLACK            Contains an URL listed in the URIBL blacklist
                            [URIs: purecuringcompany.ru]
 3.3 RCVD_IN_PBL            RBL: Received via a relay in Spamhaus PBL
                            [111.253.90.139 listed in zen.spamhaus.org]
 0.4 RCVD_IN_XBL            RBL: Received via a relay in Spamhaus XBL
 1.4 IMPOTENCE              BODY: Prétend permettre de combattre l'impuissance
 1.6 HTTP_EXCESSIVE_ESCAPES URI: URI: Contient des %-escapes nombreux et
                            superflus
 0.7 MIME_HTML_ONLY         BODY: Le message possède uniquement des parties MIME
                            text/html
 0.0 HTML_MESSAGE           BODY: HTML inclus dans le message
 0.2 BAYES_999              BODY: L'algorithme Bayésien a évalué la probabilité de spam
                             entre 99.9 et 100%
                            [score: 1.0000]
 1.4 RCVD_IN_BRBL_LASTEXT   RBL: No description available.
                            [111.253.90.139 listed in bb.barracudacentral.org]
 0.1 URIBL_SBL_A            Contains URL's A record listed in the SBL blocklist
                            [URIs: purecuringcompany.ru]
 1.6 URIBL_SBL              Contains an URL's NS IP listed in the SBL blocklist
                            [URIs: purecuringcompany.ru]
 3.6 HELO_DYNAMIC_IPADDR2   Relay HELO'd using suspicious hostname (IP addr
                            2)
 0.0 UNPARSEABLE_RELAY      Informational: message has unparseable relay lines
 0.8 RDNS_NONE              Delivered to internal network by a host with no rDNS
 1.4 GOOG_REDIR_NORDNS      Google redirect to obscure spamvertised website +
                            no rDNS
 0.0 T_ANY_PILL_PRICE       Prices for pills

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


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

X-Spam-Flag: YES
X-Spam-Status: Yes, score=30.2 required=4.0 tests=BAYES_99,BAYES_999,
        CK_HELO_DYNAMIC_SPLIT_IP,CK_HELO_GENERIC,GOOG_REDIR_NORDNS,
        HELO_DYNAMIC_IPADDR2,HTML_MESSAGE,HTTP_EXCESSIVE_ESCAPES,IMPOTENCE,
        MIME_HTML_ONLY,RCVD_IN_BRBL_LASTEXT,RCVD_IN_PBL,RCVD_IN_RP_RNBL,RCVD_IN_XBL,
        RDNS_NONE,TVD_RCVD_SPACE_BRACKET,T_ANY_PILL_PRICE,UNPARSEABLE_RELAY,
        URIBL_BLACK,URIBL_DBL_SPAM,URIBL_JP_SURBL,URIBL_SBL,URIBL_SBL_A,
        URIBL_WS_SURBL autolearn=unavailable autolearn_force=no version=3.4.1
X-Spam-Level: ******************************
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mana.kervao.fr



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 du ê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


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

Cela donne clamav-0.99.2 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-0.99.2 on doit taper

./configure --sysconfdir=/etc --enable-milter --with-openssl=/usr/local

L'option sysconfdir permet de retrouver le fichier de configuration sous /etc, l'option enable-milter est nécessaire si vous utilisez sendmail, attention dans ce dernier cas, installez le package sendmail-devel omettez cette dernière option si vous n'utilisez pas sendmail.

voilà le résultat

configure: Summary of detected features follows
              OS          : linux-gnu
              pthreads    : yes (-lpthread)
configure: Summary of miscellaneous features
              check       : no (auto)
              fanotify    : yes
              fdpassing   : 1
              IPv6        : yes
configure: Summary of optional tools
              clamdtop    : -lncurses (auto)
              milter      : yes
              clamsubmit  : no (Please use the web interface for submitting FPs/FNs.)
configure: Summary of engine performance features
              release mode: yes
              llvm        : yes, from built-in (auto)
              mempool     : yes
configure: Summary of engine detection features
              bzip2       : ok
              zlib        : /usr
              unrar       : yes
              pcre        : /usr
              libxml2     : yes, from /usr
              yara        : yes


On tape ensuite sous clamav-0.99.2

make

A noter que j'ai utilisé la version 1.0.2d d'OpenSSL car avec la dernière 1.1.0c j'avais cette erreur

crypto.c: In function ‘cl_load_crl’:
crypto.c:1113:32: erreur: déréférencement d'un pointeur de type incomplet
         tm = cl_ASN1_GetTimeT(x->crl->nextUpdate);
                                ^
si vous avez l'erreur suivante

bytecode2llvm.cpp:189:25: fatal error: openssl/ssl.h: No such file or directory
 #include <openssl/ssl.h>

j'ai créé ce lien en tant que root

ln -s /usr/local/ssl/include/openssl /usr/local/include

on retape 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 /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 /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 /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 voilà le résultat:

ClamAV update process started at Sun Oct  4 21:48:27 2015
Downloading main.cvd [100%]
main.cvd updated (version: 55, sigs: 2424225, f-level: 60, builder: neo)
Downloading daily.cvd [100%]
daily.cvd updated (version: 20952, sigs: 1589971, f-level: 63, builder: jesler)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 268, sigs: 47, f-level: 63, builder: anvilleg)
Database updated (4014243 signatures) from db.fr.clamav.net (IP: 178.33.105.132)

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-0.99.2 en tant que simple utilisateur

clamscan -r -l log.txt clamav-0.99.2/

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: 5357163
Engine version: 0.99.2
Scanned directories: 254
Scanned files: 5371
Infected files: 50
Data scanned: 272.46 MB
Data read: 170.53 MB (ratio 1.60:1)
Time: 39.734 sec (0 m 39 s)

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 --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 -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 /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)
   Active: active (running) since dim. 2015-10-04 21:52:59 CEST; 8s ago
 Main PID: 2787 (clamd)
   CGroup: /system.slice/clamd.service
           └─2787 /usr/local/sbin/clamd -c /etc/clamd.conf


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

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

[Service]
Type=forking
ExecStart=/usr/local/sbin/clamav-milter --config-file /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)
   Active: active (running) since dim. 2015-10-04 20:59:53 CEST; 55min ago
 Main PID: 1533 (clamav-milter)
   CGroup: /system.slice/clamav-milter.service
           └─1533 /usr/local/sbin/clamav-milter --config-file /etc/clamav-milter.conf

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

Aug 23 12:20:08 web sm-mta[5974]: l7NAHEvp005825: to=<olivier@localhost>, delay=00:00:03, xdelay=00:00:00, mailer=local, pri=32226, dsn=2.0.0, stat=Sent
Aug 23 12:20:08 web sm-mta[5825]: l7NAHEvq005825: from=<ron@bakernet.com>, size=1356, class=0, nrcpts=1, msgid=<1INISJ-000JQP-FP@216-201-156-242.res.logixcom.net>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
Aug 23 12:20:08 web sm-mta[5825]: l7NAHEvq005825: Milter add: header: X-Virus-Scanned: ClamAV 0.91.1/4016/Tue Aug 21 01:40:52 2007 on web.kervao.fr
Aug 23 12:20:08 web sm-mta[5825]: l7NAHEvq005825: Milter add: header: X-Virus-Status: Infected with Email.Webaccount-4
Aug 23 12:20:08 web sendmail[5976]: l7NAK8cl005976: from=clamav, size=499, class=0, nrcpts=2, msgid=<200708231020.l7NAK8cl005976@web.kervao.fr>, relay=clamav@localhost
Aug 23 12:20:08 web sendmail[5976]: l7NAK8cl005976: to=postmaster, delay=00:00:00, mailer=relay, pri=60499, stat=queued
Aug 23 12:20:08 web sendmail[5976]: l7NAK8cl005976: to=olivier, delay=00:00:00, mailer=relay, pri=60499, stat=queued
Aug 23 12:20:08 web sm-mta[5825]: l7NAHEvq005825: Milter: data, discard
Aug 23 12:20:08 web sm-mta[5825]: l7NAHEvq005825: discarded

Chaque mail se voit rajouter la ligne suivante dans son entête

X-Virus-Scanned: clamav-milter 0.99.2 at mana.kervao.fr
X-Virus-Status: Clean

 
[Retour page d'accueil FUNIX]