28 février 2021

Serveur Messagerie : Mise en place d’un antivirus avec ClamAV

Article à la demande si je puis dire (cf Envie de soutenir le blog ?)

On va donc voir comment intégrer un Antivirus à notre solution de messagerie.

On reste sur du libre et on va prendre ClamAV qui sera appelé par Rspamd.

De base, il n’est pas très pertinent, donc on lui adjoindra des signatures complémentaires.

 

I – Mon avis

Après plusieurs années sans antivirus sur les différents serveurs de messagerie que j’ai installés, je peux dire qu’au final, il ne manque pas vraiment.

Tout d’abord, les usagers de mes serveurs étant limités et surtout, bien formés (pas de clic sur n’importe quoi !), les risques sont minimes.

Mais le plus gros problème : ClamAv est assez gourmand en ressource (comptez au moins 512M de Ram), assez « pataud »….  Et, vu au final l’utilité de la bête, je m’en passe sans remords.

Il faut savoir qu’il peut être utilisé de deux façons.

  • Soit appelé à la demande… Mais à chaque mail entrant, le temps que le truc se charge, on est pas sorti…
  • Ou alors, en démon. Il tourne tout le temps, consomme tout le temps, mais au moins, on ne perd pas de temps à le lancer pour chaque mail.

Ici, ce sera du démon.

 

II – Installation de ClamAV

J’ai choisi de mettre ClamAv sur une nouvelle VM (vu ce qu’il suce…)

On installe :

clamav# apt-get install clamav-daemon clamav-freshclam clamav

On va couper le service:

clamav# service clamav-daemon stop

En fait, tant que ce n’est pas à jour, il ne peut pas démarrer.

On va donc surveiller ou en est Freshclam (l’utilitaire de mise à jour de clamav):

clamav# service clamav-freshclam status

ou

clamav# tail /var/log/syslog -f

On regarde le status et on attend de voir qu’il soit à jour (daily.cvd updated) :

 ClamAV update process started at Tue Jul 30 13:31:31 2019
