Outils pour utilisateurs

Outils du site


clamav

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
clamav [2025/11/09 16:42] cyrilleclamav [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>+<code  | download>
 sudo chmod +x /root/scripts/clamAV/freshclam-auto.sh sudo chmod +x /root/scripts/clamAV/freshclam-auto.sh
 </code> </code>
Ligne 84: Ligne 84:
  
  
-<code | download>+<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>+<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>+<code  | download>
 /var/log/freshclam-update.log { /var/log/freshclam-update.log {
     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>+<code bash | download>
 sudo logrotate --debug /etc/logrotate.conf sudo logrotate --debug /etc/logrotate.conf
 </code> </code>
Ligne 143: Ligne 143:
 Ce qui donnera finalement dans l’arborescence des logs Ce qui donnera finalement dans l’arborescence des logs
  
-<code | download>+<code  | download>
 /var/log/freshclam-update.log       # log actuel /var/log/freshclam-update.log       # log actuel
 /var/log/freshclam-update.log.1.gz  # 1 semaine avant /var/log/freshclam-update.log.1.gz  # 1 semaine avant
Ligne 154: Ligne 154:
 Et voici un exemple de leur contenu Et voici un exemple de leur contenu
  
-<code | download>+<code  | download>
 /var/log/freshclam-update.log /var/log/freshclam-update.log
 2025-11-13 10:12:00 - Lancement de freshclam... 2025-11-13 10:12:00 - Lancement de freshclam...
Ligne 173: Ligne 173:
  
  
-<code | download>+<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'habitude, on le rend exécutable Comme d'habitude, on le rend exécutable
-<code | download>+<code bash | download>
 sudo chmod +x /usr/local/bin/freshclam-log.sh sudo chmod +x /usr/local/bin/freshclam-log.sh
 </code> </code>
Ligne 206: Ligne 206:
 Et on peut le tester  Et on peut le tester 
  
-<code | download>+<code  | download>
 sudo /usr/local/bin/freshclam-log.sh sudo /usr/local/bin/freshclam-log.sh
 </code> </code>
Ligne 212: Ligne 212:
 Ce qui donnera une sortie de ce style Ce qui donnera une sortie de ce style
  
-<code | download>+<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/accents et dashboard (racine /)
 +# Exclusions dynamiques des sous-montages
 # Usage : cron toutes les heures # Usage : cron toutes les heures
 +# Auteur : CB
 +# ============================================================
  
 LOGFILE="/var/log/clamscan-auto.log" LOGFILE="/var/log/clamscan-auto.log"
-MAILTO="admin@example.com"  # <-- mettre ton email+MAILTO="admin@example.com"  # <-- mettre votre email
 CURRENT_HOUR=$(date '+%H') CURRENT_HOUR=$(date '+%H')
  
-# Disques et horaires (heures pleines)+# Disques et heures de passage
 declare -A MOUNTS_SCHEDULE=( declare -A MOUNTS_SCHEDULE=(
     ["/diskTOTO"]="02"     ["/diskTOTO"]="02"
Ligne 270: Ligne 277:
     ["/"]="05"     ["/"]="05"
 ) )
 +
 +# Rotation simple du log (5 Mo max)
 +[ -f "$LOGFILE" ] && [ "$(stat -c%s "$LOGFILE")" -gt 5000000 ] && mv "$LOGFILE" "${LOGFILE}.1"
  
 for MOUNT in "${!MOUNTS_SCHEDULE[@]}"; do for MOUNT in "${!MOUNTS_SCHEDULE[@]}"; do
Ligne 277: Ligne 287:
  
         if mountpoint -q "$MOUNT"; then         if mountpoint -q "$MOUNT"; then
 +            # Normalise le nom du lock et timestamp (pour dashboard)
 +            if [ "$MOUNT" == "/" ]; then
 +                NAME="_"
 +            else
 +                NAME=$(basename "$MOUNT")
 +            fi
 +
 +            mkdir -p /var/run/clamscan-locks
 +            LOCKFILE="/var/run/clamscan-locks/${NAME}.lock"
  
             # Lock par disque pour éviter scans simultanés             # Lock par disque pour éviter scans simultanés
-            LOCKFILE="/var/run/clamscan-$(basename "$MOUNT").lock" 
             exec 200>"$LOCKFILE"             exec 200>"$LOCKFILE"
             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="/var/log/clamscan-last-$(basename "$MOUNT").timestamp" +            TIMESTAMP_FILE="/var/log/clamscan-last-${NAME}.timestamp" 
-            if [ -f "$TIMESTAMP_FILE" ]; then +            LAST_RUN="1970-01-01 00:00:00" 
-                LAST_RUN=$(cat "$TIMESTAMP_FILE") +            [ -f "$TIMESTAMP_FILE"&& LAST_RUN=$(cat "$TIMESTAMP_FILE")
-            else +
-                LAST_RUN="1970-01-01 00:00:00" +
-            fi+
  
-            # Liste temporaire de fichiers modifiés depuis le dernier scan+            # Liste temporaire des fichiers modifiés
             FILE_LIST=$(mktemp)             FILE_LIST=$(mktemp)
-            find "$MOUNT" -type f -newermt "$LAST_RUN" > "$FILE_LIST"+            trap 'rm -f "$FILE_LIST"' EXIT 
 + 
 + # Construction dynamique des exclusions si c'est la racine 
 + if [ "$MOUNT" == "/" ]; then 
 +     # Liste des chemins à exclure pour le scan du système 
 +     EXCLUDES=( 
 +         "/proc" 
 +         "/sys" 
 +         "/dev" 
 +         "/run" 
 +         "/var/run" 
 +         "/tmp" 
 +         "/var/tmp" 
 +         "/var/cache" 
 +         "/var/lib/apt/lists" 
 +         "/boot" 
 +         "/usr/share/doc" 
 +         "/usr/share/man" 
 +     ) 
 + 
 +     # Construction dynamique du filtre d'exclusion 
 +     PRUNE_EXPR="" 
 +      
 +     # On exclut d'abord les autres points de montage définis dans MOUNTS_SCHEDULE 
 +     for DISK in "${!MOUNTS_SCHEDULE[@]}"; do 
 +         [ "$DISK" != "/" ] && PRUNE_EXPR="$PRUNE_EXPR -path $DISK -o" 
 +     done 
 + 
 +     # Puis on ajoute les exclusions système 
 +     for EXCL in "${EXCLUDES[@]}"; do 
 +         PRUNE_EXPR="$PRUNE_EXPR -o -path $EXCL" 
 +     done 
 + 
 +     # Supprime le dernier -o éventuel (sinon find râle) 
 +     PRUNE_EXPR=${PRUNE_EXPR% -o} 
 + 
 +     echo "Exclusions actives : $PRUNE_EXPR" >> "$LOGFILE" 
 + 
 +     # Recherche des fichiers modifiés en ignorant les exclusions 
 +     find / \( $PRUNE_EXPR \) -prune -o -type f -newermt "$LAST_RUN" -print0 > "$FILE_LIST" 
 + else 
 +     # Pour les autres montages, on scanne tout 
 +     find "$MOUNT" -type f -newermt "$LAST_RUN" -print0 > "$FILE_LIST" 
 + fi
  
             if [ -s "$FILE_LIST" ]; then             if [ -s "$FILE_LIST" ]; then
-                # Limiter l’usage CPU et I/O avec nice et ionice +                echo "$(date '+%F %T') - Lancement du scan sur fichiers modifiés" >> "$LOGFILE" 
-                SCAN_OUTPUT=$(ionice -c3 nice -n19 xargs -a "$FILE_LIST" /usr/bin/clamscan -i 2>&1)+ 
 +                # Limiter charge CPU/I/O et mémoire (traitement par lots de 100) 
 +                SCAN_OUTPUT=$(ionice -c3 nice -n19 
 +                    xargs -0 -n100 --no-run-if-empty /usr/bin/clamscan -i < "$FILE_LIST" 2>&1) 
                 echo "$SCAN_OUTPUT" >> "$LOGFILE"                 echo "$SCAN_OUTPUT" >> "$LOGFILE"
  
-                # Alerte mail si virus trouvé+                # Envoi d'alerte si infection détectée
                 if echo "$SCAN_OUTPUT" | grep -q "FOUND"; then                 if echo "$SCAN_OUTPUT" | grep -q "FOUND"; then
-                    echo -e "Sujet: [ALERTE] Virus détecté sur $MOUNT\n\n$SCAN_OUTPUT" | /usr/sbin/sendmail "$MAILTO"+                    
 +                        echo "Sujet: [ALERTE] Virus détecté sur $MOUNT
 +                        echo 
 +                        echo "$SCAN_OUTPUT" 
 +                    } | /usr/sbin/sendmail "$MAILTO"
                 fi                 fi
             else             else
Ligne 311: Ligne 377:
             fi             fi
  
-            rm -f "$FILE_LIST"+            # Sauvegarde du timestamp et nettoyage
             date '+%F %T' > "$TIMESTAMP_FILE"             date '+%F %T' > "$TIMESTAMP_FILE"
 +            rm -f "$FILE_LIST"
 +            trap - EXIT
  
         else         else
Ligne 322: Ligne 390:
     fi     fi
 done done
 +
 +
 +
 +
 </code> </code>
  
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>+<code  | download>
 declare -A MOUNTS_SCHEDULE=( declare -A MOUNTS_SCHEDULE=(
     ["/diskTOTO"]="02"     ["/diskTOTO"]="02"
Ligne 339: Ligne 411:
  
 Pensez également à adapter cette ligne Pensez également à adapter cette ligne
-<code | download>+<code  | download>
 MAILTO="admin@example.com"  # <-- Y mettre votre email MAILTO="admin@example.com"  # <-- Y mettre votre email
 </code> </code>
Ligne 349: Ligne 421:
  
  
-<code | download>+<code  | download>
 0 * * * * /root/scripts/clamAV/clamscan-timer-inc-lock.sh 0 * * * * /root/scripts/clamAV/clamscan-timer-inc-lock.sh
 </code> </code>
Ligne 360: Ligne 432:
  
  
-<code | download>+<code  | download>
 /var/log/clamscan-auto.log { /var/log/clamscan-auto.log {
     weekly     weekly
Ligne 384: Ligne 456:
  
  
-<code | download> +<code  | download> 
-# --- Dernier passage ClamAV avec couleur ---+# --- Date de scan ---
 print_clamav_last_run() { print_clamav_last_run() {
     local mount=$1     local mount=$1
-    local ts_file="/var/log/clamscan-last-$(basename "$mount").timestamp"+    local base 
 +    if [ "$mount" = "/" ]; then 
 +        base="_" 
 +    else 
 +        base=$(basename "$mount"
 +    fi 
 +    local ts_file="/var/log/clamscan-last-${base}.timestamp"
     local color=$GREEN     local color=$GREEN
-    local last_run="Jamais"+    local last_run="never"
  
     if [ -f "$ts_file" ]; then     if [ -f "$ts_file" ]; then
         last_run=$(cat "$ts_file")         last_run=$(cat "$ts_file")
-        # Calculer l'âge du scan en heures 
         local last_epoch=$(date -d "$last_run" +%s)         local last_epoch=$(date -d "$last_run" +%s)
         local now_epoch=$(date +%s)         local now_epoch=$(date +%s)
Ligne 410: Ligne 487:
     fi     fi
  
-    printf "   Dernier scan ClamAV le %: ${color}%s${RESET}\n" "$mount" "$last_run"+    # Affichage : "root" explicite pour / 
 +    local label="$mount" 
 +    [ "$mount" = "/" ] && label="/ (root)" 
 + 
 +    # Alignement propre sur 12 + 19 caractères 
 +    printf "   ClamAV last scan on %-12s : ${color}%-19s${RESET}\n" "$label" "$last_run"
 } }
 +
 </code> </code>
  
 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>+<code  | download>
 echo "💽 Disques :" echo "💽 Disques :"
 MOUNTS=("/diskTOTO" "/diskTITI" "/diskTATA" "/") MOUNTS=("/diskTOTO" "/diskTITI" "/diskTATA" "/")
clamav.1762706561.txt.gz · Dernière modification : de cyrille