Αυτόματη σάρωση για ιούς στο σύστημά σας

Ναι, ναι ξέρω. Κάποιοι θα πείτε: «τι ιούς μας λες ορέ baby boomer;».
Έλα όμως που ζούμε σε παράξενες εποχές πια και τίποτα δεν είναι δεδομένο (οκ, χιούμορ, όλα τα χρόνια που χρησιμοποιώ Linux ποτέ δεν χρειάστηκα antivirus. ΔΕΝ το έχει ανάγκη βασικά).
Από την άλλη, επειδή λόγω εργασίας χρειάζεται να έχω καθημερινή αλληλεπίδραση με ανταλλαγές αρχείων με Windows μηχανήματα δεν θέλω για την όποια τυχόν στραβή να μου καταλογιστούν ευθύνες και από την άλλη δεν θέλω άθελά μου (επειδή ένα Linux σύστημα μπορεί να μεταδίδει Windows ιούς σε αρχεία χωρίς να επηρεάζεται το ίδιο) να παρουσιαστεί πρόβλημα σε κάποιο εργασιακό μηχάνημα.

Tι θα χρειαστείτε:

Απλά, εγκαταστήστε από τον Διαχειριστή Λογισμικού της διανομής σας τα πακετάκια:

  • clamav — το command line εργαλείο (το clamscan)
  • clamav-daemon — το background service
  • freshclam — το εργαλείο ενημέρωσης signatures (έρχεται αυτόματα)

Αφού εγκατασταθούν ανοίξτε τον Επεξεργαστή Κειμένου της διανομής σας και επικολλήστε το ακόλουθο (έβαλα εικονίδια και αναλυτικές επεξηγήσεις):

#!/bin/bash

GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'

ok()   { echo -e "${GREEN}✅ $1${NC}"; }
warn() { echo -e "${YELLOW}⚠️  $1${NC}"; }
fail() { echo -e "${RED}❌ $1${NC}"; }
step() { echo -e "\n${BLUE}$1${NC}"; }

echo -e "${BLUE}===== ClamAV SCAN: $(date) =====${NC}"

# Μενού επιλογής
TARGETS=()
echo -e "\nΤι θέλεις να σαρώσεις;"
echo "1) Μόνο /home"
echo "2) Μόνο εξωτερικούς δίσκους"
echo "3) /home + εξωτερικούς δίσκους"
echo "4) Έξοδος"
echo ""
read -p "Επιλογή [1-4]: " CHOICE

case $CHOICE in
    1)
        TARGETS+=("/home")
        ;;
    2)
        for DISK in /media/το όνομα χρήστη σας/*/; do
            [ -d "$DISK" ] && TARGETS+=("$DISK")
        done
        if [ ${#TARGETS[@]} -eq 0 ]; then
            warn "Δεν βρέθηκαν εξωτερικοί δίσκοι στο /media/το όνομα χρήστη σας/"
            exit 1
        fi
        ;;
    3)
        TARGETS+=("/home")
        for DISK in /media/το όνομα χρήστη σας/*/; do
            [ -d "$DISK" ] && TARGETS+=("$DISK")
        done
        ;;
    4)
        echo "Έξοδος."
        exit 0
        ;;
    *)
        fail "Μη έγκυρη επιλογή!"
        exit 1
        ;;
esac

# Ενημέρωση signatures
step "🔄 Ενημέρωση ClamAV signatures..."
if pgrep freshclam > /dev/null; then
    warn "Το freshclam τρέχει ήδη στο background — συνεχίζεται η σάρωση."
else
    sudo freshclam 2>/dev/null && ok "Signatures ενημερώθηκαν." || warn "Αδυναμία ενημέρωσης — συνεχίζεται η σάρωση."
fi

# Σάρωση
LOG="/tmp/clamav_scan_$(date +%Y%m%d_%H%M%S).log"
step "🦠 Έναρξη σάρωσης..."
echo "Targets: ${TARGETS[*]}"
echo ""

