Login Logout

Howto Antispam

Le SPAM est un message électronique non sollicité. C’est devenu un fléau moderne, au même titre que les virus informatiques ou les attaques DDOS, qui arrange bien des industriels…

Les outils de base

Sous Debian 8, on a :

  • Postfix 2.11.3
  • SpamAssassin 3.4.0
  • Amavisd-new 2.10.1
  • ClamAV 0.99.2
  • Postgrey 1.35

Sous Debian 9, on a :

  • Postfix 3.1.6
  • SpamAssassin 3.4.1
  • Amavisd-new 2.10.1
  • ClamAV 0.99.2
  • Postgrey 1.36
# apt install postfix spamassassin amavisd-new clamav-daemon postgrey

Les principes de base

Si un utilisateur détecte d’un coup d’œil si un message est un spam ou non… c’est compliqué d’automatiser cette décision par un ordinateur. Voici les principes qui sont généralement mis en œuvre :

  • Vérification de l’adresse email de l’expéditeur
  • Vérification de l’adresse IP de l’expéditeur
  • Vérification des entêtes et du contenu du message
  • Vérification des pièces jointes
  • Vérification des éventuelles signatures (DKIM)
  • Vérification du client SMTP qui transmet le message

Au niveau d’un serveur, un ensemble d’outils vont se charger de ces vérifications. On distingue souvent :

  • Les filtres de 1er niveau : vérifications avant d’accepter un message par le serveur SMTP
  • Les filtres de 2ème niveau : vérifications après l’avoir accepté mais avant de délivrer dans la boîte de l’utilisateur
  • Les filtres de 3ème niveau : vérifications faites par l’utilisateur (antivirus sur son poste, filtres sur son client POP/IMAP) => non traité dans ce Howto

Postfix

http://www.postfix.org/

Postfix est un serveur SMTP. Il est la base d’un antispam car c’est lui qui reçoit les messages via le protocole SMTP.

Il permet déjà un grand nombre de vérifications basiques :

  • rejet à partir d’une liste “statique” d’adresses email / d’adresses IP
  • rejet à partir de termes simples dans les entêtes et le contenu
  • rejet des noms de domaine inexistants ou invalides utilisés dans l’adresse email de l’expéditeur
  • rejet des adresses IP qui ont un reverse DNS inexistant ou invalide
  • rejet à partir d’une RBL

Voici un exemple de restrictions à mettre dans le main.cf :

# Restrictions selon l'IP
smtpd_client_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_rbl_client clients.rbl.gcolpart.com,
 cidr:/etc/postfix/spamd.cidr,
 permit

# Exiger la commande HELO/EHLO
smtpd_helo_required = yes

# Restrictions au niveau de la commande HELO/EHLO
smtpd_helo_restrictions = reject_invalid_hostname

# Restrictions au niveau de la commande MAIL FROM
smtpd_sender_restrictions = permit_mynetworks,
 check_sender_access hash:/etc/postfix/sa-blacklist.access,
 permit

# Restrictions au niveau de la commande RCPT TO
smtpd_recipient_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_destination,
 check_client_access hash:/etc/postfix/client.access_local,
 check_client_access hash:/etc/postfix/client.access,
 check_sender_access hash:/etc/postfix/sender.access_local,
 check_sender_access hash:/etc/postfix/sender.access,
 check_recipient_access hash:/etc/postfix/recipient.access_local,
 check_recipient_access hash:/etc/postfix/recipient.access,
 reject_unlisted_recipient,
 reject_unknown_sender_domain,
 reject_non_fqdn_sender,
 reject_unauth_pipelining,
 permit

# Restrictions au niveau de la commande DATA
smtpd_data_restrictions = permit

# Restrictions au niveau de la commande ETRN
smtpd_etrn_restrictions = reject

# Filtrage des entetes
header_checks = regexp:/etc/postfix/header_kill_local, regexp:/etc/postfix/header_kill

# Filtrage du contenu
body_checks = regexp:/etc/postfix/body_kill_local, regexp:/etc/postfix/body_kill

Cette configuration suppose avec des “maps” locales vides :

