Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| clamav [2025/11/09 16:42] – cyrille | clamav [2025/11/12 14:26] (Version actuelle) – cyrille | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== ClamAV : automatisation avancée | + | ===== ClamAV : automatisation avancée ===== |
| Voici une proposition en deux temps pour gérer **freshclam** et **clamAV** sur un serveur (ou un PC personnel). | Voici une proposition en deux temps pour gérer **freshclam** et **clamAV** sur un serveur (ou un PC personnel). | ||
| - | Cet how to suppose que **fresclam** et **clamav** soient installés sur le PC (et éventuellement **clamav-daemon**) . | + | Cet how to suppose que **fresclam** et **clamav** soient installés sur le PC (et éventuellement **clamav-daemon**). |
| - | **//1- Gestion automatiser de la mise à jour de la base de virus via **fresclam** | + | **//1- Gestion automatiser de la mise à jour de la base de virus via **fresclam**. //** |
| - | 2- Utiliser **clamAV** de façon intelligent afin de réduire au mieux la charge serveur (si scan de gros disque)//** | + | **//2- Utiliser **clamAV** de façon intelligent afin de réduire au mieux la charge serveur (si scan de gros disque)//** |
| **PS**, | **PS**, | ||
| Ligne 73: | Ligne 73: | ||
| On le sauvegarde et on le rend exécutable | On le sauvegarde et on le rend exécutable | ||
| - | <code | download> | + | < |
| sudo chmod +x / | sudo chmod +x / | ||
| </ | </ | ||
| Ligne 84: | Ligne 84: | ||
| - | <code | download> | + | < |
| [Unit] | [Unit] | ||
| Description=Update ClamAV database 10 minutes after boot (only if outdated) | Description=Update ClamAV database 10 minutes after boot (only if outdated) | ||
| Ligne 104: | Ligne 104: | ||
| On recharge systemd, on active ce script et le lance : | On recharge systemd, on active ce script et le lance : | ||
| - | <code | download> | + | < |
| sudo systemctl daemon-reload | sudo systemctl daemon-reload | ||
| sudo systemctl enable freshclam.service | sudo systemctl enable freshclam.service | ||
| Ligne 123: | Ligne 123: | ||
| - | <code | download> | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 136: | Ligne 136: | ||
| Afin de vérifier sa bonne prise en charge et tester la configuration sans attendre la rotation réelle : | Afin de vérifier sa bonne prise en charge et tester la configuration sans attendre la rotation réelle : | ||
| - | <code | download> | + | < |
| sudo logrotate --debug / | sudo logrotate --debug / | ||
| </ | </ | ||
| Ligne 143: | Ligne 143: | ||
| Ce qui donnera finalement dans l’arborescence des logs | Ce qui donnera finalement dans l’arborescence des logs | ||
| - | <code | download> | + | < |
| / | / | ||
| / | / | ||
| Ligne 154: | Ligne 154: | ||
| Et voici un exemple de leur contenu | Et voici un exemple de leur contenu | ||
| - | <code | download> | + | < |
| / | / | ||
| 2025-11-13 10:12:00 - Lancement de freshclam... | 2025-11-13 10:12:00 - Lancement de freshclam... | ||
| Ligne 173: | Ligne 173: | ||
| - | <code | download> | + | < |
| #!/bin/bash | #!/bin/bash | ||
| # Script pour afficher les dernières mises à jour ClamAV | # Script pour afficher les dernières mises à jour ClamAV | ||
| Ligne 199: | Ligne 199: | ||
| Comme d' | Comme d' | ||
| - | <code | download> | + | < |
| sudo chmod +x / | sudo chmod +x / | ||
| </ | </ | ||
| Ligne 206: | Ligne 206: | ||
| Et on peut le tester | Et on peut le tester | ||
| - | <code | download> | + | < |
| sudo / | sudo / | ||
| </ | </ | ||
| Ligne 212: | Ligne 212: | ||
| Ce qui donnera une sortie de ce style | Ce qui donnera une sortie de ce style | ||
| - | <code | download> | + | < |
| ===== Dernières mises à jour ClamAV ===== | ===== Dernières mises à jour ClamAV ===== | ||
| --- Log actuel (freshclam-update.log) --- | --- Log actuel (freshclam-update.log) --- | ||
| Ligne 227: | Ligne 227: | ||
| - | ===== Scanner son système ===== | + | ====== Scanner son système |
| On va écrire un script intelligent pour ne scanner que les fichiers modifiés depuis la dernière exécution, ce qui est idéal pour des disques volumineux (comme des disques contenant plein de MP3 par exemple). Cela réduira drastiquement le temps et la charge. | On va écrire un script intelligent pour ne scanner que les fichiers modifiés depuis la dernière exécution, ce qui est idéal pour des disques volumineux (comme des disques contenant plein de MP3 par exemple). Cela réduira drastiquement le temps et la charge. | ||
| Ligne 248: | Ligne 248: | ||
| * Priorité CPU et I/O très faible → serveur reste réactif | * Priorité CPU et I/O très faible → serveur reste réactif | ||
| * Compatible avec logrotate. | * Compatible avec logrotate. | ||
| + | * Prise en charge des noms de fichiers avec des espaces et des caractères spéciaux lors des scans | ||
| Ligne 255: | Ligne 256: | ||
| <code | download> | <code | download> | ||
| + | |||
| #!/bin/bash | #!/bin/bash | ||
| + | # ============================================================ | ||
| # Scan ClamAV incrémental avec priorité CPU/I/O faible et lock | # Scan ClamAV incrémental avec priorité CPU/I/O faible et lock | ||
| + | # Compatible espaces/ | ||
| + | # Exclusions dynamiques des sous-montages | ||
| # Usage : cron toutes les heures | # Usage : cron toutes les heures | ||
| + | # Auteur : CB | ||
| + | # ============================================================ | ||
| LOGFILE="/ | LOGFILE="/ | ||
| - | MAILTO=" | + | MAILTO=" |
| CURRENT_HOUR=$(date ' | CURRENT_HOUR=$(date ' | ||
| - | # Disques et horaires (heures | + | # Disques et heures |
| declare -A MOUNTS_SCHEDULE=( | declare -A MOUNTS_SCHEDULE=( | ||
| ["/ | ["/ | ||
| Ligne 270: | Ligne 277: | ||
| ["/" | ["/" | ||
| ) | ) | ||
| + | |||
| + | # Rotation simple du log (5 Mo max) | ||
| + | [ -f " | ||
| for MOUNT in " | for MOUNT in " | ||
| Ligne 277: | Ligne 287: | ||
| if mountpoint -q " | if mountpoint -q " | ||
| + | # Normalise le nom du lock et timestamp (pour dashboard) | ||
| + | if [ " | ||
| + | NAME=" | ||
| + | else | ||
| + | NAME=$(basename " | ||
| + | fi | ||
| + | |||
| + | mkdir -p / | ||
| + | LOCKFILE="/ | ||
| # Lock par disque pour éviter scans simultanés | # Lock par disque pour éviter scans simultanés | ||
| - | LOCKFILE="/ | ||
| exec 200>" | exec 200>" | ||
| if ! flock -n 200; then | if ! flock -n 200; then | ||
| Ligne 287: | Ligne 305: | ||
| # Fichier de suivi de la dernière exécution | # Fichier de suivi de la dernière exécution | ||
| - | TIMESTAMP_FILE="/ | + | TIMESTAMP_FILE="/ |
| - | | + | |
| - | | + | |
| - | else | + | |
| - | LAST_RUN=" | + | |
| - | fi | + | |
| - | # Liste temporaire | + | # Liste temporaire |
| FILE_LIST=$(mktemp) | FILE_LIST=$(mktemp) | ||
| - | find " | + | |
| + | |||
| + | # Construction dynamique des exclusions si c'est la racine | ||
| + | if [ " | ||
| + | # Liste des chemins à exclure pour le scan du système | ||
| + | EXCLUDES=( | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | "/ | ||
| + | ) | ||
| + | |||
| + | # Construction dynamique du filtre d' | ||
| + | PRUNE_EXPR="" | ||
| + | |||
| + | # On exclut d' | ||
| + | for DISK in " | ||
| + | [ " | ||
| + | done | ||
| + | |||
| + | # Puis on ajoute les exclusions système | ||
| + | for EXCL in " | ||
| + | PRUNE_EXPR=" | ||
| + | done | ||
| + | |||
| + | # Supprime le dernier -o éventuel (sinon find râle) | ||
| + | PRUNE_EXPR=${PRUNE_EXPR% -o} | ||
| + | |||
| + | echo " | ||
| + | |||
| + | # Recherche des fichiers modifiés en ignorant les exclusions | ||
| + | find / \( $PRUNE_EXPR \) -prune -o -type f -newermt " | ||
| + | else | ||
| + | # Pour les autres montages, on scanne tout | ||
| + | | ||
| + | fi | ||
| if [ -s " | if [ -s " | ||
| - | # Limiter | + | |
| - | SCAN_OUTPUT=$(ionice -c3 nice -n19 xargs -a " | + | |
| + | | ||
| + | SCAN_OUTPUT=$(ionice -c3 nice -n19 \ | ||
| + | | ||
| echo " | echo " | ||
| - | # Alerte mail si virus trouvé | + | # Envoi d' |
| if echo " | if echo " | ||
| - | echo -e " | + | |
| + | | ||
| + | echo | ||
| + | echo "$SCAN_OUTPUT" | ||
| + | } | / | ||
| fi | fi | ||
| else | else | ||
| Ligne 311: | Ligne 377: | ||
| fi | fi | ||
| - | | + | |
| date '+%F %T' > " | date '+%F %T' > " | ||
| + | rm -f " | ||
| + | trap - EXIT | ||
| else | else | ||
| Ligne 322: | Ligne 390: | ||
| fi | fi | ||
| done | done | ||
| + | |||
| + | |||
| + | |||
| + | |||
| </ | </ | ||
| Ligne 327: | Ligne 399: | ||
| Il va falloir que vous adaptiez cette fonction bash à votre environnement | Il va falloir que vous adaptiez cette fonction bash à votre environnement | ||
| - | <code | download> | + | < |
| declare -A MOUNTS_SCHEDULE=( | declare -A MOUNTS_SCHEDULE=( | ||
| ["/ | ["/ | ||
| Ligne 339: | Ligne 411: | ||
| Pensez également à adapter cette ligne | Pensez également à adapter cette ligne | ||
| - | <code | download> | + | < |
| MAILTO=" | MAILTO=" | ||
| </ | </ | ||
| Ligne 349: | Ligne 421: | ||
| - | <code | download> | + | < |
| 0 * * * * / | 0 * * * * / | ||
| </ | </ | ||
| Ligne 360: | Ligne 432: | ||
| - | <code | download> | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 384: | Ligne 456: | ||
| - | <code | download> | + | < |
| - | # --- Dernier passage ClamAV avec couleur | + | # |
| print_clamav_last_run() { | print_clamav_last_run() { | ||
| local mount=$1 | local mount=$1 | ||
| - | local ts_file="/ | + | |
| + | if [ " | ||
| + | base=" | ||
| + | else | ||
| + | base=$(basename " | ||
| + | fi | ||
| + | | ||
| local color=$GREEN | local color=$GREEN | ||
| - | local last_run=" | + | local last_run=" |
| if [ -f " | if [ -f " | ||
| last_run=$(cat " | last_run=$(cat " | ||
| - | # Calculer l'âge du scan en heures | ||
| local last_epoch=$(date -d " | local last_epoch=$(date -d " | ||
| local now_epoch=$(date +%s) | local now_epoch=$(date +%s) | ||
| Ligne 410: | Ligne 487: | ||
| fi | fi | ||
| - | printf " | + | |
| + | local label=" | ||
| + | [ " | ||
| + | |||
| + | # Alignement propre sur 12 + 19 caractères | ||
| + | | ||
| } | } | ||
| + | |||
| </ | </ | ||
| Et pour insérer les entrées, ajouter les lignes suivantes à votre dashboard | Et pour insérer les entrées, ajouter les lignes suivantes à votre dashboard | ||
| - | <code | download> | + | < |
| echo "💽 Disques :" | echo "💽 Disques :" | ||
| MOUNTS=("/ | MOUNTS=("/ | ||