Issa
January 14, 2026, 8:39pm
1
Bonjour Ă tous !
Je partage avec vous un script open-source que j’ai développé pour monitorer la sécurité mail de mon serveur YunoHost. Après plusieurs semaines d’utilisation et d’améliorations, je pense qu’il peut être utile à la communauté !
Présentation du projet
YunoHost Mail Security Audit est un script bash qui génère des rapports HTML sur la sécurité de votre serveur mail. Il analyse vos logs Postfix/Dovecot et vous envoie quotidiennement un résumé complet par email.
Problème résolu
Quand on héberge son propre serveur mail, on se pose souvent ces questions :
Mon serveur est-il attaqué ?
Combien de tentatives d’intrusion par jour ?
Fail2ban fonctionne-t-il correctement ?
D’où viennent les attaques ?
Y a-t-il des comportements anormaux ?
Ce script répond à toutes ces questions en un coup d’œil !
Fonctionnalités principales
Rapport HTML quotidien automatique
Période d’analyse configurable (1-90 jours)
Statistiques détaillées : tentatives d’attaque, mails envoyés, connexions externes
Top 5 des IPs attaquantes avec indicateurs visuels temps réel
Top 5 expéditeurs avec distinction Système/Utilisateur
Top 5 destinataires avec distinction Interne/Externe
État de Fail2ban et liste des IPs bannies
Alertes intelligentes selon le niveau de menace
Indicateurs visuels de menace
EN COURS (< 1h) : Attaque active avec animation pulsante
Récente (< 24h) : Attaque récente probablement bloquée
Ancienne (> 24h) : Attaque déjà gérée
Alertes temps réel (optionnel)
Un second script surveille en continu et envoie une alerte immédiate si :
Volume d’attaques anormal détecté
Seuil configurable (défaut : 50 tentatives en 60 minutes)
Anti-spam intégré (1 alerte/heure max)
Aperçu du rapport
Je vous joins un exemple de rapport HTML (avec données anonymisées) pour que vous puissiez voir le rendu final. Le rapport est responsive et s’affiche parfaitement sur mobile !
Voir le fichier HTML joint ci-dessous
demo_rapport_html_yunohost.pdf (740.2 KB)
Exemple de statistiques (mon serveur)
Sur 7 jours :
2010 tentatives d’attaque bloquées (287/jour en moyenne)
0 connexion externe suspecte
Fail2ban actif : 2 IPs bannies actuellement
365 mails envoyés (normal : majoritairement système)
Résultat : Mon serveur est bien protégé et je suis rassuré !
À qui s’adresse ce script ?
Vous hébergez votre propre serveur mail YunoHost
Vous voulez monitorer la sécurité sans avoir à lire les logs
Vous voulez être alerté en cas d’attaque massive
Vous aimez les beaux rapports HTML
Sécurité et confidentialité
Aucune donnée n’est envoyée à l’extérieur (tout reste local)
Pas de dépendances externes (sauf mutt pour l’envoi d’emails)
Logs analysés uniquement en lecture
Script auditable (100% bash, ~350 lignes commentées)
Idées pour futures versions (v2.0)
Graphiques des attaques par jour (Chart.js)
Carte des pays attaquants
Tendances sur plusieurs mois
Intégration Telegram/Discord pour alertes
Package YunoHost officiel
Questions ?
N’hésitez pas à me poser vos questions dans ce fil ! Je serai ravi d’y répondre et d’améliorer le script selon vos besoins.
Merci à la communauté YunoHost pour cet excellent projet ! PS : Le rapport HTML de démonstration est joint à ce message. N’hésitez pas à l’ouvrir pour voir le rendu !
demo_rapport_html_yunohost.pdf (740.2 KB)
lien du projet : GitHub - gamersalpha/yunohost-mail-security-audit: 🛡️ Daily HTML security reports and real-time alerts for YunoHost mail servers exposed to the Internet
7 Likes
Issa
January 14, 2026, 8:59pm
3
je met Ă jour le premier post
🛡️ Daily HTML security reports and real-time alerts for YunoHost mail servers exposed to the Internet
2 Likes
Intéressant.
Jettes un coup d’œil sur ceci, ça peut de donner des idées
#!/bin/bash
# Script to generate and send pflogsumm report for yesterday's mail activity
# Requires pflogsumm and geoip-bin to be installed: `sudo apt install pflogsumm geoip-bin -y`
# Place it in /etc/cron.daily and ensure it is executable (with `chmod +x mail-report`)
# Set variables
LOG_FILE="/var/log/mail.log"
REPORT_DATE=$(date -d "yesterday" +"%Y-%m-%d")
YESTERDAY_FORMAT=$(date -d "yesterday" +"%Y-%m-%d")
SUBJECT="Postfix Mail Report for $REPORT_DATE"
RECIPIENT="root"
# Function to get country from IP using geoiplookup
get_country() {
local ip=$1
if command -v geoiplookup &> /dev/null; then
# Try to get country from IP
country=$(geoiplookup "$ip" 2>/dev/null | awk -F ': ' '{print $2}' | awk -F ',' '{print $1}')
if [[ -z "$country" || "$country" == "IP Address not found" ]]; then
This file has been truncated. show original
(je l’utilise depuis un moment et je l’ai sur tous mes serveurs)
2 Likes
Merci pour le partage Je vais tester cela
C’est vraiment sympa !
Je vais essayer de le mettre en place.
Salut,
j’ai mis en place le script, et c’est très intéressant comme retour de métrique.
Maintenant, la vraie question et de savoir comment mettre en place plus de sécurité, ou simplement bloque les adresses IP abusives.
La documentation donne les infos pour debannir une IP , mais je ne peux pas en ajouter par moi-mĂŞme ?
metyun
January 25, 2026, 10:11am
9
Si tu souhaites bannir avec Fail2ban c’est exactement pareil que sur la documentation à l’exception que tu remplaces unbanip par banip.
metyun
January 25, 2026, 10:26am
10
Avec pflogsumm que j’utilise, j’avais rencontré le problème que les rapports étaient vides le W.E. avec la ligne suivant dans mon crontab :
55 0 * * * /usr/sbin/pflogsumm -u 5 -h 5 --problems_first -d yesterday /var/log/mail.log | mail -s "Rapport Postfix du `date`" postmaster@domain.tld
Ce comportement est normal car logrotate effectue une rotation des logs, aussi il faut passer 2 lignes pour prendre en compte tous les jours de la semaine :
55 0 * * 1-6 /usr/sbin/pflogsumm -u 5 -h 5 --problems_first -d yesterday /var/log/mail.log | mail -s "Rapport Postfix du `date`" postmaster@domain.tld
55 0 * * 7 /usr/sbin/pflogsumm -u 5 -h 5 --problems_first -d yesterday /var/log/mail.log.1 | mail -s "Rapport Postfix du `date`" postmaster@domain.tld
J’ai survolé (très) rapidement le script mail-report, je n’ai pas vu que tu tenais compte de ça, vu que tu le place dans /etc/cron.daily, il faudrait le gérer directement dans le script pour tester la date et parcourir mail.log ou mail.log.1 selon le jour.
J’avais aussi eu ce problème, résolu par l’ajout de * à la fin du logfile pour inclure les logs rotés
1 Like
metyun
January 25, 2026, 4:59pm
12
Quand j’ai dis que j’ai survolé, j’ai effectivement survolé Mea culpa.
1 Like
Oui, effectivement c’est long. C’était trois lignes au début mais au fur et à mesure que je testais j’ai ajouté des trucs. J’aurais dû mettre plus de commentaires expliquant le pourquoi de chaque ajout
1 Like
And how safe is your script? Is it vibe-coded?
Issa
January 26, 2026, 10:04pm
15
Hello,
Yes, it was developed with Claude’s assistance. But I made sure to:
Read and understand every line
Test it thoroughly on my YunoHost server
Add comprehensive documentation
Include warnings and disclaimers
Make it read-only (no system modifications)
The script is intentionally simple: it reads logs, parses them, and generates HTML reports. No rocket science, but it does the job well for monitoring mail server security.
Feel free to audit the code - it’s only 200 lines of well-commented Bash.
rodinux
January 27, 2026, 8:39pm
16
Merci pour le partage, plus facile à lire que des rapports pflogsumm…
Hello,
Tell me, this script is still relevant:
## Start by cloning the following repo
```
git clone https://github.com/pvxe/nftables-geoip.git
cd nftables-geoip
```
## Check location.csv for the country codes you need to add (in both this command and 20-geoip-blocking.conf)
```
./nft_geoip.py --download -c cn,ru,ro,br,nl,ng,bd,ph,pk,th,hk,vn
```
## Del continents as they are not used and simply didn't work for me
```
sed -n '/^map continent_code/ q; p' geoip-def-all.nft > /etc/nftables.d/01-geoip-def-all.conf
cp geoip-ipv4-interesting.nft /etc/nftables.d/10-geoip-ipv4.conf
cp geoip-ipv6-interesting.nft /etc/nftables.d/11-geoip-ipv6.conf
Ce fichier a été tronqué. afficher l'original
Does it work just as well in self-hosting as it does on a VPS?
petrus
January 28, 2026, 5:32am
19
I think there’s no problem with that. Linux can live in a vps and any other machine physical or logical, and will run your scripts without making a difference
I’m using it on my vps.
Don’t block the US, your server will suffer and don’t block Malaysia, your certificates won’t regenerate
2 Likes
It’s good to know,
In the US, I don’t have servers there, why would it suffer?
I just want to block some countries like (CN, RU, KP. KG, BY…). I know with a VPN they can bypass, but it will reduce the attacks a bit.
Thank You