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:46] – cyrille | clamav [2025/11/12 14:26] (Version actuelle) – cyrille | ||
|---|---|---|---|
| Ligne 28: | Ligne 28: | ||
| - | < | + | <code | download> |
| sudo nano / | sudo nano / | ||
| </ | </ | ||
| Ligne 34: | Ligne 34: | ||
| Avec le contenu | Avec le contenu | ||
| - | < | + | <code | download> |
| #!/bin/bash | #!/bin/bash | ||
| # Script : freshclam-auto.sh | # Script : freshclam-auto.sh | ||
| Ligne 73: | Ligne 73: | ||
| On le sauvegarde et on le rend exécutable | On le sauvegarde et on le rend exécutable | ||
| - | < | + | < |
| sudo chmod +x / | sudo chmod +x / | ||
| </ | </ | ||
| Ligne 84: | Ligne 84: | ||
| - | < | + | < |
| [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 : | ||
| - | < | + | < |
| sudo systemctl daemon-reload | sudo systemctl daemon-reload | ||
| sudo systemctl enable freshclam.service | sudo systemctl enable freshclam.service | ||
| Ligne 123: | Ligne 123: | ||
| - | < | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 143: | Ligne 143: | ||
| Ce qui donnera finalement dans l’arborescence des logs | Ce qui donnera finalement dans l’arborescence des logs | ||
| - | < | + | < |
| / | / | ||
| / | / | ||
| Ligne 154: | Ligne 154: | ||
| Et voici un exemple de leur contenu | Et voici un exemple de leur contenu | ||
| - | < | + | < |
| / | / | ||
| 2025-11-13 10:12:00 - Lancement de freshclam... | 2025-11-13 10:12:00 - Lancement de freshclam... | ||
| Ligne 173: | Ligne 173: | ||
| - | < | + | < |
| #!/bin/bash | #!/bin/bash | ||
| # Script pour afficher les dernières mises à jour ClamAV | # Script pour afficher les dernières mises à jour ClamAV | ||
| Ligne 206: | Ligne 206: | ||
| Et on peut le tester | Et on peut le tester | ||
| - | < | + | < |
| sudo / | sudo / | ||
| </ | </ | ||
| Ligne 212: | Ligne 212: | ||
| Ce qui donnera une sortie de ce style | Ce qui donnera une sortie de ce style | ||
| - | < | + | < |
| ===== Dernières mises à jour ClamAV ===== | ===== Dernières mises à jour ClamAV ===== | ||
| --- Log actuel (freshclam-update.log) --- | --- Log actuel (freshclam-update.log) --- | ||
| 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 254: | Ligne 255: | ||
| Créer le script **/ | Créer le script **/ | ||
| - | < | + | <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 | ||
| - | < | + | < |
| declare -A MOUNTS_SCHEDULE=( | declare -A MOUNTS_SCHEDULE=( | ||
| ["/ | ["/ | ||
| Ligne 339: | Ligne 411: | ||
| Pensez également à adapter cette ligne | Pensez également à adapter cette ligne | ||
| - | < | + | < |
| MAILTO=" | MAILTO=" | ||
| </ | </ | ||
| Ligne 349: | Ligne 421: | ||
| - | < | + | < |
| 0 * * * * / | 0 * * * * / | ||
| </ | </ | ||
| Ligne 360: | Ligne 432: | ||
| - | < | + | < |
| / | / | ||
| weekly | weekly | ||
| Ligne 384: | Ligne 456: | ||
| - | < | + | < |
| - | # --- 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 | ||
| - | < | + | < |
| echo "💽 Disques :" | echo "💽 Disques :" | ||
| MOUNTS=("/ | MOUNTS=("/ | ||