clamscan -r --infected --bell -v \
    --exclude-dir="^/proc" \
    --exclude-dir="^/sys" \
    --exclude-dir="^/dev" \
    "${TARGETS[@]}" | tee "$LOG"

# Αποτελέσματα
INFECTED=$(grep "Infected files:" "$LOG" | awk '{print $3}')
echo ""
if [ "$INFECTED" = "0" ]; then
    ok "Καμία μόλυνση βρέθηκε!"
    DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
    notify-send "ClamAV Scan" "✅ Καμία μόλυνση βρέθηκε!\nΣαρώθηκε: ${TARGETS[*]}" \
    --icon=security-high --urgency=normal
else
    fail "$INFECTED μολυσμένα αρχεία βρέθηκαν!"
    DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
    notify-send "ClamAV Scan" "❌ $INFECTED μολυσμένα αρχεία!\nΔες: $LOG" \
    --icon=security-low --urgency=critical
fi

echo -e "\n${BLUE}Log αποθηκεύτηκε: $LOG${NC}"
echo -e "${GREEN}===== ΟΛΟΚΛΗΡΩΣΗ: $(date) =====${NC}"
read -p "Πίεσε Enter για να κλείσει..."

Αποθηκεύστε, κάντε το Εκτελέσιμο (δεξί κλικ επάνω του > Ιδιότητες) και ονομάστε το:

clamav-scan.sh

Το βάζετε στο /home σας (Προσωπικό Φάκελο) ή όπου αλλού θέλετε (προσωπικά, έχω κάνει έναν κρυφό φάκελο .apps στο /home μου).

:warning:Εκεί που λέει: το όνομα χρήστη σας θα βάλετε το δικό σας προφανώς.
Και φυσικά, έχει που λέει: φάκελο που το έχετε θα βάλετε την ανάλογη διαδρομή.

Αν θέλετε, του προσθέτετε ένα cronjob ώστε να τρέχει αυτόματα μια φορά την εβδομάδα πχ.
Για να το κάνετε αυτό, στο πεδίο crontab του script προσθέστε αυτό:

sudo crontab -e

Επίσης, προσθέστε και αυτό στην αρχή του script, μετά τις μεταβλητές χρωμάτων:

