Πολύς ο λόγος περί ασφαλείας τελευταία, άλλοτε υπερβολικός, άλλοτε παραπλανητικός.
Παρόλα αυτά, όπως του φευγάτου η μάνα δεν έκλαψε ποτέ, έτσι και η πρόληψη είναι προτιμότερη της θεραπείας.
Παλαιότερα, είχα ξεκινήσει να φτιάχνω διάφορα scripts αυτοματισμού για ελέγχους, καθαρισμούς του συστήματός μου κλπ.
Ανάμεσα σε αυτά και ένα το οποίο κάνει έλεγχο ασφαλείας, ειδοποιώντας με αν κάτι δεν πάει καλά.
Με το πέρασμα του χρόνου το βελτίωσα αρκετά και εδώ είναι η τελευταία εκδοχή του που έκανα πρόσφατα.
Του πρόσθεσα emots και βελτίωσα τις επεξηγήσεις του τι κάνει η κάθε εντολή.
Τι ακριβώς κάνει:
- Έλεγχο του Firewall (ufw)
- Έλεγχο ανεπιθύμητων υπηρεσιών
- Έλεγχο για ανοιχτά ports στο δίκτυο
- Έλεγχο για αποτυχημένες προσπάθειες login
- Έλεγχο για ύποπτα root logins
- Έλεγχο για διαθέσιμες ενημερώσεις ασφαλείας
- Έλεγχο χώρου δίσκου (για ύποπτα logs)
- Έλεγχο του AppArmor
όσον αφορά τα logins το έβαλα να μετράει μόνο τα interactive ώστε να μη δίνει false positive (sudo commands, system services, cron jobs κλπ).
Έχω αφήσει εκτός το rkhunter για έλεγχο τυχόν rootkits και αυτό επειδή αργεί αρκετά.
Αυτό, μπορείτε να το τρέχετε ξεχωριστά είτε από κάποιο γραφικό περιβάλλον σχετικής εφαρμογής, είτε ακόμα καλύτερα και πιο σύντομα από το τερματικό σας με την εντολή:
sudo rkhunter --check
Το ίδιο και για το chkrootkit επειδή αφενός δεν είναι υπηρεσία που πρέπει να τρέχει συνέχεια μα τρέχει μια φορά και σταματάει και αφετέρου, λόγω αυτού, το systemd το βλέπει ως “failed” με αποτέλεσμα να κολλάει.
Και αυτό, στα γρήγορα, μπορείτε να το τρέξετε με την εντολή:
sudo chkrootkit
Επειδή το 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 ώστε να τρέχει αυτόματα μια φορά την εβδομάδα πχ.
Σαφώς και επιδέχεται βελτίωσης, οπότε όποιος έχει να προτείνει κάτι καλύτερο ας το αναφέρει.
Επίσης, αν κάποιος δεν καταλαβαίνει κάτι ή όταν το τρέξει δεν είναι σίγουρος για τα αποτελέσματα ρωτάει, δεν είναι ντροπή.