# touch /etc/postfix/client.access_local
# postmap /etc/postfix/client.access_local
# touch /etc/postfix/sender.access_local
# postmap /etc/postfix/sender.access_local
# touch /etc/postfix/recipient.access_local
# postmap /etc/postfix/recipient.access_local
# touch /etc/postfix/header_kill_local

Cela suppose aussi de récupérer des maps gérées par Evolix à l’aide d’un script spam.sh :

#!/bin/bash

# debug
#set -x

umask 022

tmp_file=$(mktemp)

tmp=$(mktemp -d)

cd $tmp

if [ -f $tmp_file ] ;
  then rm $tmp_file ;
fi

cd /var/tmp

sleep $[ $RANDOM / 1024 ]

wget -q -t 3 <http://antispam00.evolix.org/spam/client.access> -O $tmp_file
cp $tmp_file /etc/postfix/client.access
rm $tmp_file

wget -q -t 3 <http://antispam00.evolix.org/spam/sender.access> -O $tmp_file
cp $tmp_file /etc/postfix/sender.access
rm $tmp_file

wget -q -t 3 <http://antispam00.evolix.org/spam/recipient.access> -O $tmp_file
cp $tmp_file /etc/postfix/recipient.access
rm $tmp_file

wget -q -t 3 <http://antispam00.evolix.org/spam/header_kill> -O $tmp_file
cp $tmp_file /etc/postfix/header_kill
rm $tmp_file

wget -q -t 3 <http://antispam00.evolix.org/spam/sa-blacklist.access>  -O sa-blacklist.access
wget -q -t 3 <http://antispam00.evolix.org/spam/sa-blacklist.access.md5>  -O $tmp_file
if md5sum -c $tmp_file > /dev/null && [ -s sa-blacklist.access ] ; then
        cp sa-blacklist.access /etc/postfix/sa-blacklist.access
fi
rm sa-blacklist.access
rm $tmp_file

/usr/sbin/postmap hash:/etc/postfix/client.access
/usr/sbin/postmap hash:/etc/postfix/sender.access
/usr/sbin/postmap hash:/etc/postfix/recipient.access
/usr/sbin/postmap -r hash:/etc/postfix/sa-blacklist.access

wget -q -t 3 <http://antispam00.evolix.org/spam/spamd.cidr>  -O spamd.cidr
wget -q -t 3 <http://antispam00.evolix.org/spam/spamd.cidr.md5>  -O $tmp_file
if md5sum -c $tmp_file > /dev/null && [ -s spamd.cidr ] ; then
        cp spamd.cidr /etc/postfix/spamd.cidr
fi
rm spamd.cidr
rm $tmp_file
rm -rf $tmp

Postscreen

http://www.postfix.org/POSTSCREEN_README.html

Postscreen est un démon de Postfix qui permet de renforcer les filtres de 1er niveau. Il permet principalement de combiner la vérification auprès de plusieurs RBL. Avec l’option “reject_rbl_client”, Postfix vérifie la présence d’une IP auprès de plusieurs RBLs : si l’IP est présente au moins une fois, Postfix rejette le message. Postscreen permet de ne rejeter le message que si l’adresse IP est présente au moins N fois.

Postgrey

https://fr.wikipedia.org/wiki/Greylisting http://postgrey.schweikert.ch/

Postgrey fait du Greylisting : il retarde volontairement un message reçu pour vérifier le client SMTP qui envoie le message. Cela a une certaine efficacité, d’autant plus que cela permet de faire d’autres vérifications plus tard… qui seront de meilleures qualité car plus à jour !

Mais si l’on fait cela pour tous les messages reçus, la plupart des messages seront retardés de quelques minutes… ou heures. Souvent, on ne tolère donc pas une activation globale du Greylisting. Cela reste néanmoins intéressant : on peut s’en servir pour retarder des messages incertains et attendre d’avoir des vérifications de meilleure qualité.

Whitelister

https://tracker.debian.org/pkg/whitelister

Whitelister est un logiciel écrit en OCAML par Pierre Habouzit. Il permet de faire du Greylisting conditionnel, c’est-à-dire qu’il permet de ne faire du Greylist que si l’adresse IP est louche. Pour cela il teste principalement sa présence dans des RBL : si elle est listée par au moins une RBL, le message est greylisté !

# aptitude install whitelister postgrey

