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:46] cyrilleclamav [2025/11/12 14:26] (Version actuelle) cyrille
Ligne 28: Ligne 28:
  
  
-<code bash | download>+<code | download>
 sudo nano /root/scripts/clamAV/freshclam-auto.sh sudo nano /root/scripts/clamAV/freshclam-auto.sh
 </code> </code>
Ligne 34: Ligne 34:
 Avec le contenu Avec le contenu
  
-<code bash | download>+<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
  
-<code bash | 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 bash | 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 bash | 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 bash | download>+<code  | download>
 /var/log/freshclam-update.log { /var/log/freshclam-update.log {
     weekly     weekly
Ligne 143: Ligne 143:
 Ce qui donnera finalement dans l’arborescence des logs Ce qui donnera finalement dans l’arborescence des logs
  
-<code bash | 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 bash | 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 bash | 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 206: Ligne 206:
 Et on peut le tester  Et on peut le tester 
  
-<code bash | 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 bash | download>+<code  | download>
 ===== 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 **/root/scripts/clamAV/clamscan-timer-inc-lock.sh** avec le contenu suivant Créer le script **/root/scripts/clamAV/clamscan-timer-inc-lock.sh** avec le contenu suivant
  
-<code bash | 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 bash | 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 bash | 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 bash | 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 bash | download>+<code  | download>
 /var/log/clamscan-auto.log { /var/log/clamscan-auto.log {
     weekly     weekly
Ligne 384: Ligne 456:
  
  
-<code bash | 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 bash | download>+<code  | download>
 echo "💽 Disques :" echo "💽 Disques :"
 MOUNTS=("/diskTOTO" "/diskTITI" "/diskTATA" "/") MOUNTS=("/diskTOTO" "/diskTITI" "/diskTATA" "/")
clamav.1762706764.txt.gz · Dernière modification : de cyrille