Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| clamav [2025/11/09 16:42] – créée 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 72: | 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 83: | 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 103: | 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 122: | Ligne 123: | ||
| - | <code | download> | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 135: | 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 142: | Ligne 143: | ||
| Ce qui donnera finalement dans l’arborescence des logs | Ce qui donnera finalement dans l’arborescence des logs | ||
| - | <code | download> | + | < |
| / | / | ||
| / | / | ||
| Ligne 153: | 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 172: | 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 198: | Ligne 199: | ||
| Comme d' | Comme d' | ||
| - | <code | download> | + | < |
| sudo chmod +x / | sudo chmod +x / | ||
| </ | </ | ||
| Ligne 205: | Ligne 206: | ||
| Et on peut le tester | Et on peut le tester | ||
| - | <code | download> | + | < |
| sudo / | sudo / | ||
| </ | </ | ||
| Ligne 211: | 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 226: | 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 247: | 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 254: | 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 269: | Ligne 277: | ||
| ["/" | ["/" | ||
| ) | ) | ||
| + | |||
| + | # Rotation simple du log (5 Mo max) | ||
| + | [ -f " | ||
| for MOUNT in " | for MOUNT in " | ||
| Ligne 276: | 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 286: | 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 310: | Ligne 377: | ||
| fi | fi | ||
| - | | + | |
| date '+%F %T' > " | date '+%F %T' > " | ||
| + | rm -f " | ||
| + | trap - EXIT | ||
| else | else | ||
| Ligne 321: | Ligne 390: | ||
| fi | fi | ||
| done | done | ||
| + | |||
| + | |||
| + | |||
| + | |||
| </ | </ | ||
| Ligne 326: | 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 338: | Ligne 411: | ||
| Pensez également à adapter cette ligne | Pensez également à adapter cette ligne | ||
| - | <code | download> | + | < |
| MAILTO=" | MAILTO=" | ||
| </ | </ | ||
| Ligne 348: | Ligne 421: | ||
| - | <code | download> | + | < |
| 0 * * * * / | 0 * * * * / | ||
| </ | </ | ||
| Ligne 359: | Ligne 432: | ||
| - | <code | download> | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 383: | 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 409: | 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=("/ | ||