if [ "$1" = "--auto" ]; then 
TARGETS=("/home") 
for DISK in /media/το όνομα χρήηστη σας/*/; do 
[ -d "$DISK" ] && TARGETS+=("$DISK") 
done 
AUTO=true else 
AUTO=false 
fi

Και στο τέλος του script προσθέστε αυτή τη γραμμή:

0 10 * * 7 /home/*το όνομα χρήστη σας/φάκελο που το έχετε/clamav-scan.sh --auto >> /var/log/clamav-weekly.log 2>&1

Το έχω βάλει να τρέχει Κυριακή στις 10 πμ. Αν θέλετε άλλη μέρα και ώρα απλά αλλάξτε τα αρχικά (10 και 7, δηλαδή ώρα και ημέρα της εβδομάδας).

Άρα, χειροκίνητα εμφανίζει μενού ενώ cron με --auto σαρώνει /home και δίσκους αυτόματα.

info: έχω προσθέσει progress ώστε να φαίνεται ότι δουλεύει, να μη φαίνεται σαν να κόλλησε δηλαδή.

Τι κάνει:

Το ClamAV ανιχνεύει: Windows malware/viruses, Linux malware (υπάρχουν signatures αλλά λιγότερες), Macro viruses σε Office/PDF, Phishing/malicious scripts, Rootkits (μερικά).
Βασικά, το 95%+ της βάσης δεδομένων του ClamAV είναι Windows threats. Αυτό έχει νόημα επειδή οι περισσότεροι ιοί στον κόσμο είναι για Windows.

Πρακτικά λοιπόν, προστατεύει Windows χρήστες που ανταλλάσσουν αρχεία μαζί σας, ανιχνεύει τα λίγα Linux threats που υπάρχουν και ελέγχει documents/PDFs/εικόνες για exploits .
Ωστόσο, για Linux-specific προστασία τα rkhunter και chkrootkit είναι πιο κατάλληλα από το ClamAV.

-Δείτε:

Η ταχύτητά του εξαρτάται από το πόσα αρχεία έχετε και να λάβετε υπόψιν ότι σκανάρει τα πάντα.
Και φυσικά, αν έχετε πολλά αρχεία είναι λογικό και επόμενο να ζεσταθεί λίγο περισσότερο η CPU σας όσο τρέχει το script.
Παρόλα αυτά, αν θέλετε να εξαιρέσετε κάποιους τύπους αρχείων προσθέστε κάτι τέτοιο πχ:

--exclude="\.jpg$" \ 
--exclude="\.jpeg$" \ 
--exclude="\.png$" \ 
--exclude="\.gif$" \ 
--exclude="\.mp3$" \ 
--exclude="\.mp4$" \
--exclude="\.mkv$" \

Ανάλογα δηλαδή, βάζετε την κατάληξη των αρχείων που δεν θέλετε να γίνεται έλεγχος.

Ενημερωτικά, να προσθέσω, ότι διαθέτει και γραφικό περιβάλλον το Clamv (ClamavUI) αν θέλετε να το δουλεύετε έτσι. Και αυτό στο Διαχειριστή Λογισμικού της διανομής σας.
Αν και νομίζω ότι είναι περιττό:

Δεν έκανα κάτι μαγικό, δεν ανακάλυψα τον τροχό, απλά χρησιμοποίησα κάποια υπάρχοντα εργαλεία ώστε να αυτοματοποιήσω τον έλεγχο.

-Κλείνοντας, επαναλαμβάνω αν δεν έγινε αντιληπτό:

ΔΕΝ ΧΡΕΙΑΖΕΣΤΕ ANTIVIRUS ΣΤΟ LINUX.
Αν αλληλεπιδράτε με Windows τότε ναι, χρησιμοποιήστε το. Το κάνετε για “ηθικούς” λόγους από πλευράς σας.

4 «Μου αρέσει»

Το Clamv αξίζει να το έχει κάποιος για σάρωση ιών στο linux? Ερωτάω επειδή στο ίντερνετ όσο το είχα ψάξει (δεν το έχω δοκιμάσει) έλεγαν οι χρήστες ότι έχει πολύ χαμηλό ποσοστό εύρεσης ιών.

Υ.Σ.: Το ξέρω ότι δεν χρειάζονται antinvirus στα linux απλώς ρωτάω από περιέργεια γιατί έχω και windows μαζί με τα linux

Καθεαυτού για το Linux και μόνο δεν χρειάζεται. Χώρο πιάνει.
Για ανταλλαγές με windows μια χαρά είναι για τα βασικά.
Οι δε κριτικές που διάβασες έχουν μια βάση. Σε ανεξάρτητες δοκιμές, το ClamAV, συνήθως, εμφανίζει χαμηλότερα ποσοστά ανίχνευσης σε σύγκριση με σύγχρονες εμπορικές λύσεις, ειδικά απέναντι σε νέο, εξελιγμένο, πολυμορφικό malware καθως και σε exploits / ransomware νέας γενιάς.

1 «Μου αρέσει»

Για rootkits και malware υπαρχει το rkhunter και το chkrootkit. Ισως χρειαστει να προστεθουν σαν dependencies στο skriptακι σου ετσι ωστε να ειναι ποιο πληρες το αυτοματο σκαναρισμα.

3 «Μου αρέσει»

Έχω κάνει και τέτοιο, απλά έδωσα μόνo το Calmav για όσους αλληλεπιδρούν με Windows.
Btw, όποιος το θέλει πλήρες το παρακάτω περιλαμβάνει και τα rkhunter / chkrootkit μαζί.

Για όποιον το θέλει:

:warning:Εκεί που λέει: το όνομα χρήστη σας θα βάλετε το δικό σας προφανώς.

#!/bin/bash

GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

ok()   { echo -e "${GREEN}✅ $1${NC}"; }
warn() { echo -e "${YELLOW}⚠️  $1${NC}"; }
fail() { echo -e "${RED}❌ $1${NC}"; }
step() { echo -e "\n${CYAN}$1${NC}"; }

notify() {
    DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
    notify-send "$1" "$2" --icon="$3" --urgency="$4"
}

echo -e "${BLUE}===== FULL SECURITY SCAN: $(date) =====${NC}"

# Auto mode για cron
if [ "$1" = "--auto" ]; then
    TARGETS=("/home")
    for DISK in /media/tο όνομα χρήστη σας/*/; do
        [ -d "$DISK" ] && TARGETS+=("$DISK")
    done
    AUTO=true