Dans /etc/whitelister.conf :

sock: /var/spool/postfix/private/whitelister.ctl

rbl: zen.spamhaus.org
rbl: bl.spamcop.net
rbl: b.barracudacentral.org
rbl: cbl.abuseat.org
rbl: dnsbl.sorbs.net
rbl: ix.dnsbl.manitu.net
rbl: psbl.surriel.com
rbl: truncate.gbudb.net
rbl: dnsbl-1.uceprotect.net
rbl: db.wpbl.info
rbl: all.spamrats.com
rbl: bl.spamcannibal.org
rbl: block.stopspam.org
rbl: badhost.stopspam.org
rbl: dnsbl.stopspam.org
rbl: dul.pacifier.net
rbl: dnsbl.dronebl.org
rbl: dnsbl.inps.de
rbl: bl.blocklist.de
rbl: srnblack.surgate.net
rbl: all.s5h.net
rbl: rbl.megarbl.net
rbl: bl.score.senderscore.com
rbl: rbl.rbldns.ru
rbl: dnsbl.cobion.com
rbl: bl.mailspike.net
rbl: cidr.bl.mcafee.com
rbl: dnsblchile.org
rbl: aspews.ext.sorbs.net
rbl: l2.spews.dnsbl.sorbs.net

rhbl_client: dsn.rfc-clueless.org
rhbl_client: postmaster.rfc-clueless.org
rhbl_client: abuse.rfc-clueless.org
rhbl_client: whois.rfc-clueless.org
rhbl_client: bogusmx.rfc-clueless.org

rhbl_sender: dsn.rfc-clueless.org
rhbl_sender: postmaster.rfc-clueless.org
rhbl_sender: abuse.rfc-clueless.org
rhbl_sender: whois.rfc-clueless.org
rhbl_sender: bogusmx.rfc-clueless.org

rhbl_helo: dsn.rfc-clueless.org
rhbl_helo: postmaster.rfc-clueless.org
rhbl_helo: abuse.rfc-clueless.org
rhbl_helo: whois.rfc-clueless.org
rhbl_helo: bogusmx.rfc-clueless.org

dns_client: 1
dns_rev_client: 1

Ajouter la ligne à la directive smtpd_recipient_restrictions du fichier /etc/postfix/main.cf :

check_policy_service unix:private/whitelister.ctl check_policy_service inet:127.0.0.1:60000,

Puis redémarrer Postfix.

RBL : Realtime Blackhole List

Une RBL est un système permet de vérifier la présence d’adresses IP, de noms de domaine, etc. dans une base mise à jour très régulièrement. La plupart du temps, son interrogation fonctionne via les DNS.

DNS RBL pour les adresses IP

http://multirbl.valli.org/lookup/

Les RBLs pour IP permettent de vérifier si une adresse IP est légitime pour envoyer des emails.

Par exemple, pour vérifier si une adresse IP est légitime :

$ dig +short 2.26.171.202.clients.rbl.gcolpart.com
127.0.0.2 => NON LÉGITIME
$ dig +short 8.8.8.8.clients.rbl.gcolpart.com

Il existe de très nombreuses RBLs pour IP… le problème est leur fiabilité et leur politique pour en sortir.

Voici une liste de RBLs que nous utilisons (août 2015) :