Jul 30 13:31:31 clamav freshclam[922]: Tue Jul 30 13:31:31 2019 -> ^Your ClamAV installation is OUTDATED!
Jul 30 13:31:31 clamav freshclam[922]: Tue Jul 30 13:31:31 2019 -> ^Local version: 0.100.3 Recommended version: 0.101.2
Jul 30 13:31:31 clamav freshclam[922]: Tue Jul 30 13:31:31 2019 -> DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
Jul 30 13:31:33 clamav freshclam[922]: Tue Jul 30 13:31:33 2019 -> Downloading main.cvd [100%]
Jul 30 13:31:56 clamav freshclam[922]: Tue Jul 30 13:31:56 2019 -> main.cvd updated (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
Jul 30 13:32:36 clamav freshclam[922]: Tue Jul 30 13:32:36 2019 -> *Can't query main.58.93.1.0.6810DB54.ping.clamav.net
Jul 30 13:32:36 clamav freshclam[922]: Tue Jul 30 13:32:36 2019 -> Downloading daily.cvd [100%]
Jul 30 13:34:40 clamav freshclam[922]: Tue Jul 30 13:34:40 2019 -> daily.cvd updated (version: 25526, sigs: 1687168, f-level: 63, builder: raynman)

L’histoire de version, ce sont les dépôts Debian Stretch pas très à jour.

On va aller éditer le fichier /etc/systemd/system/clamav-daemon.service.d/extend.conf :

On supprime :

[Service]
ExecStartPre=-/bin/mkdir /run/clamav
ExecStartPre=/bin/chown clamav /run/clamav

Et on rajoute (si on passe par un socket TCP) :

[Socket]
ListenStream=IP.CLAMAV:3310

On recharge :

clamav# systemctl daemon-reload

Et on relance :

clamav# service clamav-daemon restart

La aussi, on attend un peu car ClamAv est particulièrement lent à se lancer (en gros, on le sait quand il arrête de prendre tout le processeur…)

On peut aussi jeter un oeil ici :

clamav# tail /var/log/syslog -f

Une fois que tout est bien chargé, on peut passer à la suite.

 

III – Connexion avec Rspamd

Pour faire dialoguer Rspamd et ClamAV, c’est simple.

Dans un nouveau fichier /etc/rspamd/local.d/antivirus.conf :

clamav {
  scan_mime_parts = true;
  scan_text_mime = true;
  scan_image_mime = true;

  symbol = "CLAM_VIRUS";
  type = "clamav";
  log_clean = true;
  
  # servers = "/var/run/clamav/clamd.ctl";
  servers = IP.CLAMAV:3310;
}

Ici, si ClamAV est en local, vous laissez sur le socket /var/run/clamav/clamd.ctl

Et si vous voulez rejetez les mails, vous dé-commentez :

action = "reject";

Si vous décidez de ne pas rejeter le mail, dans le fichier /etc/rspamd/local.d/groups.conf, lui aussi à créer :

symbols = {
  "CLAM_VIRUS" {
    weight = 10;
  }
  "CLAM_VIRUS_FAIL" {
    weight = 0;
  }
  "JUST_EICAR" {
    weight = 10;
  }
  "CLAM_VIRUS_ENCRYPTED" {
    weight = 10;
  }
}

Sinon, les symboles auront un poids de zéro.

Toujours si vous décidez de ne pas rejeter le mail, dans le fichier /etc/rspamd/local.d/milter_headers.conf, on remplace l’existant par :

use = ["x-spamd-bar", "x-spam-level", "x-virus","authentication-results" ];
extended_spam_headers = true;
skip_local = false;
skip_authenticated = false;

routines {
  x-virus {
    header = "X-Virus";
    remove = 1;
    symbols = ["CLAM_VIRUS", "JUST_EICAR"];
  }
}

Ceci dit, même en cas de rejet, changer ceci est bien aussi :

use = ["x-spamd-bar", "x-spam-level", "x-virus","authentication-results" ];
extended_spam_headers = true;
skip_local = false;
skip_authenticated = false;

Et une fois tout cela fait, on recharge :

mail# service rspamd reload

 

IV – Test

Pour tester, on va installer Swaks (http://www.jetmore.org/john/code/swaks/)

mail# apt-get install swaks

Et on va télécharger la signature EICAR (LE truc pour tester un AV )

mail# cd
mail# wget https://secure.eicar.org/eicar.com

Et pour tester :

mail# swaks --to monmail@mondomaine.fr --attach - --server IP.MAIL:25 < eicar.com

Le mail doit arriver en Spam, avec le header qui va bien etc…

On peut bien évidement filtrer différemment, vu la présence du Header X-Virus.

Libre à vous de configurer vos filtres sieves comme vous l’entendez !

 

V – Signatures

Comme je l’expliquais avant, ClamAV de base est assez inutile car il ne détecte pas grand chose.

On va lui adjoindre des signatures fournies par https://sanesecurity.com/

Avant tout, quelques paquets nécessaires :

clamav# apt-get install dnsutils rsync

Ensuite, si vous avez un firewall, il faut penser à ouvrir, en sortie, les ports 443 (Https) ET 873 (Rsync).

Puis :

clamav# wget https://github.com/extremeshok/clamav-unofficial-sigs/archive/master.tar.gz
clamav# tar xvzf master.tar.gz
clamav# cd clamav-unofficial-sigs-master

On met le script en place :

clamav# cp clamav-unofficial-sigs.sh /usr/local/sbin/
clamav# chmod +x /usr/local/sbin/clamav-unofficial-sigs.sh

On manipule ce qu’on doit manipuler :

clamav# mkdir /etc/clamav-unofficial-sigs
clamav# cp config/os.debian9.conf /etc/clamav-unofficial-sigs/os.conf
clamav# cp config/user.conf /etc/clamav-unofficial-sigs/
clamav# cp config/master.conf /etc/clamav-unofficial-sigs/

Pour valider qu’on a bien tout fait, on va dans le fichier /etc/clamav-unofficial-sigs/user.conf et tout en bas :

user_configuration_complete="yes"

Ensuite, on installe la tache cron, le logrotate et le man :

clamav# clamav-unofficial-sigs.sh --install-all

Et on lance pour qu’il se mette à jour

clamav# clamav-unofficial-sigs.sh

On relance ClamAv :

clamav# service clamav-daemon reload

Et on peut vérifier que les nouvelles bases sont bien chargées :

clamav# clamscan --debug 2>&1 /dev/null | grep "loaded"

On doit voir, entre autres :

LibClamAV debug: /var/lib/clamav/sanesecurity.ftm loaded

Attention : la encore, la commande met une plombe à se terminer…

Concernant les signatures, il est possible d’activer encore d’autres choses : https://github.com/extremeshok/clamav-unofficial-sigs

 

VI – Conclusion

Bonne nouvelle, tout est opérationnel !

On pourrait ajouter un système de quarantaine, ce sera surement pour un futur article.

Si vous avez des remarques, des questions, n’hésitez pas !


Envie de me soutenir et de me payer un café ? C’est sur la page Don !

 

6 réflexions sur « Serveur Messagerie : Mise en place d’un antivirus avec ClamAV »

  1. Hello !

    Tout fonctionne au poile, c’est vraiment chouette, encore merci. J’ai deux questions :

    Question 1: comment faire en sorte que l’admin reçoive un mail lors qu’un mail est reject ? J’aimerais quand même averti, ça me permettrait de remonter des anomalies au niveau des postes de mes clients (plutôt que de toujours vérifier l’interface de rspamd).

    Question 2: Chez moi, j’ai service clamav-daemon status | grep Memory ==> Memory: 1.0G
    Est-ce que, pour 20000 comptes environ, une machine taillée avec 4 vCPU à 3Ghz plus 8G de ram suffirait ? Le trafic ne sera pas non plus énormissime, mais je dois m’attendre à quelques surprises

    1. Salut
      Mais de rien 😉

      1 :
      Il faut utiliser Metada Exporter :
      metadata_exporter {

      rules {

      MY_EMAIL_1 {
      backend = « send_mail »;
      smtp = « 127.0.0.1 »;
      mail_to = « user@example.com »;
      selector = « is_reject »;
      formatter = « email_alert »;
      }
      }
      }

      2 : Je pense que oui, mais le meilleur moyen de savoir, c’est de tester.
      C’est un truc du coup à monitorer avec Prometheus dont je parle dans d’autres articles 😉

  2. Hello,
    Merci pour tes réponses. Une dernière question du coup, liée à celles que je t’ai posé plus tôt :
    Si j’ai autant de domaines que d’ip dispo, est-ce que pour de meilleurs perds, il peut être plus judicieux pour moi de faire une instance postfix par domaine (comme tu me l’as montré dans la partie postfix) ou est-ce que ça revient au même de mettre tous les domaines sur la même instance ?

    À savoir que dans tous les cas, tout tournerait sur la même machine.

    Ps: ça me donne une idée pour un prochain article : comment gérer la répartition de charge, si plusieurs serveurs dispo dans le même lan 😉 (si jamais :p)

    Encore merci, à plus !

    1. Oups, j’étais passé à côté de ton commentaire.
      Je serais d’avis que tant que tu peux faire avec une instance, garde avec une instance.
      La gestion multidomaine se fait très bien au final, et si y’a des précisions à apporter en fonction du domaine, avec les filtres LDAP on peut se sortir de presque tout.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *