Αυτόματος έλεγχος ασφαλείας του συστήματός σας

Πολύς ο λόγος περί ασφαλείας τελευταία, άλλοτε υπερβολικός, άλλοτε παραπλανητικός.
Παρόλα αυτά, όπως του φευγάτου η μάνα δεν έκλαψε ποτέ, έτσι και η πρόληψη είναι προτιμότερη της θεραπείας.

Παλαιότερα, είχα ξεκινήσει να φτιάχνω διάφορα scripts αυτοματισμού για ελέγχους, καθαρισμούς του συστήματός μου κλπ.
Ανάμεσα σε αυτά και ένα το οποίο κάνει έλεγχο ασφαλείας, ειδοποιώντας με αν κάτι δεν πάει καλά.
Με το πέρασμα του χρόνου το βελτίωσα αρκετά και εδώ είναι η τελευταία εκδοχή του που έκανα πρόσφατα.
Του πρόσθεσα emots και βελτίωσα τις επεξηγήσεις του τι κάνει η κάθε εντολή.

Τι ακριβώς κάνει:

  • Έλεγχο του Firewall (ufw)
  • Έλεγχο ανεπιθύμητων υπηρεσιών
  • Έλεγχο για ανοιχτά ports στο δίκτυο
  • Έλεγχο για αποτυχημένες προσπάθειες login
  • Έλεγχο για ύποπτα root logins
  • Έλεγχο για διαθέσιμες ενημερώσεις ασφαλείας
  • Έλεγχο χώρου δίσκου (για ύποπτα logs)
  • Έλεγχο του AppArmor

:warning: όσον αφορά τα logins το έβαλα να μετράει μόνο τα interactive ώστε να μη δίνει false positive (sudo commands, system services, cron jobs κλπ).

:information_source: Έχω αφήσει εκτός το rkhunter για έλεγχο τυχόν rootkits και αυτό επειδή αργεί αρκετά.
Αυτό, μπορείτε να το τρέχετε ξεχωριστά είτε από κάποιο γραφικό περιβάλλον σχετικής εφαρμογής, είτε ακόμα καλύτερα και πιο σύντομα από το τερματικό σας με την εντολή:
sudo rkhunter --check

Το ίδιο και για το chkrootkit επειδή αφενός δεν είναι υπηρεσία που πρέπει να τρέχει συνέχεια μα τρέχει μια φορά και σταματάει και αφετέρου, λόγω αυτού, το systemd το βλέπει ως “failed” με αποτέλεσμα να κολλάει.
Και αυτό, στα γρήγορα, μπορείτε να το τρέξετε με την εντολή:
sudo chkrootkit

:warning: Επειδή το script είναι custom για το σύστημά μου έχω εξαιρέσει από τα warnings τα KDE Connect και samba. Άρα, αν δεν τα χρησιμοποιείτε απλά τα σβήνετε είτε προσθέτετε όποια άλλη εφαρμογή νομίζετε.

Σε κάθε περίπτωση το script βγάζει μόνο πραγματικά προβλήματα, άρα είναι αρκετά επαρκές.

To script είναι αυτό:

#!/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}===== SECURITY CHECK: $(date) =====${NC}"

# === 1. Firewall ===
step "🔥 Έλεγχος Firewall (ufw)..."
if sudo ufw status | grep -q "ενεργό\|active"; then
    ok "Firewall ενεργό"
else
    fail "Firewall ΑΝΕΝΕΡΓΟ!"
fi

# === 2. Υπηρεσίες που δεν πρέπει να τρέχουν ===
step "🔧 Έλεγχος ανεπιθύμητων υπηρεσιών..."
for SERVICE in apache2; do
    if systemctl is-active --quiet "$SERVICE"; then
        warn "$SERVICE τρέχει — σκέψου να το απενεργοποιήσεις"
    else
        ok "$SERVICE σταματημένο"
    fi
done

# === 3. Ανοιχτά ports ===
step "🌐 Ανοιχτά ports στο δίκτυο..."
OPEN=$(sudo ss -tulpn | grep -v "127.0.0" | grep "LISTEN" | grep -v "::1" | grep -v "smbd" | grep -v "kdeconnectd")
if [ -z "$OPEN" ]; then
    ok "Κανένα εκτεθειμένο port"
else
    warn "Εκτεθειμένα ports:"
    echo "$OPEN"
fi