RBL Notre confiance Lien (optionel)
clients.rbl.gcolpart.com 100% http://mx.evolix.net/
zen.spamhaus.org 90% http://www.spamhaus.org/
bl.spamcop.net 90% https://www.spamcop.net/bl.shtml
b.barracudacentral.org 80% http://barracudacentral.org/
cbl.abuseat.org 80% http://cbl.abuseat.org/
bl.score.senderscore.com 80% http://www.senderscore.com/
hostkarma.junkemailfilter.com (127.0.0.2) 80% http://wiki.junkemailfilter.com/index.php/Spam_DNS_Lists
dnsbl.sorbs.net 70% http://www.sorbs.net/
ix.dnsbl.manitu.net 60% http://www.dnsbl.manitu.net/
psbl.surriel.com 50% http://psbl.org/
truncate.gbudb.net 50% http://www.gbudb.com/
dnsbl-1.uceprotect.net 50% http://www.uceprotect.net/en/
db.wpbl.info 50% http://wpbl.info/
all.spamrats.com 50% http://spamrats.com
dnsbl.dronebl.org 50% http://dronebl.org/
dnsbl.inps.de 50% http://dnsbl.inps.de/?lang=en
bl.blocklist.de 50% http://www.blocklist.de/en/
srnblack.surgate.net 50% http://www.srntools.com/
all.s5h.net 50% http://www.usenix.org.uk/content/rbl.html
rbl.megarbl.net 50% https://www.megarbl.net/
dnsbl.cobion.com 50% http://www-01.ibm.com/support/docview.wss?uid=swg21436643
bl.mailspike.net 50% http://www.mailspike.net/
cidr.bl.mcafee.com 50% http://www.mcafee.com/
bl.spamcannibal.org 40% http://spamcannibal.org
hostkarma.junkemailfilter.com (127.0.0.4) 40% http://wiki.junkemailfilter.com/index.php/Spam_DNS_Lists
work.drbl.gremlin.ru 40% http://gremlin.ru/soft/drbl/en/
aspews.ext.sorbs.net 20% http://www.aspews.org/
l2.spews.dnsbl.sorbs.net 10% http://www.spews.org ?
rbl.rbldns.ru 10% http://www.rbldns.ru/index.php/en/
dnsblchile.org 10% http://www.dnsblchile.org/
dnsbl.stopspam.org 0% http://www.stopspam.org
dnsbl.proxybl.org 0% http://proxybl.org/
pbl.spamhaus.org N/A https://www.spamhaus.org/pbl/

RBL pour les domaines expéditeur / HELO

http://rfc-clueless.org/ est particulier, cela liste tous les domaines qui ne respectent pas les RFC, y compris GMAIL & co :)

URIBL : les RBLS pour les URI / noms de domaines

Les RBLs pour URI permettent de vérifier si un nom de domaine est légitime, principalement pour les liens dans le contenu des emails.

Par exemple, pour vérifier si un domaine est légitime :

$ dig +short cryptolocker.com.multi.uribl.com
127.0.0.2 => NON LÉGITIME
$ dig +short example.com.multi.uribl.com

Vérifications via SPF

https://fr.wikipedia.org/wiki/Sender_Policy_Framework

L’idée est de rejetter un mail qui a un enregistrement SPF invalide. On utilise pour cela un programme en python postfix-policyd-spf-python (dispo dans les packages Debian).

La configuration se fait dans /etc/postfix-policyd-spf-python/policyd-spf.conf, on peut se servir de la version commenté : /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented, c’est celle que l’on va utiliser.

# cp /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented /etc/postfix-policyd-spf-python/policyd-spf.conf

Paramètres intéressants :

defaultSeedOnly = 0 # Mode simulation, aucun rejet, seulement la description de l'action dans les logs.
Mail_From_reject = Fail # Rejete les mails si le check SPF échoue.
Mail_From_reject = Softfail # Rejete les mails si le check SPF échoue même en « soft » (utilisation de ~all par exemple), non recommandé.
Reject_Not_Pass_Domains = aol.com,hotmail.com # Transoforme un ~all en -all pour des domaines en particuliers.

Pour l’activer, modifications dans /etc/postfix/master.cf et /etc/postfix/main.cf :

master.cf:

policyd-spf  unix  -       n       n       -       0       spawn
            user=policyd-spf argv=/usr/bin/policyd-spf

main.cf :


smtpd_recipient_restrictions =
            ...
            reject_unauth_destination
            check_policy_service unix:private/policyd-spf
            ...
policyd-spf_time_limit = 3600

Un redémarrage de postfix sera nécessaire.

Vérification via DKIM

https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail

Il suffit d’installer opendkim et d’indiquer sur quel port se binder dans opendkim et postfix.

/etc/opendkim.conf

Socket  inet:54321@localhost
# On veut loguer les actions.
LogResults true
LogWhy true

Attention, par défaut opendkim fait certaines requêtes sans utiliser le resolver local… ce qui peut provoquer des ralentissements si cela n’est pas autorisé au niveau firewall. Il faut alors désactiver :

DisableADSP true

/etc/postfix/main.cf