else
    AUTO=false
fi

# Μενού επιλογής σάρωσης
if [ "$AUTO" = "false" ]; then
    echo -e "\n${BLUE}Επίλεξε τι θέλεις να τρέξεις:${NC}"
    echo "1) Μόνο ClamAV"
    echo "2) Μόνο rkhunter"
    echo "3) Μόνο chkrootkit"
    echo "4) Όλα (ClamAV + rkhunter + chkrootkit)"
    echo "5) ClamAV — επιλογή φακέλων"
    echo "6) Έξοδος"
    echo ""
    read -p "Επιλογή [1-6]: " SCAN_CHOICE

    # Επιλογή φακέλων ClamAV αν χρειάζεται
    if [[ "$SCAN_CHOICE" == "1" || "$SCAN_CHOICE" == "4" || "$SCAN_CHOICE" == "5" ]]; then
        echo -e "\n${BLUE}Τι να σαρώσει το ClamAV;${NC}"
        echo "1) Μόνο /home"
        echo "2) Μόνο εξωτερικούς δίσκους"
        echo "3) /home + εξωτερικούς δίσκους"
        read -p "Επιλογή [1-3]: " DIR_CHOICE

        case $DIR_CHOICE in
            1) TARGETS=("/home") ;;
            2)
                for DISK in /media/tο όνομα χρήστη σας/*/; do
                    [ -d "$DISK" ] && TARGETS+=("$DISK")
                done
                ;;
            3)
                TARGETS=("/home")
                for DISK in /media/το όνομα χρήστη σας/*/; do
                    [ -d "$DISK" ] && TARGETS+=("$DISK")
                done
                ;;
            *) fail "Μη έγκυρη επιλογή!"; exit 1 ;;
        esac
    fi
fi

# =============================
# ClamAV
# =============================
run_clamav() {
    step "🦠 ClamAV Scan..."

    if pgrep freshclam > /dev/null; then
        warn "freshclam τρέχει ήδη — παράλειψη ενημέρωσης."
    else
        echo "Ενημέρωση signatures..."
        sudo freshclam 2>/dev/null && ok "Signatures ενημερώθηκαν." || warn "Αδυναμία ενημέρωσης."
    fi

    LOG_CLAM="/tmp/clamav_$(date +%Y%m%d_%H%M%S).log"
    echo "Σάρωση: ${TARGETS[*]}"

    clamscan -r --infected --bell -v \
        --exclude-dir="^/proc" \
        --exclude-dir="^/sys" \
        --exclude-dir="^/dev" \
        "${TARGETS[@]}" | tee "$LOG_CLAM"

    INFECTED=$(grep "Infected files:" "$LOG_CLAM" | awk '{print $3}')

    if [ "$INFECTED" = "0" ]; then
        ok "ClamAV: Καμία μόλυνση!"
        notify "ClamAV Scan" "✅ Καμία μόλυνση βρέθηκε!" "security-high" "normal"
    else
        fail "ClamAV: $INFECTED μολυσμένα αρχεία!"
        notify "ClamAV Scan" "❌ $INFECTED μολυσμένα αρχεία!\nΔες: $LOG_CLAM" "security-low" "critical"
    fi
    echo "Log: $LOG_CLAM"
}

# =============================
# rkhunter
# =============================
run_rkhunter() {
    step "🔍 rkhunter Scan..."

    if ! command -v rkhunter &>/dev/null; then
        warn "rkhunter δεν είναι εγκατεστημένο. (sudo apt install rkhunter)"
        return
    fi

    LOG_RKH="/tmp/rkhunter_$(date +%Y%m%d_%H%M%S).log"
    sudo rkhunter --check --skip-keypress --report-warnings-only 2>/dev/null | tee "$LOG_RKH"

    WARNINGS=$(grep -c "Warning" "$LOG_RKH" 2>/dev/null || echo 0)

    if [ "$WARNINGS" = "0" ]; then
        ok "rkhunter: Καθαρό!"
        notify "rkhunter" "✅ Καθαρό — κανένα warning!" "security-high" "normal"
    else
        warn "rkhunter: $WARNINGS warnings (πιθανώς false positives)"
        notify "rkhunter" "⚠️ $WARNINGS warnings\nΔες: $LOG_RKH" "security-medium" "normal"
    fi
    echo "Log: $LOG_RKH"
}

# =============================
# chkrootkit
# =============================
run_chkrootkit() {
    step "🔎 chkrootkit Scan..."

    if ! command -v chkrootkit &>/dev/null; then
        warn "chkrootkit δεν είναι εγκατεστημένο. (sudo apt install chkrootkit)"
        return
    fi

    LOG_CHK="/tmp/chkrootkit_$(date +%Y%m%d_%H%M%S).log"
    sudo chkrootkit 2>/dev/null | grep -v "not found\|not infected\|not tested" | tee "$LOG_CHK"

    INFECTED_CHK=$(grep -c "INFECTED" "$LOG_CHK" 2>/dev/null || echo 0)

    if [ "$INFECTED_CHK" = "0" ]; then
        ok "chkrootkit: Καθαρό!"
        notify "chkrootkit" "✅ Καθαρό!" "security-high" "normal"
    else
        fail "chkrootkit: $INFECTED_CHK ύποπτα ευρήματα!"
        notify "chkrootkit" "❌ $INFECTED_CHK ύποπτα ευρήματα!\nΔες: $LOG_CHK" "security-low" "critical"
    fi
    echo "Log: $LOG_CHK"
}

# =============================
# Εκτέλεση βάσει επιλογής
# =============================
if [ "$AUTO" = "true" ]; then
    run_clamav
    run_rkhunter
    run_chkrootkit
else
    case $SCAN_CHOICE in
        1) run_clamav ;;
        2) run_rkhunter ;;
        3) run_chkrootkit ;;
        4) run_clamav; run_rkhunter; run_chkrootkit ;;
        5) run_clamav ;;
        6) echo "Έξοδος."; exit 0 ;;
        *) fail "Μη έγκυρη επιλογή!"; exit 1 ;;
    esac
fi

echo -e "\n${GREEN}===== ΟΛΟΚΛΗΡΩΣΗ: $(date) =====${NC}"
[ "$AUTO" = "false" ] && read -p "Πίεσε Enter για να κλείσει..."
1 «Μου αρέσει»

Μπορείς για λίγο επιπλέον modularity να αλλάξεις το path /run/user/1000/bus με /run/user/$(id -u)/bus όπως επίσης το to όνομα χρήστη σας θα μπορούσε να αντικατασταθεί με μεταβλήτή $USER. Κάνε echo $USER είτε echo $(id -u) να δεις το αποτέλεσμα. ;)

Επίσης προτίνω σταθερές να υπάρχουν ως variables στο πάνω μέρος ώστε να μπορεί να ρυθμιστεί εύκολα στο εκάστοτε περιβάλλον του χρήστη :D

Και μερικά πράγματα που έχεις όπως το notify-send μπορεί να μην παίξει εάν ο χρήστης δεν έχει το libnotify-bin εγκατεστημένο, προφανώς και clam και τα άλλα binaries ;)