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 !
Petit tip bien mérité !
Merci pour la qualité de tes articles.
Merci beaucoup !
Et merci pour la qualité, j’essaye de faire au mieux 🙂
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
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 😉
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 !
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.
Décidément j’aime ces tutos, merci.
J’ai juste une question à propos de l’intégration de ClamAV avec Rspamd et qu eue n’ai pas vu dans les configurations :
Que se passe t’il avec les annexes archivées (tgz, zip, …) ?
Est-ce que Rspamd ce système les désarchivent pour en scanner le contenu ?
Si oui, est-ce qu’il y a une limite de taille pour éviter la surcharge et la mise en quarentaine en cas de dépassement ?
Si je te pose toutes ces questions c’est que auparavant on utilisait amavis-new comme aiguilleur de l’analyse des SPAM/Virus/… On avait utilisé également ce mécanisme pour les mises en quarantaine des m…
Bon week-end