smtpd_milters = inet:127.0.0.1:54321
non_smtpd_milters = inet:127.0.0.1:54321
# Par défaut, un mail avec une signature non valide sera rejeté en 4xx.
# milter_default_action=accept

Vérification via DMARC

https://packages.debian.org/opendmarc

SpamAssassin

http://spamassassin.apache.org

Exemple de local.cf :

required_score   5
report_safe     0
rewrite_header Subject [SPAM]
add_header all Report _REPORT_

# filtre bayesien
# mkdir -p /var/spool/spam
use_bayes       1
bayes_auto_learn 1
bayes_path /var/spool/spam/bayes
bayes_file_mode 0777

# AWL : AutoWhitelist
# mkdir -p /var/spool/spam
loadplugin Mail::SpamAssassin::Plugin::AWL
use_auto_whitelist 1
auto_whitelist_path /var/spool/spam/auto_whitelist
auto_whitelist_file_mode 0666

# LANG TESTS
Mail::SpamAssassin::Plugin::TextCat
ok_languages en fr es it
ok_locales en fr es it

score BODY_8BITS 1.500
score CHARSET_FARAWAY 3.200
score CHARSET_FARAWAY_HEADER 3.200
score HTML_CHARSET_FARAWAY 0.500
score MIME_CHARSET_FARAWAY 2.450
score UNWANTED_LANGUAGE_BODY 2.800

# DCC
# use_dcc 1 => un plugin maintenant...
score DCC_CHECK 2.9

# RAZOR : <http://razor.sourceforge.net>
use_razor2 1
razor_timeout 10
score RAZOR2_CHECK 2.9
score RAZOR2_CF_RANGE_51_100 1.3

# pyzor : <http://pyzor.sourceforge.net/>
use_pyzor 0

# RBL (Realtime Blackhole List)
skip_rbl_checks 0
score RCVD_IN_BL_SPAMCOP_NET 3

# misc
score HELO_DYNAMIC_IPADDR 0.3
score BIZ_TLD 0.1
score PRIORITY_NO_NAME 0.2

# disable HTML tests

score HTML_MESSAGE 0
score HTML_00_10 0
score HTML_10_20 0
score HTML_20_30 0
score HTML_30_40 0
score HTML_40_50 0
score HTML_50_60 0
score HTML_60_70 0
score HTML_70_80 0
score HTML_80_90 0
score HTML_90_100 0
#score HTML_COMMENT_8BITS 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score UPPERCASE_75_100 0
score MIME_HTML_ONLY 0.1
# From <http://maxime.ritter.eu.org/Spam/user_prefs>
# Trop de faux negatifs avec BAYES_(0|1|2|3|4)*
score BAYES_00                       0 0 -0.01 -0.01
score BAYES_01                       0 0 -0.01 -0.01
score BAYES_10                       0 0 -0.01 -0.01
score BAYES_20                       0 0 -0.01 -0.01
score BAYES_30                       0 0 -0.01 -0.01
score BAYES_40                       0 0 -0.01 -0.01
score BAYES_44                       0 0 -0.01 -0.01
score BAYES_50                       0 0 0.1 0.1
score BAYES_56                       0 0 0.5 0.5
score BAYES_60                       0 0 1.0 1.0
score BAYES_70                       0 0 2.5 2.5
score BAYES_80                       0 0 3.5 3.5
score BAYES_90                       0 0 4.5 4.5
score BAYES_99                       0 0 8.0 8.0

score RCVD_IN_SORBS_DUL 0.3
score SUBJ_ILLEGAL_CHARS      0
score RCVD_IN_NJABL_DUL 0.3

score ADDRESS_IN_SUBJECT 0.1

score HELO_LH_HOME 1.0

#internal_networks 192.168.XXX/24
trusted_networks 31.170.8.33 31.170.8.15 62.212.111.216 88.179.18.233 85.118.59.50
#score ALL_TRUSTED 0.3
score HELO_DYNAMIC_IPADDR 0.3

score FORGED_MUA_OUTLOOK 0.5

# Eudora sucks
score EXTRA_MPART_TYPE 0.1
score MIME_BOUND_EQ_REL 0.1
score MIME_QP_LONG_LINE 0.1

# SMTP senders *have* dynamic IP addresses
# A.B.C.D.dnsbl.sorbs.net -> 127.0.0.10
score RCVD_IN_DYNABLOCK 0
score HELO_DYNAMIC_IPADDR 0.3
score RCVD_IN_SORBS 0.1
score RCVD_IN_PBL 0.1
score RCVD_IN_SORBS_DUL 0

# old bug...
score FH_DATE_PAST_20XX 0.0

URIBL

https://spamassassin.apache.org/full/3.2.x/doc/Mail_SpamAssassin_Plugin_URIDNSBL.html

header __RCVD_IN_HOSTKARMA eval:check_rbl('HOSTKARMA-lastexternal','hostkarma.junkemailfilter.com.')
describe __RCVD_IN_HOSTKARMA Sender listed in JunkEmailFilter
tflags __RCVD_IN_HOSTKARMA net

header RCVD_IN_HOSTKARMA_W eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.1')
describe RCVD_IN_HOSTKARMA_W Sender listed in HOSTKARMA-WHITE
tflags RCVD_IN_HOSTKARMA_W net nice
score RCVD_IN_HOSTKARMA_W -5

header RCVD_IN_HOSTKARMA_BL eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.2')
describe RCVD_IN_HOSTKARMA_BL Sender listed in HOSTKARMA-BLACK
tflags RCVD_IN_HOSTKARMA_BL net
score RCVD_IN_HOSTKARMA_BL 3.0

header RCVD_IN_HOSTKARMA_BR eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.4')
describe RCVD_IN_HOSTKARMA_BR Sender listed in HOSTKARMA-BROWN
tflags RCVD_IN_HOSTKARMA_BR net
score RCVD_IN_HOSTKARMA_BR 1.0

ifplugin Mail::SpamAssassin::Plugin::URIDNSBL
urirhssub URIBL_HOSTKARMA_BL hostkarma.junkemailfilter.com. A 127.0.0.2
describe  URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA blacklist
body      URIBL_HOSTKARMA_BL eval:check_uridnsbl('URIBL_HOSTKARMA_BL')
tflags    URIBL_HOSTKARMA_BL net
score     URIBL_HOSTKARMA_BL 3.0

urirhssub URIBL_HOSTKARMA_BR hostkarma.junkemailfilter.com. A 127.0.0.4
describe  URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA brownlist
body      URIBL_HOSTKARMA_BR eval:check_uridnsbl('URIBL_HOSTKARMA_BR')
tflags    URIBL_HOSTKARMA_BR net
score     URIBL_HOSTKARMA_BL 2.0

urirhssub URIBL_HOSTKARMA_FRESH_2D hostkarma.junkemailfilter.com. A 127.0.2.1
describe  URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA very young list
body      URIBL_HOSTKARMA_FRESH_2D eval:check_uridnsbl('URIBL_HOSTKARMA_FRESH_2D')
tflags    URIBL_HOSTKARMA_FRESH_2D net
score     URIBL_HOSTKARMA_FRESH_2D 2.0

urirhssub URIBL_HOSTKARMA_FRESH_10D hostkarma.junkemailfilter.com. A 127.0.2.2
describe  URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA young list
body      URIBL_HOSTKARMA_FRESH_10D eval:check_uridnsbl('URIBL_HOSTKARMA_FRESH_10D')
tflags    URIBL_HOSTKARMA_FRESH_10D net
score     URIBL_HOSTKARMA_FRESH_2D 1.0

Howto écrire ses règles SpamAssassin

TODO

http://sa-russian.narod.ru/no_russian.html

Whitelister/Blacklister un email ou un nom de domaine

Par utilisateur (~/.spamassassin/user_prefs) ou global (/etc/spamassassin/local_evolix.cf) :

whitelist_from foo@bar.com
whitelist_from *@evolix.fr
blacklist_from pouet@camembert.com

AWL : AutoWhitelist

SA a un puissant outil d’AWL si l’on définit bien une liste d’emails / expéditeurs avant de l’initialiser. Néanmoins, il faut le maintenir :

Pour lister sa whitelist (couple email / 2 1er octets de l’IP)

# sa-awl /var/spool/spam/auto_whitelist

            AVG  (TOTSCORE/COUNT)  --  EMAIL|ip=IPBASE

AVG est le score moyen
TOTSCORE est le score total des mails
COUNT est le nombre de mails

Pour supprimer les entrées “vues” moins de 2 fois :

# sa-awl --clean --min 2 /var/spool/spam/auto_whitelist

Pour supprimer des entrées particulières :

# spamassassin --remove-addr-from-whitelist=foo@bar
SpamAssassin auto-whitelist: removing address: foo@bar

ClamAV

http://www.clamav.net/index.html

https://www.virustotal.com

http://www.team-cymru.org/MHR.html

Constituer sa propre DB

Le but est de créer une base de données contenant des signatures personnelles qui ne sont pas (encore) disponibles dans celles fournis par ClamAV. On va montrer un exemple pour identifier un virus en PJ de type facture.doc, qui contient une macro Word pour infecter des postes Windows.

La pièce-jointe est identifiable sur VirusTotal : https://www.virustotal.com/fr/file/a2b0a2348cba02f8de4e87c54969c28cbad68d3c4e7d2a12335be3ecdefdcf35/analysis/ [[BR]]

Elle n’est repéré que par 6 AV. Il est reconnu en tant que W97M/Downloader.akh. On va utiliser ce nom (+evolix) pour le mettre dans notre base de données. L’idée est d’identifier un endroit précis du fichier en utilisant par exemple hexdump :

61 69 6e 2e 00 53 6f 63  6b 65 74 2e 43 10 6c 6f  |ain..Socket.C.lo|

Et d’ajouter ces 16 octets en guise signature.

# echo "W97M/Downloader.akh+evolix:0:*:61696e2e00536f636b65742e43106c6f" >> /var/lib/clamav/evolix.ndb
# chown clamav:clamav /var/lib/clamav/evolix.ndb

Dans le cas où il n’est pas évident de repérer une chaine précise on « fabriquera » une signature avec l’outil de ClamAV : sigtool.

# sig=$(cat facture.doc | sigtool --hex-dump | head -c 2048)
# echo "NomDuVirus+evolix:0:*:$sig" >> /var/lib/clamav/evolix.ndb

On peut aussi tout simplement utiliser le checksum du virus (un sha256 par exemple).

# sigtool --sha256 facture.doc >> /var/lib/clamav/evolix.hsb

Dans certains cas, comme un fichier HTML « forgé bizarrement », ClamAV va d’abord décomposer le fichier HTML. Il faudra générer la signature à partir de l’extraction.

# clamscan --debug --leave-temp facture.doc
> LibClamAV debug: cli_scanhtml: using tempdir /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp
# cd /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp
# sig=$(cat notags.html | sigtool --hex-dump | head -c 2048)
# echo "NomDuVirus+evolix:0:*:$sig" >> /var/lib/clamav/evolix.ndb

Evolix tient une base de signatures pour ClamAV https://forge.evolix.org/projects/evovirus/repository

Bases officieuses

Sanesecurity

Sanesecurity contient de nombreuses bases de signatures de plus ou moins bonnes qualité :

http://sanesecurity.com/usage/signatures/

$ rsync -avn rsync://rsync.sanesecurity.net/sanesecurity /tmp/sanesecurity/

Un blog liste quelques signatures 0-day : http://sanesecurity.blogspot.co.uk/

Malwarepatrol

https://www.malwarepatrol.net/

$ wget <https://lists.malwarepatrol.net/cgi/getfile?receipt=XXXXX&product=8&list=clamav_basic>

Code XXXX à obtenir via inscription : https://www.malwarepatrol.net/signup-free.shtml (il existe aussi une version payante)

SecuriteInfo

https://www.securiteinfo.com/services/improve-detection-rate-of-zero-day-malwares-for-clamav.shtml

inscription : https://www.securiteinfo.com/clients/customers/signup (il existe aussi une version payante)

Linux Malware Detect

https://www.rfxn.com/projects/linux-malware-detect/

$ wget <http://cdn.rfxn.com/downloads/rfxn.ndb>

Yara Rules

Nécessite ClamAV 0.99 (bêta) qui pourra utiliser le moteur Yara : http://blog.clamav.net/2015/06/clamav-099b-meets-yara.html

http://yararules.com/