# === 4. Αποτυχημένα logins ===
step "🔐 Αποτυχημένες προσπάθειες login (τελευταίες 24 ώρες)..."
FAILS=$(sudo journalctl --since "24 hours ago" | grep -c "Failed password" 2>/dev/null)
if [ "$FAILS" -eq 0 ]; then
    ok "Καμία αποτυχημένη προσπάθεια login"
else
    warn "$FAILS αποτυχημένες προσπάθειες login"
fi

# === 5. Έλεγχος root logins ===
step "👤 Έλεγχος root logins..."
ROOT_LOGINS=$(sudo journalctl --since "24 hours ago" | grep "session opened for user root by" | grep -v "uid=0" | wc -l)
if [ "$ROOT_LOGINS" -eq 0 ]; then
    ok "Κανένα ύποπτο root login"
else
    warn "$ROOT_LOGINS ύποπτο root login(s) σήμερα — έλεγξε με: sudo journalctl | grep 'session opened for user root'"
fi

# === 6. Αποτυχημένες υπηρεσίες ===
step "🛠️  Αποτυχημένες υπηρεσίες..."
FAILED=$(systemctl --failed --no-legend | grep -v "chkrootkit" | wc -l)
if [ "$FAILED" -eq 0 ]; then
    ok "Καμία αποτυχημένη υπηρεσία"
else
    warn "$FAILED αποτυχημένες υπηρεσίες:"
    systemctl --failed --no-legend | grep -v "chkrootkit"
fi

# === 7. Ενημερώσεις ασφαλείας ===
step "🔄 Διαθέσιμες ενημερώσεις ασφαλείας..."
UPDATES=$(apt list --upgradable 2>/dev/null | grep -i "security" | wc -l)
if [ "$UPDATES" -eq 0 ]; then
    ok "Καμία εκκρεμής ενημέρωση ασφαλείας"
else
    warn "$UPDATES ενημερώσεις ασφαλείας διαθέσιμες"
fi

# === 8. rkhunter ===
step "🦠 rkhunter..."
if command -v rkhunter &>/dev/null; then
    ok "rkhunter εγκατεστημένο — τρέξε χειροκίνητα: sudo rkhunter --check"
else
    warn "rkhunter δεν είναι εγκατεστημένο"
fi

# === 9. Χώρος δίσκου (ασφάλεια logs) ===
step "💿 Χώρος δίσκου (για logs)..."
USAGE=$(df / | awk 'NR==2 {gsub(/%/,"",$5); print $5}')
if [ "$USAGE" -lt 80 ]; then
    ok "Χώρος δίσκου: ${USAGE}% χρησιμοποιείται"
else
    warn "Χώρος δίσκου: ${USAGE}% — σχεδόν γεμάτος!"
fi

# === 10. AppArmor ===
step "🛡️  AppArmor..."
if sudo aa-status 2>/dev/null | grep -q "profiles are in enforce mode"; then
    PROFILES=$(sudo aa-status 2>/dev/null | grep "profiles are in enforce mode" | awk '{print $1}')
    ok "AppArmor ενεργό ($PROFILES profiles σε enforce mode)"
else
    warn "AppArmor ανενεργό ή χωρίς profiles"
fi

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

Πώς το φτιάχνετε:

Απλά ανοίγετε τον text editor της διανομής σας, κάνετε επικόλληση το ανωτέρω και το αποθηκεύετε σαν security-check.sh, Κατόπιν, με δεξί κλικ στις Ιδιότητες, το κάνετε εκτελέσιμο.
Το βάζετε στο /home σας (Προσωπικό Φάκελο) ή όπου αλλού θέλετε (προσωπικά, έχω κάνει έναν κρυφό φάκελο .apps στο /home μου).
Κατόπιν, απλά το τρέχετε και σύντομα ο έλεγχος θα έχει ολοκληρωθεί. Καλό είναι να το κάνετε ανά διαστήματα.
Αν θέλετε, του προσθέτετε ένα cronjob ώστε να τρέχει αυτόματα μια φορά την εβδομάδα πχ.

Σαφώς και επιδέχεται βελτίωσης, οπότε όποιος έχει να προτείνει κάτι καλύτερο ας το αναφέρει.
Επίσης, αν κάποιος δεν καταλαβαίνει κάτι ή όταν το τρέξει δεν είναι σίγουρος για τα αποτελέσματα ρωτάει, δεν είναι ντροπή.

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