FAQ

Αυτός είναι ο οδηγός εγκατάστασης, ρύθμισης και συντήρησης του Arcivéo Security Monitor. Οι ενότητες είναι ομαδοποιημένες: γενική επισκόπηση, ανάπτυξη του πίνακα, σύνδεση εργαλείων ασφαλείας, ενσωματωμένες μονάδες και διαγνωστικά. Οι εντολές αντιγράφονται με το κουμπί δεξιά.

Από πού να ξεκινήσετε

01. Εγκατάσταση του πίνακα — επιλέξτε μέθοδο

Η εγκατάσταση του πίνακα βρίσκεται σε ξεχωριστές σελίδες βήμα προς βήμα. Επιλέξτε μέθοδο:

Αν δεν είστε σίγουροι, επιλέξτε την αυτόματη. Αυτός ο οδηγός παραμένει η ενιαία πηγή για SSL, εργαλεία, cron και διαγνωστικά — οι σελίδες εγκατάστασης παραπέμπουν στις ενότητές του, χωρίς να επαναλαμβάνουν τίποτα.

Επισκόπηση

02. Τι είναι το Arcivéo Security Monitor

Arcivéo Security Monitor — πίνακας ασφαλείας διακομιστή. Συλλέγει δεδομένα από τα εγκατεστημένα εργαλεία (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco κ.ά.) και τα εμφανίζει σε ενιαία διεπαφή με dashboard, χάρτη επιθέσεων και αναλυτικές σελίδες για κάθε εργαλείο.

Το Monitor δεν είναι ενεργό μέσο προστασίας — δεν μπλοκάρει επιθέσεις από μόνο του. Ο σκοπός του είναι να συγκεντρώνει τις πληροφορίες από τα ήδη ενεργά εργαλεία και να τις παρουσιάζει με βολικό τρόπο.

03. Πώς λειτουργεί ο monitor στον διακομιστή

Ο monitor λειτουργεί μόνο τοπικά — πρέπει να εγκατασταθεί στον ίδιο διακομιστή που παρακολουθεί. Δεν χρησιμοποιεί SSH ούτε απομακρυσμένο API.

Όλες τις εντολές (fail2ban-client, ufw status, ipset list κ.λπ.) το dashboard τις εκτελεί ως χρήστης του web server (συνήθως www-data, στα hosting panel — ο λογαριασμός του site) με περιορισμένο σύνολο δικαιωμάτων sudo — μόνο σε συγκεκριμένα εργαλεία, χωρίς γενική πρόσβαση root. Τα αποτελέσματα αναλύονται και εμφανίζονται στον browser.

Δύο ρυθμοί λειτουργίας. Οι σελίδες του πίνακα ρωτούν τα εργαλεία τη στιγμή που τις ανοίγετε — βλέπετε πάντα την τρέχουσα κατάσταση. Επιπλέον, στο παρασκήνιο τρέχουν εργασίες βάσει προγράμματος (cron):

  • κάθε 5 λεπτά — στιγμιότυπο του φορτίου για τη σελίδα «Απόδοση»·
  • κάθε 5 λεπτά — ο αισθητήρας συμβάντων ασφάλειας: νέοι αποκλεισμοί, ειδοποιήσεις IDS, σταματημένη προστασία, θύρα που άνοιξε (ενότητα «Συμβάντα ασφάλειας»)·
  • μία φορά την ημέρα — η αναφορά ασφάλειας στο Telegram και στο email, καθώς και οι βαριοί έλεγχοι (Lynis, AIDE, ClamAV, debsums, Logwatch)·
  • κάθε 15 λεπτά — η επισκόπηση του διακομιστή προς τον λογαριασμό, αν είναι ενεργοποιημένη.

Ο πλήρης κατάλογος των εργασιών βρίσκεται στην ενότητα «Όλες οι εργασίες cron σε ένα μέρος».

Για πολλούς διακομιστές εγκαταστήστε τον monitor σε καθέναν ξεχωριστά, με δικό του domain. Για να τους βλέπετε σε έναν κατάλογο, ενεργοποιήστε την επισκόπηση διακομιστών (ενότητα «Επισκόπηση διακομιστών στον λογαριασμό»).

04. Πώς υπολογίζεται η Βαθμολογία ασφάλειας

Η βαθμολογία ξεκινά από το μέγιστο και μειώνεται για κάθε πρόβλημα που εντοπίζεται:

  • Το UFW δεν είναι ενεργό — −30
  • Το Fail2ban δεν εκτελείται (καμία ενεργή jail) — −25
  • Χωρίς κλειδιά WebAuthn — −15
  • Lynis hardening index < 60 — −20· 60–79 — −10
  • Το IPset ipsum δεν φορτώθηκε — −10
  • Απειλές που βρέθηκαν από το ClamAV — −20
  • Αλλαγές αρχείων από το AIDE — −15
  • Το SSL έληξε — −30, λήγει σε <14 ημέρες — −15, <30 ημέρες — −5
  • Το CrowdSec είναι εγκατεστημένο αλλά δεν εκτελείται — −5
  • Το Suricata είναι εγκατεστημένο αλλά δεν εκτελείται — −5
  • Βάσεις/cache (MySQL, PostgreSQL, Redis…) προσβάσιμες από έξω — −10
  • Επιτρέπεται η σύνδεση root μέσω SSH (PermitRootLogin yes) — −20
  • Επιτρέπεται η σύνδεση με κωδικό μέσω SSH (PasswordAuthentication yes) — −10
  • Μικρές ρυθμίσεις SSH: ενεργό X11Forwarding, MaxAuthTries πάνω από 3 ή sshd_config αναγνώσιμο από όλους τους λογαριασμούς — −5
  • Θωράκιση του web server: οι αποκρίσεις αποκαλύπτουν την έκδοση του web server ή της PHP, η μέθοδος TRACE είναι ενεργή ή λείπει η κεφαλίδα Strict-Transport-Security ή X-Frame-Options — −5
  • Εκκρεμούν ενημερώσεις ασφαλείας — −5

Σύνολο: 80+ = Προστατευμένος, 60–79 = Προσοχή, <60 = Σε κίνδυνο.

Οι αφαιρέσεις για ClamAV, AIDE, CrowdSec και Suricata εφαρμόζονται μόνο αν το εργαλείο είναι εγκατεστημένο. Το Lynis και το AIDE χωρίς αρχικοποιημένη βάση εμφανίζονται ως «χωρίς δεδομένα» και δεν μειώνουν τη βαθμολογία. Το πλήθος επιθέσεων για σήμερα εμφανίζεται στο dashboard, αλλά δεν επηρεάζει τη Βαθμολογία ασφάλειας. Η θωράκιση του web server δεν προσμετράται αν κανένας ιστότοπος δεν απάντησε στον έλεγχο.

Ρυθμίσεις και άδεια

05. WebAuthn — έλεγχος ταυτότητας δύο παραγόντων

WebAuthn — πρότυπο ελέγχου ταυτότητας χωρίς κωδικό μέσω κλειδιού υλικού. Υποστηρίζει YubiKey, Touch ID, Face ID, Windows Hello, Passkey.

Μετά την είσοδο με κωδικό, το σύστημα ζητά επιβεβαίωση μέσω του καταχωρημένου κλειδιού. Ακόμη κι αν διαρρεύσει ο κωδικός, η είσοδος είναι αδύνατη χωρίς το φυσικό κλειδί ή τη βιομετρία.

Για ρύθμιση, ανοίξτε τα Κλειδιά WebAuthn στο πλαϊνό μενού και πατήστε «Καταχώριση κλειδιού». Καταχωρίστε αμέσως δύο κλειδιά: αν το μοναδικό κλειδί χαθεί ή χαλάσει, η είσοδος στον πίνακα με αυτό θα είναι αδύνατη.

Το WebAuthn λειτουργεί μόνο μέσω HTTPS. Σε σύνδεση HTTP, η καταχώριση και η είσοδος με κλειδί δεν είναι διαθέσιμες.

06. Ειδοποιήσεις: Telegram, Email, webhook και push

Τα κανάλια είναι τέσσερα: Telegram, Email, webhook και push στο πρόγραμμα περιήγησης. Είναι ανεξάρτητα μεταξύ τους — ενεργοποιήστε όποια θέλετε, ακόμη και τα τέσσερα. Από τα ίδια κανάλια περνούν η ημερήσια αναφορά ασφάλειας, οι ειδοποιήσεις φορτίου και τα ευρήματα του αισθητήρα συμβάντων· ρυθμίζονται μία φορά, εδώ, στην ενότητα «Ρυθμίσεις».

Telegram. Χρειάζονται το token του bot και το chat id:

  1. Στο Telegram γράψτε στο @BotFather → /newbot → λάβετε το token της μορφής 123456:ABC....
  2. Στείλτε στο νέο σας bot ένα οποιοδήποτε μήνυμα (ώστε να μπορεί να σας απαντά).
  3. Βρείτε το chat id σας: γράψτε στο bot @userinfobot, ή ανοίξτε το https://api.telegram.org/bot<TOKEN>/getUpdates και βρείτε το "chat":{"id":...}.
  4. Επικολλήστε το token και το chat id στις «Ρυθμίσεις» → Telegram, πατήστε «Αποθήκευση και δοκιμαστική αποστολή».

Email. Δύο τρόποι επιλογής στις «Ρυθμίσεις» → Email:

  • SMTP — host, θύρα (465/SSL ή 587/TLS), όνομα χρήστη και κωδικός του email σας·
  • Resend — σύγχρονο API: δηλώστε το κλειδί API (re_...) και επιβεβαιωμένο domain αποστολέα.

Webhook. Μία μόνο διεύθυνση που δέχεται POST καλύπτει Slack, Discord, Mattermost, n8n και δικό σας χειριστή. «Ρυθμίσεις» → Webhook: επικολλήστε τη διεύθυνση και ενεργοποιήστε τον διακόπτη.

  • στο Slack και στο Mattermost στέλνεται {"text": …}, στο Discord {"content": …} (το Discord απορρίπτει μηνύματα άνω των 2000 χαρακτήρων, οπότε το κείμενο περικόπτεται)·
  • κάθε άλλη διεύθυνση λαμβάνει δομημένο JSON: text, event, severity, source, count, host, ts — δεν χρειάζεται να αναλυθεί ξανά το κείμενο του μηνύματος.

Ειδοποιήσεις push. Το μήνυμα φτάνει απευθείας στο πρόγραμμα περιήγησης και, αν ο πίνακας έχει προστεθεί στην αρχική οθόνη του τηλεφώνου, ως συνηθισμένη ειδοποίηση εφαρμογής — χωρίς bot και χωρίς διακομιστή αλληλογραφίας ενδιάμεσα. «Ρυθμίσεις» → Ειδοποιήσεις push: ενεργοποιήστε τον διακόπτη και πατήστε «Σύνδεση αυτής της συσκευής» σε κάθε συσκευή που πρέπει να λαμβάνει ειδοποιήσεις. Ο μετρητής «Συνδεδεμένες συσκευές» δείχνει πόσες είναι.

Το push λειτουργεί μόνο μέσω HTTPS (όπως και το WebAuthn) και η άδεια χρειάζεται δύο φορές: πρώτα στο πρόγραμμα περιήγησης — το ερώτημα εμφανίζεται μετά το κουμπί «Σύνδεση αυτής της συσκευής» — και έπειτα στο ίδιο το λειτουργικό σύστημα. Αν στα Windows είναι κλειστός ο γενικός διακόπτης Ρυθμίσεις → Σύστημα → Ειδοποιήσεις, το πρόγραμμα περιήγησης θα δώσει την άδεια, ο πίνακας θα αναφέρει την αποστολή και στην οθόνη δεν θα εμφανιστεί τίποτα. Το ίδιο κάνουν η λειτουργία «Μην ενοχλείτε» και οι απενεργοποιημένες ειδοποιήσεις του προγράμματος περιήγησης στο macOS (Ρυθμίσεις συστήματος → Ειδοποιήσεις).
Κάθε κανάλι έχει δικό του κουμπί «Δοκιμαστική αποστολή», που το ελέγχει αμέσως. Το πρόγραμμα της αυτόματης αναφοράς περνά από το cron (ενότητα «Όλες οι εργασίες cron»): το cron ενεργοποιεί την αποστολή και τα κανάλια λαμβάνονται από τις ρυθμίσεις.

Κατάσταση αναφοράς: «ΠΡΟΣΟΧΗ» ή «ΟΚ». Ο τίτλος γίνεται «ΠΡΟΣΟΧΗ» μόνο σε πραγματικό πρόβλημα ή εκκρεμή ενέργεια: εντοπίστηκε απειλή ClamAV, αλλαγές αρχείων στο AIDE, κρίσιμα συμβάντα Falco (Emergency/Alert/Critical τις τελευταίες 24 ώρες), σταματημένη υπηρεσία στο Monit, απαιτείται επανεκκίνηση, λήγει SSL (≤14 ημέρες) ή εκκρεμούν ενημερώσεις ασφαλείας. Ο θόρυβος παρασκηνίου — δοκιμές SSH από bots, IP που έχουν μπλοκαριστεί από fail2ban, ειδοποιήσεις Suricata, προειδοποιήσεις Lynis και ήδη αποκρουσμένα αιτήματα ModSecurity — δεν ανεβάζει την κατάσταση, οπότε τέτοιοι αριθμοί στην αναφορά δεν σημαίνουν «ΠΡΟΣΟΧΗ» από μόνοι τους.

07. Άδεια χρήσης — εισαγωγή και ενεργοποίηση

Οι αναλυτικές μονάδες παρακολούθησης (Lynis, UFW, ModSecurity, χάρτης επιθέσεων, AIDE, ClamAV κ.ά.) ξεκλειδώνουν εφόσον υπάρχει έγκυρη άδεια χρήσης. Χωρίς αυτήν, το dashboard, οι ρυθμίσεις και ο λογαριασμός λειτουργούν, ενώ οι μονάδες εμφανίζουν την κάρτα «Απαιτείται άδεια χρήσης».

Μετά την αγορά, στον λογαριασμό σας έχετε έναν κωδικό ενεργοποίησης της μορφής ARCIVEO-XXXX-XXXX-XXXX-XXXX. Πρέπει να τον «ενεργοποιήσετε» στον τομέα του panel σας — αυτό μετατρέπει τον κωδικό σε υπογεγραμμένο αρχείο άδειας (μπλοκ [license]), που εισάγετε στο panel.

Πώς γίνεται η ενεργοποίηση (3 βήματα):

  1. Πάρτε τον κωδικό ενεργοποίησης. Λογαριασμός my.arciveo.com → ενότητα «Άδειες» / «Ενεργοποίηση άδειας» — αντιγράψτε τον κωδικό ARCIVEO-….
  2. Ενεργοποιήστε τον κωδικό στον τομέα σας. Στον ίδιο λογαριασμό ανοίξτε την «Ενεργοποίηση άδειας», εισαγάγετε: κωδικό ενεργοποίησης, το email σας και τον τομέα του panel (τη διεύθυνση όπου ανοίγει ο monitor, π.χ. monitor.example.com). Πατήστε ενεργοποίηση — το σύστημα δημιουργεί αρχείο άδειας συνδεδεμένο με αυτόν τον τομέα και το εμφανίζει σε πεδίο με κουμπί «Αντιγραφή».
  3. Εισαγάγετε το κλειδί στο panel. Αντιγράψτε ολόκληρο το κείμενο της άδειας → στο panel ανοίξτε «Ρυθμίσεις» → μπλοκ «Άδεια χρήσης», επικολλήστε και πατήστε «Αποθήκευση». Οι μονάδες ξεκλειδώνουν αμέσως.

Το panel ελέγχει το κλειδί κρυπτογραφικά: υπογραφή, σύνδεση με τον τομέα και διάρκεια ισχύος.

Ο τομέας κατά την ενεργοποίηση πρέπει να ταυτίζεται ακριβώς με τη διεύθυνση του panel. Πάρτε τον από τη σταθερά APP_URL στο config.php και εισαγάγετε μόνο το όνομα του host — χωρίς https:// και χωρίς πρόθεμα www. Η ενεργοποίηση είναι μία φορά: ο κωδικός μετατρέπεται σε άδεια για τον τομέα που δώσατε και δεν ενεργοποιείται ξανά — σε λάθος τομέα το κλειδί δεν θα ταιριάζει στο panel σας και ο κωδικός θα έχει αναλωθεί. Γι' αυτό εισαγάγετε τον τομέα προσεκτικά.
Αν λήξει η ισχύς ή αλλάξει ο τομέας — στην κεφαλίδα του panel θα εμφανιστεί προειδοποίηση. Η άδεια συνδέεται μόνιμα με τον τομέα και δεν μεταφέρεται σε άλλον: για νέα διάρκεια ή νέο τομέα χρειάζεται νέο κλειδί (αγοράζεται στον λογαριασμό και ενεργοποιείται μία φορά).

08. Το αρχείο config.php — όλες οι ρυθμίσεις του πίνακα

Όλες οι βασικές παράμετροι του πίνακα ορίζονται σε ένα αρχείο config.php στη ρίζα (δίπλα στον φάκελο public/) με απλές σταθερές define(). Το αρχείο δημιουργείται κατά την εγκατάσταση· χρειάζεται σπάνια χειροκίνητη επεξεργασία — κυρίως όταν αλλάζετε domain, κατά τη μεταφορά ή τη σύνδεση σε άλλη βάση. Μετά από κάθε αλλαγή επανεκκινήστε το PHP-FPM (αλλιώς, λόγω του OPcache, οι αλλαγές δεν θα εφαρμοστούν).

Συμπληρώστε τις δικές σας τιμές στα επισημασμένα σημεία· τα υπόλοιπα αφήστε τα ως έχουν:

// --- Βάση δεδομένων --- define('DB_HOST', 'localhost'); // αφήστε το define('DB_NAME', 'db_name'); // ό,τι ορίσατε κατά τη δημιουργία της βάσης define('DB_USER', 'user'); // ό,τι ορίσατε κατά τη δημιουργία της βάσης define('DB_PASS', 'db_password'); // ό,τι ορίσατε κατά τη δημιουργία της βάσης define('DB_CHARSET', 'utf8mb4'); // αφήστε το // --- Εφαρμογή --- define('APP_URL', 'https://monitor.example.com'); // διεύθυνση του πίνακα, χωρίς κάθετο στο τέλος define('TIMEZONE', 'Europe/Athens'); // η ζώνη ώρας σας // --- Διάρκεια συνεδρίας --- define('SESSION_LIFETIME', 28800); // αδράνεια μέχρι νέα σύνδεση, δευτ. (28800 = 8 ώ)

Βάση δεδομένων. Στοιχεία σύνδεσης στη MySQL/MariaDB:

  • DB_HOST — ο host της βάσης, σχεδόν πάντα localhost·
  • DB_NAME — το όνομα της βάσης δεδομένων του πίνακα·
  • DB_USER — ο χρήστης της βάσης (πρόσβαση μόνο στη δική του βάση)·
  • DB_PASS — ο κωδικός αυτού του χρήστη·
  • DB_CHARSET — η κωδικοποίηση της σύνδεσης, αφήστε utf8mb4.

Εφαρμογή.

  • APP_URL — η πλήρης διεύθυνση του πίνακα (π.χ. https://monitor.example.com). Πρέπει να συμπίπτει με το domain για το οποίο ενεργοποιήθηκε η άδεια — αλλιώς το κλειδί θα απορριφθεί (δείτε την ενότητα «Άδεια»)·
  • TIMEZONE — η ζώνη ώρας του PHP: επηρεάζει μόνο τον τρόπο που ο πίνακας εμφανίζει ημερομηνίες και ώρα. Στην ώρα εκτέλεσης των εργασιών cron δεν επηρεάζει — εκεί ισχύει η ζώνη του συστήματος (δείτε «Όλες οι εργασίες cron»).

Διάρκεια συνεδρίας. SESSION_LIFETIME — το χρονικό όριο αδράνειας της συνεδρίας σε δευτερόλεπτα (κυλιόμενο: ανανεώνεται με τη δραστηριότητα). Προεπιλογή 28800 = 8 ώρες· μετά από αυτό το διάστημα αδράνειας ο πίνακας θα ζητήσει νέα σύνδεση. Για παράδειγμα, 3600 = 1 ώρα, 86400 = μία ημέρα.

Καταγραφή σφαλμάτων. Τα σφάλματα δεν εμφανίζονται ποτέ στους επισκέπτες, αλλά γράφονται στο logs/php_errors.log — φαίνονται στη σελίδα «Αρχεία καταγραφής εφαρμογής». Αυτές οι γραμμές (display_errors=0, log_errors=1, η διαδρομή error_log) συνήθως δεν χρειάζονται αλλαγή — οι ρυθμίσεις ορίζονται απευθείας στο αρχείο και δεν εξαρτώνται από το php.ini.

config.php — μυστικό αρχείο. Περιέχει τον κωδικό της βάσης. Βρίσκεται στη ρίζα του πίνακα (δίπλα στο public/), ενώ η ρίζα ιστού (DocumentRoot) αυτού του πίνακα είναι ακριβώς η ρίζα του πίνακα, όχι το public/. Το ίδιο το αρχείο δεν «διαρρέει»: στο ριζικό .htaccess υπάρχει ρητή απαγόρευση γι' αυτό (Require all denied) — ο διακομιστής επιστρέφει 403. Ακόμη και χωρίς αυτόν τον κανόνα ο πηγαίος κώδικας δεν θα διέρρεε: είναι PHP — ο διακομιστής το εκτελεί, δεν το παραδίδει ως κείμενο. Για κάθε ενδεχόμενο: μην το ανεβάζετε σε δημόσια αποθετήρια και μην το στέλνετε στην υποστήριξη με πραγματικό κωδικό. Δικαιώματα στο αρχείο — 640.
Κατά τη μεταφορά ή την επαναφορά πρόσβασης, αυτό το αρχείο είναι η κύρια πηγή στοιχείων: το όνομα της βάσης, ο χρήστης και ο κωδικός λαμβάνονται ακριβώς από εδώ (δείτε τις ενότητες «Ενημέρωση και μεταφορά του πίνακα» και «Επαναφορά πρόσβασης»).

09. API μόνο για ανάγνωση (JSON και Prometheus)

Ο πίνακας προστατεύεται από τη σύνδεση με κωδικό και, αν είναι ενεργό, από το φίλτρο IP. Σε ένα πρόγραμμα δεν ταιριάζει τίποτα από τα δύο, γι’ αυτό τα εξωτερικά συστήματα έχουν δική τους είσοδο — δύο διευθύνσεις μόνο για ανάγνωση, προστατευμένες με διακριτικό. Το διακριτικό δεν αλλάζει τίποτα στον διακομιστή: με αυτό μπορούν μόνο να ληφθούν δείκτες.

Ενεργοποίηση — «Ρυθμίσεις» → «API μόνο για ανάγνωση»: ο διακόπτης «Ενεργοποίηση του API»· το διακριτικό δημιουργείται αυτόματα κατά την πρώτη αποθήκευση. Το κουμπί «Νέο διακριτικό» εκδίδει άλλο και την ίδια στιγμή αποκόπτει όλους όσοι χρησιμοποιούσαν το προηγούμενο.

  • /api/status.php — JSON: βαθμολογία ασφάλειας, κατάσταση των μονάδων, η τελευταία μέτρηση φορτίου με τις κορυφαίες διεργασίες και τα συμβάντα ασφάλειας των τελευταίων 24 ωρών·
  • /api/metrics.php — οι ίδιοι αριθμοί στην κειμενική μορφή του Prometheus (μετρικές arciveo_*: arciveo_security_score, arciveo_fail2ban_banned, arciveo_cpu_busy_pct κ.ο.κ.).
curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/status.php curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/metrics.php

Αν ο πελάτης σας δεν μπορεί να θέσει κεφαλίδα, το διακριτικό γίνεται δεκτό και ως παράμετρος — ?token=…. Λάβετε υπόψη ότι σε αυτή τη μορφή καταλήγει στο αρχείο καταγραφής προσπελάσεων του διακομιστή web, οπότε η κεφαλίδα είναι προτιμότερη.

Prometheus. Έτοιμο μπλοκ για το scrape_configs:

scrape_configs: - job_name: arciveo metrics_path: /api/metrics.php scheme: https authorization: credentials: <TOKEN> static_configs: - targets: ['monitor.example.com']
Η απάντηση αποθηκεύεται προσωρινά για 5 λεπτά: πίσω από αυτούς τους αριθμούς βρίσκεται η ίδια βαριά συλλογή δεδομένων που βρίσκεται και πίσω από τον πίνακα. Η συχνή λήψη δεν κοστίζει λοιπόν τίποτα στον διακομιστή — οι τιμές απλώς επαναλαμβάνονται μέχρι την επόμενη ανανέωση — αλλά ούτε διάστημα μικρότερο του λεπτού έχει νόημα.
401 — το διακριτικό είναι λάθος ή δεν στάλθηκε. 404 με το κείμενο api disabled — το API είναι απενεργοποιημένο στις ρυθμίσεις. Τα απορριφθέντα αιτήματα καταγράφονται στο αρχείο καταγραφής της εφαρμογής μαζί με την IP του αποστολέα, οπότε οι απόπειρες μαντέματος του διακριτικού φαίνονται στη σελίδα «Αρχεία καταγραφής εφαρμογής».

10. Επισκόπηση διακομιστών στον λογαριασμό

Ο πίνακας εγκαθίσταται σε κάθε διακομιστή ξεχωριστά και απαντά καλά στο ερώτημα «πώς πάει αυτό το μηχάνημα». Στο ερώτημα «πώς πάνε όλα τα μηχανήματά μου» δεν απαντά — γι’ αυτό κάθε πίνακας μπορεί να στέλνει μια σύντομη επισκόπηση στον λογαριασμό, όπου οι διακομιστές φαίνονται σε έναν κατάλογο.

Τι να πάρετε στον λογαριασμό my.arciveo.com → ενότητα «Οι διακομιστές μου»: εκεί εκδίδεται ένα διακριτικό (της μορφής fk_…) και αναγράφεται η διεύθυνση παραλήπτη https://my.arciveo.com/api/fleet.php. Το διακριτικό είναι ένα ανά λογαριασμό — το ίδιο για όλους τους διακομιστές σας.

Τι να ρυθμίσετε στον πίνακα — «Ρυθμίσεις» → «Επισκόπηση διακομιστών»: διεύθυνση παραλήπτη, διακριτικό, όνομα διακομιστή (πώς θα εμφανίζεται στον κατάλογο· αν το αφήσετε κενό, λαμβάνεται το domain του πίνακα) και ο διακόπτης «Αποστολή της επισκόπησης». Το κουμπί «Αποστολή τώρα» ελέγχει τη σύνδεση αμέσως, χωρίς να περιμένει το πρόγραμμα.

Στη συνέχεια η επισκόπηση φεύγει μέσω cron, κάθε 15 λεπτά:

# κάθε 15 λεπτά — επισκόπηση του διακομιστή προς τον λογαριασμό 3,18,33,48 * * * * /usr/local/bin/fleet-push-all.sh >> /path/to/monitor/logs/cron.log 2>&1

Τι ακριβώς στέλνεται: όνομα και domain του διακομιστή, λειτουργικό σύστημα, χρόνος λειτουργίας, έκδοση PHP· η βαθμολογία ασφάλειας· η κατάσταση των μονάδων (UFW, αριθμός jail του Fail2ban, αποκλεισμοί σήμερα, αν τρέχουν CrowdSec, Suricata και Falco, απειλές ClamAV, αλλαγές AIDE, δείκτης Lynis, εκκρεμείς ενημερώσεις, αν χρειάζεται επανεκκίνηση, ημέρες μέχρι τη λήξη του πιστοποιητικού, αριθμός επικίνδυνα ανοιχτών θυρών)· η τελευταία μέτρηση φορτίου (load, CPU, RAM, δίσκος, inodes)· οι μετρητές συμβάντων των τελευταίων 24 ωρών και το τελευταίο κρίσιμο συμβάν. Αρχεία καταγραφής, κωδικοί και περιεχόμενα αρχείων δεν υπάρχουν στην επισκόπηση.

Στέλνει ο διακομιστής, ο λογαριασμός δεν ρωτά. Γι’ αυτό δεν χρειάζεται να ανοίξει καμία είσοδος προς το δίκτυό σας από έξω, και ένας πίνακας κλειστός με φίλτρο IP αναφέρεται κανονικά. Ο κόμβος αναγνωρίζεται από το domain του πίνακα, οπότε ο κατάλογος δεν διπλασιάζεται μετά από επανεκκίνηση ή αλλαγή IP.
Αν ένας διακομιστής εμφανίζεται στον λογαριασμό ως σιωπηλός, η επισκόπηση δεν έχει φτάσει εδώ και καιρό. Ελέγξτε με τη σειρά: τον διακόπτη «Αποστολή της επισκόπησης», τη γραμμή του cron (sudo crontab -l) και τι απαντά το κουμπί «Αποστολή τώρα». Τα σφάλματα αποστολής γράφονται στο αρχείο καταγραφής της εφαρμογής με τη σήμανση FLEET — εκεί φαίνεται αν απορρίφθηκε το διακριτικό (HTTP 401) ή αν δεν πραγματοποιήθηκε καν η σύνδεση.

Εργαλεία ασφαλείας

11. Τείχος προστασίας UFW

Το UFW (Uncomplicated Firewall) είναι ένα απλό περιβάλλον για το nftables/iptables. Κλείνει όλες τις εισερχόμενες θύρες εκτός από τις ρητά επιτρεπόμενες. Η σελίδα «Τείχος προστασίας UFW» εμφανίζει την κατάσταση και τους κανόνες.

sudo apt install ufw # Επιτρέψτε το SSH (υποχρεωτικά ΠΡΙΝ την ενεργοποίηση!) και το web sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Κλείστε τη ΒΔ προς τα έξω (πρόσβαση μόνο τοπικά) sudo ufw deny 3306 # Ενεργοποίηση και έλεγχος sudo ufw enable sudo ufw status verbose
Πριν από το ufw enable επιτρέψτε οπωσδήποτε το SSH (ufw allow OpenSSH), αλλιώς θα χάσετε την πρόσβαση στον διακομιστή.
Η «Εξωτερική έκθεση» στον πίνακα λαμβάνει υπόψη το UFW: μια θύρα που έχει κλείσει με κανόνα deny δεν θεωρείται προσβάσιμη από έξω.
Skipping adding existing rule — δεν είναι σφάλμα. Έτσι το UFW αναφέρει ότι ο ίδιος ακριβώς κανόνας υπάρχει ήδη και δεν τον προσθέτει ξανά. Κατά την επανάληψη της αυτόματης ρύθμισης (είναι ιδεμποτεντική) αυτό είναι κανονικό μήνυμα — δεν χρειάζεται καμία ενέργεια.

12. Εγκατάσταση Fail2ban

Μπλοκάρει αυτόματα IP μετά από υπέρβαση του αριθμού αποτυχημένων προσπαθειών σύνδεσης. Αναλύει τα αρχεία καταγραφής των SSH, nginx, Apache και άλλων υπηρεσιών.

sudo apt install fail2ban sudo systemctl enable --now fail2ban # Έλεγχος κατάστασης: sudo fail2ban-client status
Η λειτουργική διαμόρφωση (jail.local με δεκάδες jail και αυτόματο αποκλεισμό από το ipsum) βρίσκεται στην επόμενη ενότητα.

13. Λειτουργική διαμόρφωση Fail2ban + ipsum

Η βασική εγκατάσταση βρίσκεται παραπάνω. Εδώ είναι η λειτουργική διαμόρφωση που δίνει δεκάδες ενεργά jail και χιλιάδες αποκλεισμούς: γενικές ρυθμίσεις, βασικά jail και αυτόματο μπαν κακόβουλων IP από τη λίστα ipsum.

Το αρχείο /etc/fail2ban/jail.local — γενικές ρυθμίσεις και τα σημαντικότερα jail:

[DEFAULT] bantime = 1w findtime = 900 maxretry = 3 backend = systemd banaction = nftables-multiport ignoreip = 127.0.0.1/8 ::1 <YOUR_IP> <TRUSTED_NETS> # Προοδευτικό μπαν: κάθε επανάληψη διαρκεί περισσότερο bantime.increment = true bantime.factor = 2 bantime.maxtime = 5w bantime.rndtime = 300 [sshd] enabled = true maxretry = 5 bantime = -1 # μόνιμο μπαν για brute-force SSH findtime = 3600 # Υπότροποι: όποιος έφαγε πολλά μπαν, μπανάρεται μόνιμα [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = -1 findtime = 86400 maxretry = 2 [http-get-dos] enabled = true maxretry = 100 findtime = 300 bantime = 1w # Υπηρεσίες web (apache-*, nginx-*, php-url-fopen, phpmyadmin-syslog): [nginx-http-auth] enabled = true port = http,https [apache-badbots] enabled = true port = http,https # … και τα υπόλοιπα jail ανά υπηρεσία (dovecot, exim, postfix-sasl, # mysqld-auth, vsftpd, portscan, pam-generic) — enabled = true
Στο ignoreip βάλτε οπωσδήποτε το δικό σας IP και τα έμπιστα δίκτυα, αλλιώς μπορεί να μπανάρετε τον εαυτό σας. Μετά τις αλλαγές: sudo fail2ban-client reload.

Αυτόματη φόρτωση της λίστας αποκλεισμού ipsum — στο cron του root (sudo crontab -e): το level 1 (100+ χιλιάδες IP) φορτώνεται στο σύνολο ipsum, που αποκόπτεται στο firewall (περισσότερα — στην ενότητα «Λίστα αποκλεισμού IPset»):

# 04:00 — ενημέρωση του ipset ipsum (level 1, μέγιστη κάλυψη): 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1
Το σύνολο πρέπει να ονομάζεται ipsum — αυτό ακριβώς διαβάζει ο πίνακας (κάρτα «IPset ipsum»). Επίπεδα: levels/1.txt — μέγιστη κάλυψη, levels/3.txt — πιο ακριβές (3+ πηγές).

Γιατί ο «Μόνιτορ ασφαλείας» χωρίζεται σε δύο ζώνες. Η προστασία λειτουργεί σε δύο επίπεδα, και ο πίνακας δεν τα ανακατεύει:

  • Πραγματικές επιθέσεις (αντιδραστικά) — ό,τι έπιασε το fail2ban: ζωντανές απόπειρες παραβίασης (jail sshd, apache-*, nginx-* κ.λπ.) και κακόβουλοι υπότροποι (jail recidive — αυτοί που έχουν ήδη μπαναριστεί πολλές φορές). Είναι IP που πραγματικά σας επιτέθηκαν — βρίσκονται στον χάρτη επιθέσεων και στη «Χρονογραμμή».
  • Προληπτικός αποκλεισμός (προδραστικά) — δημόσια λίστα αποκλεισμού γνωστών κακόβουλων IP ipset ipsum, που αποκόπτεται στο firewall με κανόνα DROP. Οι περισσότερες από αυτές τις διευθύνσεις ούτε καν άγγιξαν τον διακομιστή σας — αποκόπτονται εκ των προτέρων· ο μετρητής «IPset ipsum» δείχνει πόσες αποκόπηκαν προληπτικά.

Η διαφορά είναι απλή: αντιδραστικά — «αυτοί επιτέθηκαν και έφαγαν μπαν», προληπτικά — «αυτοί αποκλείστηκαν πριν καν την απόπειρα». Παλιότερα στο recidive φορτωνόταν τεχνητά η list-3 του ipsum (από εκεί ο παλιός διαχωρισμός «recidive λίστας»)· τώρα το recidive έχει μόνο πραγματικούς υπότροπους, ενώ το προληπτικό είναι εξ ολοκλήρου στο firewall.

14. Λίστα αποκλεισμού IPset (ipsum)

ipsum — δημόσια λίστα κακόβουλων IP που ενημερώνεται καθημερινά. Η μονάδα εμφανίζει τον αριθμό των φορτωμένων διευθύνσεων στον πίνακα και στον χάρτη επιθέσεων και τον συνυπολογίζει στη Βαθμολογία ασφάλειας (−10 αν το σύνολο δεν έχει φορτωθεί).

Η ελάχιστη επιλογή χωρίς fail2ban — ξεχωριστό σύνολο ipsum με αποκλεισμό μέσω iptables:

# Δημιουργία συνόλου (μία φορά): sudo ipset create ipsum hash:ip # Σκριπτ ενημέρωσης /usr/local/bin/update-ipsum.sh: #!/bin/bash ipset flush ipsum for ip in $(curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/3.txt); do ipset add ipsum "$ip" 2>/dev/null done iptables -C INPUT -m set --match-set ipsum src -j DROP 2>/dev/null \ || iptables -I INPUT -m set --match-set ipsum src -j DROP # Cron (sudo crontab -e, καθημερινά στις 4:00): 0 4 * * * /usr/local/bin/update-ipsum.sh
Η εκτεταμένη επιλογή με fail2ban-recidive βρίσκεται στην ενότητα «Λειτουργική διαμόρφωση Fail2ban + ipsum».
Το ipset ζει στη μνήμη και χάνεται στην επανεκκίνηση. Μόνο ένα καθημερινό cron θα αφήσει το σύνολο κενό από τη στιγμή της επανεκκίνησης έως την επόμενη εκτέλεση (ο πίνακας θα δείξει 0). Φορτώστε το σύνολο και κατά την εκκίνηση — μεταφέρετε τη φόρτωση σε σκριπτ και συνδέστε το στο @reboot. Παράλληλα η εντολή create … -exist ορίζει το όριο maxelem 300000 (η προεπιλογή 65536 — το level 1 δεν χωράει, θα βγει «Hash is full»):
# /usr/local/bin/load-ipsum.sh #!/bin/bash curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/1.txt \ | grep -v '^#' | sed 's/^/add ipsum /' \ | (echo "create ipsum hash:ip hashsize 131072 maxelem 300000 -exist"; echo "flush ipsum"; cat) \ | ipset restore -exist # sudo crontab -e — καθημερινά στις 04:00 ΚΑΙ σε κάθε εκκίνηση: 0 4 * * * /usr/local/bin/load-ipsum.sh @reboot sleep 60 && /usr/local/bin/load-ipsum.sh
Πώς λειτουργεί στην αυτόματη εγκατάσταση. Το σκριπτ φορτώνει την πλήρη λίστα level 1 (100+ χιλιάδες IP) στο σύνολο ipsum και, αν το τείχος προστασίας το διαχειρίζεται ο εγκαταστάτης (νέο VPS — προφίλ «Πλήρες»/«Ελαφρύ»), συνδέει το σύνολο στο UFW με κανόνα DROP — η κίνηση από αυτές τις IP όντως αποκλείεται. Ο κανόνας βρίσκεται μετά το ESTABLISHED,RELATED, γι' αυτό οι τρέχουσες συνδέσεις (μαζί με το SSH σας) δεν διακόπτονται — κόβονται μόνο οι νέες συνδέσεις από τη λίστα. Το σύνολο αποκαθίσταται κατά τη φόρτωση της υπηρεσίας ipsum-load.service πριν το τείχος προστασίας (αλλιώς το UFW δεν θα σηκωνόταν) και ενημερώνεται με cron στις 04:00. Σε έναν ήδη διαμορφωμένο διακομιστή (πίνακας, δικό σας τείχος προστασίας) ο εγκαταστάτης δεν αγγίζει το τείχος προστασίας — εκεί το ipsum παραμένει λίστα για τον πίνακα και τον χάρτη επιθέσεων, ενώ ο κανόνας DROP προστίθεται χειροκίνητα αν το επιθυμείτε (η ελάχιστη επιλογή με iptables … --match-set ipsum … -j DROP — παραπάνω). Στην αυτόματη εγκατάσταση δεν χρειάζεται να κάνετε τίποτα χειροκίνητα.

15. Εγκατάσταση CrowdSec

Σύγχρονη αντικατάσταση του Fail2ban με συλλογικό threat intelligence: αποκλεισμοί από την κοινότητα συν δικοί σας κανόνες. Απαιτεί ξεχωριστό bouncer για την εφαρμογή των αποκλεισμών στο firewall.

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt install crowdsec sudo systemctl enable --now crowdsec # Bouncer για iptables/nftables: sudo apt install crowdsec-firewall-bouncer-iptables # Έλεγχος κατάστασης: sudo systemctl status crowdsec sudo cscli decisions list sudo cscli bouncers list
Κατάσταση «Δεν εκτελείται» στον πίνακα = η υπηρεσία είναι εγκατεστημένη, αλλά δεν είναι ενεργή (η μονάδα την ελέγχει μέσω systemctl is-active crowdsec). Εκκίνηση: sudo systemctl enable --now crowdsec· σε αποτυχία δείτε sudo journalctl -u crowdsec -n 30. Ο ίδιος κανόνας ισχύει για κάθε υπηρεσία σε κατάσταση «Δεν εκτελείται» (Suricata, Falco, Monit, MySQL).
«0 σενάρια» ή «0 bouncers» στο dashboard. Το CrowdSec έρχεται σχεδόν άδειο — χωρίς συλλογές δεν εντοπίζει τίποτα, και χωρίς καταχωρημένο bouncer οι αποκλεισμοί δεν εφαρμόζονται στο firewall. Εγκαταστήστε τις βασικές συλλογές και βεβαιωθείτε ότι το bouncer είναι στη λίστα:
# Βασικές συλλογές (Linux + SSH + web server): sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd crowdsecurity/base-http-scenarios sudo systemctl reload crowdsec # Το bouncer πρέπει να είναι στη λίστα και με κατάσταση ενεργής σύνδεσης: sudo cscli bouncers list
Στο log του bouncer stream halted / οι αποκλεισμοί δεν εφαρμόζονται. Πρόκειται για ορφανό api-key: το bouncer αφαιρέθηκε από το cscli bouncers list, αλλά το παλιό του κλειδί παρέμεινε στο /etc/crowdsec/bouncers/*.yaml. Καταχωρήστε ξανά το bouncer και ορίστε το νέο κλειδί:
sudo cscli bouncers add fw-bouncer # θα εμφανίσει νέο api_key # γράψτε αυτό το κλειδί στο api_key: στο /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml sudo systemctl restart crowdsec-firewall-bouncer
Η αυτόματη εγκατάσταση (προφίλ «Πλήρης προστασία») εγκαθιστά μόνη της τις συλλογές και καταχωρεί το firewall-bouncer — χειροκίνητα χρειάζεται μόνο σε χειροκίνητη εγκατάσταση ή μετά από χειροκίνητη παρέμβαση στο CrowdSec.

16. Εγκατάσταση AIDE

AIDE (Advanced Intrusion Detection Environment) δημιουργεί στιγμιότυπο του συστήματος αρχείων και σε κάθε έλεγχο αναφέρει τις αλλαγές σε /etc, /bin, /usr. Μετά την εγκατάσταση είναι υποχρεωτική η αρχικοποίηση της βάσης (aideinit).

sudo apt install aide # Αρχικοποίηση της βάσης (5–15 λεπτά): sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Ubuntu 24.04: ο κατάλογος /var/lib/aide δημιουργείται σε λειτουργία 700 (κάτοχος _aide), # και ο πίνακας (www-data) δεν βλέπει τη βάση → εμφανίζει «Δεν αρχικοποιήθηκε». # Ανοίξτε τον κατάλογο για διέλευση (τα αρχεία της βάσης παραμένουν 600): sudo chmod 755 /var/lib/aide # Πρώτος έλεγχος ΜΕ ΕΓΓΡΑΦΗ στο αρχείο καταγραφής που διαβάζει το monitor. # Σε Ubuntu/Debian το aide απαιτεί ρητό --config (αλλιώς «missing configuration»· # το εκτελέσιμο aide.wrapper δεν διανέμεται στις νέες εκδόσεις): sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Κατά το aideinit το τερματικό μένει 5–15 λεπτά στη γραμμή Running aide --init... — αυτό είναι φυσιολογικό (κατακερματισμός όλου του συστήματος αρχείων, φόρτος στον δίσκο). Μην το διακόπτετε με Ctrl+C. Αν η διεργασία «κολλάει» αλλά δεν γράφει τίποτα — ίσως περιμένει απάντηση σε ένα κρυφό ερώτημα Overwrite existing aide.db.new [Yn]? (πατήστε Y). Ελέγξτε τη δραστηριότητα από άλλη συνεδρία: pgrep -af aide.
Σφάλμα aideinit: «21_aide_spamassassin … printf: invalid number» (return code 20) — γνωστό bug του config-snippet του AIDE στο Ubuntu 22.04. Η βάση δεν δημιουργείται. Αφαιρέστε το ελαττωματικό snippet και επαναλάβετε:
sudo mv /etc/aide/aide.conf.d/21_aide_spamassassin /etc/aide/21_aide_spamassassin.disabled sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Καταστάσεις στον πίνακα. «Δεν αρχικοποιήθηκε» = ο πίνακας δεν βλέπει το αρχείο της βάσης: είτε δεν εκτελέστηκε το aideinit, είτε (Ubuntu 24.04) ο κατάλογος /var/lib/aide δημιουργήθηκε σε λειτουργία 700 και δεν είναι προσβάσιμος από τον www-data — διορθώνεται με sudo chmod 755 /var/lib/aide (δείτε το μπλοκ παραπάνω). «Δεν έγιναν έλεγχοι» = η βάση υπάρχει, αλλά δεν έχει εκτελεστεί ακόμη έλεγχος — δεν είναι σφάλμα. Τα αποτελέσματα το monitor τα διαβάζει από το /var/log/aide/aide.log.
Τακτικός έλεγχος → αρχείο καταγραφής για τον πίνακα. Το τυπικό /etc/cron.daily/aide στα νέα Ubuntu/Debian μπορεί να μη γράφει το /var/log/aide/aide.log στη σωστή μορφή (και το aide.wrapper δεν υπάρχει πλέον σε αυτά). Πιο αξιόπιστο είναι να προσθέσετε δικό σας cron με ρητό --config — γράφει το αρχείο ως root σε λειτουργία 644, και το monitor το διαβάζει χωρίς επιπλέον ομάδες:
# sudo crontab -e — καθημερινός έλεγχος στις 02:00: 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # Εκτελέστε το τώρα, χωρίς να περιμένετε το πρόγραμμα: sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Η αυτόματη εγκατάσταση κάνει ήδη όλα αυτά: chmod 755 /var/lib/aide και cron ελέγχου στις 02:00 — δεν χρειάζεται τίποτα χειροκίνητα.
Κάντε την πρώτη αρχικοποίηση σε καθαρό διακομιστή — πριν την εγκατάσταση των web εφαρμογών. Μετά από νόμιμες αλλαγές, αναδημιουργήστε τη βάση: sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db.

17. Εγκατάσταση του ClamAV

Σαρωτής antivirus για Linux. Ιδιαίτερα χρήσιμος για έλεγχο του /var/www για PHP-shells και κακόβουλο κώδικα.

sudo apt install clamav clamav-daemon sudo systemctl enable --now clamav-daemon # Ενημέρωση της βάσης υπογραφών: sudo freshclam # Χειροκίνητη σάρωση φακέλου: sudo clamscan -r /var/www --infected
Ο δαίμονας clamd δείχνει «Ανενεργός» μετά το enable --now; Τρεις συνηθισμένες αιτίες:

1. Στο config έχει μείνει η γραμμή Example — ο clamd αρνείται να ξεκινήσει όσο υπάρχει:

sudo sed -i '/^Example/d' /etc/clamav/clamd.conf sudo systemctl restart clamav-daemon

2. Δεν έχει κατέβει η βάση υπογραφών — ο clamd δεν ξεκινά χωρίς αυτήν:

sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam sudo systemctl restart clamav-daemon

3. Απλώς φορτώνει — ο clamd φορτώνει ~8 εκατ. υπογραφές στη μνήμη σε 30–60 δευτ. Περιμένετε και ελέγξτε: systemctl is-active clamav-daemon (κατάσταση activating → φορτώνει ακόμη).

Διαγνωστικά: sudo journalctl -u clamav-daemon -n 30 --no-pager.
Στο dashboard «Ελεγμένα αρχεία: 0» / «Τελευταία σάρωση: —»; Ο δαίμονας clamd απλώς κρατά τις υπογραφές στη μνήμη, ο ίδιος δεν σαρώνει τίποτα βάσει προγράμματος. Ο πίνακας δείχνει τα αποτελέσματα προγραμματισμένης σάρωσης, οπότε χρειάζεται ένα cron που σαρώνει και γράφει log. Η αυτόματη εγκατάσταση τοποθετεί το wrapper /usr/local/bin/clamav-scan.sh και cron στη 01:30 — μετά την πρώτη εκτέλεση θα συμπληρωθούν τα «Ελεγμένα αρχεία» και «Τελευταία σάρωση». Εκτελέστε το αμέσως, χωρίς να περιμένετε το πρόγραμμα: sudo /usr/local/bin/clamav-scan.sh.

18. Εγκατάσταση του Linux Malware Detect (maldet)

Linux Malware Detect (LMD) — σαρωτής κακόβουλου λογισμικού για διαδικτυακές απειλές: PHP-shells, web backdoors, downloaders. Χρησιμοποιεί τη μηχανή του ClamAV και τη συμπληρώνει με τις δικές του υπογραφές.

wget https://www.rfxn.com/downloads/maldetect-current.tar.gz tar -xzf maldetect-current.tar.gz dir=$(ls -d maldetect-*/ | head -1) && cd "$dir" && sudo bash install.sh && cd ~ rm -rf maldetect-* maldetect-current.tar.gz # Ενημέρωση υπογραφών: sudo maldet -u # Σάρωση του /var/www: sudo maldet -a /var/www
Το LMD και το ClamAV λειτουργούν καλά μαζί. Τελευταία αναφορά: maldet --report.
Κατά την εγκατάσταση μπορεί να εμφανιστεί η γραμμή update-rc.d: error: unable to read /etc/init.d/maldet — είναι ακίνδυνη. Το maldet δεν χρησιμοποιεί init.d, η ενημέρωση υπογραφών και οι σαρώσεις εκτελούνται μέσω /etc/cron.daily/maldet. Αν παρακάτω βλέπετε installation completed — όλα εγκαταστάθηκαν.
Στη σελίδα το LMD αναφέρεται ως «Δεν έχει εγκατασταθεί», ενώ είναι εγκατεστημένο; Το maldet δεν εγκαθίσταται μέσω apt, αλλά στο /usr/local/maldetect, και όταν είναι ενεργό το open_basedir η ύπαρξή του ελέγχεται μέσω shell — δείτε την ενότητα «Η σελίδα είναι κενή, ενώ υπάρχουν δεδομένα στον διακομιστή».

19. Εγκατάσταση του Suricata

Δικτυακό σύστημα ανίχνευσης εισβολών: αναλύει την κίνηση σε επίπεδο πακέτων και γνωρίζει χιλιάδες υπογραφές επιθέσεων. Συμπληρώνει το ModSecurity (το οποίο λειτουργεί σε επίπεδο HTTP, ενώ το Suricata σε επίπεδο TCP/IP).

sudo add-apt-repository ppa:oisf/suricata-stable sudo apt update && sudo apt install suricata # Λήψη των τρεχόντων κανόνων: sudo suricata-update sudo systemctl enable --now suricata
Το Suricata είναι «Ενεργό», αλλά ο πίνακας δεν δείχνει ειδοποιήσεις / ο αριθμός συμβάντων είναι 0; Το Suricata γράφει το /var/log/suricata/eve.json ως root με δικαιώματα 750 στον κατάλογο, και ο διακομιστής web (www-data) δεν μπορεί να το διαβάσει. Ανοίξτε τον κατάλογο για διέλευση — τα αρχεία μέσα παραμένουν προστατευμένα:
sudo chmod o+rx /var/log/suricata
Η αυτόματη εγκατάσταση το κάνει μόνη της — δεν χρειάζεται χειροκίνητα.

20. Εγκατάσταση Falco

Παρεμβάλλεται στις κλήσεις συστήματος μέσω eBPF/kernel module και εντοπίζει ανωμαλίες σε πραγματικό χρόνο: shell από nginx, ανάγνωση του /etc/passwd από διεργασία web, εγγραφή στο /bin κ.λπ.

curl -fsSL https://falco.org/repo/falcosecurity-packages.asc > /tmp/falco.asc gpg --dearmor < /tmp/falco.asc | sudo tee /usr/share/keyrings/falco-archive-keyring.gpg > /dev/null sudo chmod 644 /usr/share/keyrings/falco-archive-keyring.gpg && rm /tmp/falco.asc echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main" \ | sudo tee /etc/apt/sources.list.d/falcosecurity.list sudo apt update && sudo apt install falco sudo systemctl enable --now falco
Η μονάδα διαβάζει τα συμβάντα του Falco μέσω journalctl -u falco (χωρίς sudo — μέσω της ομάδας systemd-journal). Βεβαιωθείτε ότι ο www-data ανήκει σε αυτή την ομάδα — δείτε «Ρύθμιση sudo» (σημ.2) στη σελίδα χειροκίνητης εγκατάστασης.
«0 συμβάντα σε 24 ώρες» — είναι φυσιολογικό, όχι σφάλμα. Το Falco είναι event-driven: σιωπά όσο όλα πάνε καλά και καταγράφει συμβάν μόνο σε ανωμαλία (shell από διεργασία web, ανάγνωση του /etc/passwd, εγγραφή σε καταλόγους συστήματος). Μηδέν κρίσιμα σε ένα εικοσιτετράωρο σε έναν ήσυχο διακομιστή είναι υγιής κατάσταση.
Για τον πίνακα είναι πιο αξιόπιστη η έξοδος σε αρχείο. Η ανάγνωση μέσω journalctl απαιτεί δικαιώματα στο journal· για να βλέπει ο πίνακας τα συμβάντα σταθερά, η αυτόματη εγκατάσταση ενεργοποιεί στο Falco το file_output → /var/log/falco/falco.log και θέτει στην υπηρεσία UMask=0022 (το log διαβάζεται από τον web server). Σε νέα εγκατάσταση δεν χρειάζεται να το ρυθμίσετε χειροκίνητα.

21. Εγκατάσταση ModSecurity (WAF)

ModSecurity — τείχος προστασίας web (WAF) για Apache ή Nginx. Μπλοκάρει επιθέσεις σε επίπεδο εφαρμογής: SQL injection, XSS, path traversal, σαρωτές.

# Apache: sudo apt install libapache2-mod-security2 sudo a2enmod security2 # Σύνολο κανόνων OWASP Core Rule Set: sudo apt install modsecurity-crs # ΥΠΟΧΡΕΩΤΙΚΟ: χωρίς αυτό το αρχείο η μηχανή κανόνων είναι απενεργοποιημένη sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf sudo apache2ctl configtest && sudo systemctl reload apache2 # Έλεγχος: πρέπει να επιστρέψει 403 curl -s -o /dev/null -w '%{http_code}\n' "https://monitor.example.com/?id=1%20UNION%20SELECT%201,2--"
Η εγκατάσταση του πακέτου από μόνη της δεν προστατεύει τίποτα. Ο Apache φορτώνει τα configs με τη γραμμή IncludeOptional /etc/modsecurity/*.conf, ενώ το πακέτο τοποθετεί μόνο το modsecurity.conf-recommended — αυτό δεν ταιριάζει με τη μάσκα *.conf. Αν δεν το αντιγράψετε στο modsecurity.conf, το SecRuleEngine παραμένει Off: η μονάδα είναι φορτωμένη, οι κανόνες CRS είναι φορτωμένοι, αλλά η κίνηση δεν ελέγχεται και δεν δημιουργείται αρχείο ελέγχου. Η ενδιάμεση λειτουργία DetectionOnly απλώς καταγράφει συμβάντα χωρίς να μπλοκάρει τα αιτήματα — ο πίνακας τη δείχνει κίτρινη.

Πρόσβαση του πίνακα στο αρχείο ελέγχου. Το αρχείο /var/log/apache2/modsec_audit.log ανήκει στον root (δικαιώματα 640), ο web χρήστης δεν μπορεί να το διαβάσει. Ο πίνακας λαμβάνει τα δεδομένα μέσω ενός wrapper — δημιουργήστε το:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec # στο /etc/sudoers.d/monitor (χρήστης = αυτός με τον οποίο τρέχει ο PHP-FPM): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
Το wrapper λαμβάνει την τελευταία οδηγία SecRuleEngine χωρίς εσοχή: οι γραμμές με εσοχή βρίσκονται μέσα σε μπλοκ <LocationMatch>/<Directory> (για παράδειγμα, απενεργοποίηση του WAF για το phpMyAdmin) και δεν καθορίζουν την καθολική λειτουργία.
Ο χρήστης στο sudoers πρέπει να συμπίπτει με τον χρήστη του FPM pool: σε συνηθισμένο Apache/Debian αυτός είναι ο www-data, στο HestiaCP το pool του ιστότοπου τρέχει από τον ιδιοκτήτη του ιστότοπου (για παράδειγμα, admin) — ελέγξτε με grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
Αν ο ιστότοπος βρίσκεται πίσω από proxy Nginx (HestiaCP), ο Apache βλέπει ως πελάτη το ίδιο το proxy — ο πίνακας λαμβάνει την πραγματική IP του επιτιθέμενου από την κεφαλίδα X-Forwarded-For. Στα στατιστικά καταλήγουν μόνο οι συναλλαγές με ενεργοποιημένο κανόνα: η οδηγία SecAuditLogRelevantStatus γράφει στο αρχείο ελέγχου οποιεσδήποτε αποκρίσεις 4xx/5xx, οπότε εκεί καταλήγουν και τα συνηθισμένα 403/500 — ο πίνακας δεν τα θεωρεί συμβάντα WAF.
Το μπλοκ ---RULES--- χρειάζεται για την ενότητα «Όλοι οι ενεργοί κανόνες» — ο πίνακας δεν δείχνει μόνο τους κανόνες που ενεργοποιήθηκαν, αλλά όλους τους φορτωμένους κανόνες CRS + τους προσαρμοσμένους. Οι τρεις διαδρομές στον βρόχο for f in … είναι τα τυπικά σημεία για κανόνες CRS και τοπικές προσθήκες· αν έχετε διαφορετική διάταξη (το πακέτο τοποθετεί τα αρχεία στον δικό του κατάλογο, ή οι προσαρμοσμένοι κανόνες δεν βρίσκονται στο /etc/modsecurity/custom-rules.conf), βρείτε τις πραγματικές διαδρομές με την εντολή sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null και τοποθετήστε τις στη λίστα. Αν το wrapper είναι παλιό (χωρίς αυτή την ενότητα) — η ενότητα απλώς θα δείξει την προειδοποίηση «μη διαθέσιμο», η υπόλοιπη σελίδα λειτουργεί όπως πριν.

22. Εγκατάσταση Auditd

Auditd (Linux Audit Daemon) καταγράφει τις κλήσεις συστήματος σε επίπεδο πυρήνα: συνδέσεις και αποσυνδέσεις, εντολές sudo, αποτυχημένες προσπάθειες ταυτοποίησης, αλλαγές αρχείων. Η μονάδα εμφανίζει τις συνδέσεις, τις αποτυχημένες προσπάθειες και τις εντολές sudo της σημερινής ημέρας.

sudo apt install auditd audispd-plugins sudo systemctl enable --now auditd # Έλεγχος κατάστασης και συμβάντων: sudo systemctl status auditd sudo ausearch -m USER_LOGIN -ts today
Η μονάδα διαβάζει τα συμβάντα μέσω ausearch (/usr/sbin/ausearch) και, όταν χρειάζεται, από το /var/log/audit/audit.log με την εντολή tail. Και τα δύο πρέπει να βρίσκονται στο sudoers.

23. Εγκατάσταση του Monit

Παρακολουθεί υπηρεσίες (nginx, php-fpm, mysql κ.λπ.) και τις επανεκκινεί όταν πέσουν. Μπορεί να στέλνει ειδοποιήσεις σε email.

sudo apt install monit sudo systemctl enable --now monit # Αρχεία ρυθμίσεων: sudo nano /etc/monit/monitrc ls /etc/monit/conf.d/
Ο μόνιτορ λαμβάνει τη λίστα υπηρεσιών μέσω monit status. Στο /etc/monit/monitrc πρέπει να είναι ενεργοποιημένο το HTTP interface (μπλοκ set httpd με allow localhost), αλλιώς το monit status θα επιστρέψει σφάλμα.
Στον πίνακα «0 υπηρεσίες υπό παρακολούθηση»; Δύο αιτίες. (1) Το HTTP interface είναι απενεργοποιημένο — στο monitrc η γραμμή set httpd είναι σε σχόλιο (από προεπιλογή είναι ως # set httpd port 2812 …). Αφαιρέστε το σχόλιο από το μπλοκ και επιτρέψτε το localhost. (2) Το ενεργοποιημένο httpd από μόνο του δεν παρακολουθεί τίποτα — το Monit μετράει μόνο ό,τι περιγράφεται με στάντζες check· χωρίς αυτές η λίστα είναι κενή ακόμη και με λειτουργικό interface. Ελάχιστη λειτουργική ρύθμιση:
# /etc/monit/conf.d/00-httpd — HTTP interface για localhost: set httpd port 2812 use address localhost allow localhost # παραδείγματα στάντζων check (τι να παρακολουθείται): check process sshd with pidfile /run/sshd.pid start program = "/usr/bin/systemctl start ssh" stop program = "/usr/bin/systemctl stop ssh" check filesystem rootfs with path / if space usage > 90% then alert
sudo monit -t # έλεγχος σύνταξης (Control file syntax OK) sudo systemctl reload monit sudo monit status
Η αυτόματη εγκατάσταση τοποθετεί έτοιμο conf.d με httpd στη 2812 και ένα σύνολο ελέγχων — σε νέα εγκατάσταση δεν χρειάζεται χειροκίνητη ρύθμιση.
Υπηρεσία σε κατάσταση «Με σφάλματα»; Ο μόνιτορ απλώς εμφανίζει την κατάσταση και σκόπιμα δεν επανεκκινεί υπηρεσίες από τον web πίνακα (αυτό θα ήταν απομακρυσμένη εκτέλεση εντολών root σε πίνακα ασφαλείας). Διάγνωση και επανεκκίνηση — μέσω SSH με το Monit:
sudo monit status <service> # αιτία του σφάλματος sudo monit restart <service> # επανεκκίνηση μέσω Monit # αν το Monit δεν σηκώνει την υπηρεσία — δείτε το δικό της unit: sudo systemctl status <unit> --no-pager sudo journalctl -u <unit> -n 50 --no-pager

24. Εγκατάσταση PSAD (ανίχνευση σάρωσης θυρών)

PSAD αναλύει το αρχείο καταγραφής του iptables και εντοπίζει σαρώσεις θυρών και δικτυακές επιθέσεις, αποδίδοντας σε κάθε πηγή ένα επίπεδο απειλής (1–5). Συμπληρώνει τα fail2ban και Suricata.

sudo apt install psad # Το PSAD διαβάζει το log του iptables — πρέπει να ενεργοποιηθεί η καταγραφή (το UFW το κάνει μόνο του). # Για καθαρό iptables προσθέστε κανόνες LOG στις αλυσίδες INPUT/FORWARD. sudo psad --sig-update sudo systemctl enable --now psad
Η μονάδα διαβάζει δεδομένα μέσω psad --Status (απαιτείται στο sudoers). Χωρίς καταγραφή του iptables η σελίδα θα είναι κενή — αυτό είναι φυσιολογικό όσο δεν έχουν γίνει σαρώσεις.

25. AppArmor / SELinux (έλεγχος πρόσβασης)

Mandatory Access Control περιορίζει σε ποια αρχεία και πόρους μπορεί να έχει πρόσβαση ένα πρόγραμμα, ακόμη κι αν παραβιαστεί. Στα Ubuntu/Debian χρησιμοποιείται από προεπιλογή το AppArmor (συνήθως ήδη εγκατεστημένο και ενεργό).

# AppArmor (Ubuntu/Debian): sudo apt install apparmor apparmor-utils sudo systemctl enable --now apparmor sudo aa-status # έλεγχος προφίλ
Η μονάδα διαβάζει την κατάσταση μέσω aa-status (απαιτείται στο sudoers). Δείχνει τον αριθμό των προφίλ σε λειτουργία enforce/complain και τις διεργασίες χωρίς προφίλ.

Τα «φορτωμένα προφίλ» είναι περισσότερα από enforce + complain — αυτό είναι φυσιολογικό. Στο AppArmor 4.x (Ubuntu 24.04 και νεότερα) προστέθηκε η λειτουργία unconfined: το προφίλ είναι φορτωμένο στον πυρήνα, αλλά δεν περιορίζει τίποτα. Το Ubuntu επισημαίνει έτσι δεκάδες προφίλ για προγράμματα που χρησιμοποιούν user namespaces (προγράμματα περιήγησης, πελάτες torrent και παρόμοια). Όταν υπάρχουν τέτοια προφίλ, η κάρτα «Φορτωμένα προφίλ» γίνεται πορτοκαλί και δείχνει τον αριθμό τους — για παράδειγμα unconfined: 90 με 120 φορτωμένα και 26 σε enforce. Πραγματική προστασία παρέχουν μόνο τα προφίλ σε enforce· στο Ubuntu 22.04 (AppArmor 3.x) δεν υπάρχει αυτή η λειτουργία και οι αριθμοί πάντα ταιριάζουν.

sudo aa-status | grep -E "profiles are" # ανάλυση ανά λειτουργία sudo aa-enforce /etc/apparmor.d/profile-name # μετάβαση προφίλ σε enforce
Η μετάβαση σε enforce των προφίλ που το Ubuntu άφησε σκόπιμα σε unconfined αξίζει μόνο συνειδητά: είναι απενεργοποιημένα όχι κατά λάθος, αλλά επειδή διαφορετικά χαλάει η λειτουργία των ίδιων των προγραμμάτων. Τα προφίλ σε complain είναι άλλη υπόθεση: εκεί οι κανόνες έχουν ήδη γραφτεί και απλώς δεν εφαρμόζονται.

26. Εγκατάσταση debsums (ακεραιότητα πακέτων)

Το debsums ελέγχει ότι τα αρχεία των εγκατεστημένων πακέτων ταιριάζουν με τα αθροίσματα ελέγχου του αποθετηρίου — εντοπίζει αλλοιωμένα εκτελέσιμα του συστήματος (συμπληρώνει το AIDE). Ο πλήρης έλεγχος διαρκεί 1–2 λεπτά, γι' αυτό εκτελείται μέσω cron, και ο πίνακας διαβάζει το αποτέλεσμα από το data/debsums/debsums.log και το κατηγοριοποιεί μόνος του (σημασία έχουν μόνο τα εκτελέσιμα και οι βιβλιοθήκες).

Η εργασία μπαίνει στο root-cron (sudo crontab -e). Το έτοιμο περιτύλιγμα debsums-scan.sh τοποθετείται στο /usr/local/bin/ (chmod +x· δείτε τη σύνοψη εργασιών cron) και γράφει μόνο του την αναφορά στο data/debsums/ του πίνακα.

sudo apt install debsums # Γραμμή cron (καθημερινά 4:30): 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

Το περιτύλιγμα debsums-scan.sh βρίσκει μόνο του το data/ του πίνακα — δεν χρειάζεται να ορίσετε διαδρομή.

Οι αλλαγές στα /etc/ (ρυθμίσεις) και /usr/share/ (πόροι) στον διακομιστή είναι συνήθως φυσιολογικές — ο πίνακας τις επισημαίνει με ξεχωριστό χρώμα. Ανησυχητικές είναι οι αλλαγές σε εκτελέσιμα και βιβλιοθήκες (/bin, /sbin, /usr/lib κ.λπ.) — η κάρτα «Εκτελέσιμα / βιβλιοθήκες» δείχνει ακριβώς αυτές.

27. Ρύθμιση αναφορών Lynis

Το Lynis εκτελείται χειροκίνητα ή μέσω cron. Η αναφορά πρέπει να αποθηκεύεται στον φάκελο data/lynis/ του έργου — η μονάδα διαβάζει το αρχείο lynis-report.dat.

# Μεμονωμένη εκτέλεση (βάλτε τη δική σας διαδρομή προς τη ρίζα του πίνακα): sudo lynis audit system --report-file /path/to/monitor/data/lynis/lynis-report.dat # Καθημερινός έλεγχος — γραμμή cron (έτοιμο wrapper lynis-scan.sh στο /usr/local/bin/, δείτε τη σύνοψη): 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1
Μετά την πρώτη εκτέλεση, η σελίδα «Έλεγχος Lynis» θα εμφανίσει αμέσως το hardening index, τις προειδοποιήσεις και τις συστάσεις.
Το κουμπί «Εκτέλεση ελέγχου» στη σελίδα Lynis. Εκτελεί το lynis-scan.sh στο παρασκήνιο απευθείας από τον πίνακα (χωρίς αναμονή για το cron): εμφανίζει «Σάρωση…» και με την ολοκλήρωση ενημερώνει μόνο του την αναφορά. Για αυτό, ο χρήστης web χρειάζεται μια γραμμή sudoers για την εκτέλεση του script — ο εγκαταστάτης την προσθέτει αυτόματα στο /etc/sudoers.d/monitor. Αν ο πίνακας εγκαταστάθηκε χειροκίνητα/παλαιότερα, προσθέστε την με τον ίδιο χρήστη που αναγράφεται ήδη στο αρχείο:
u=$(sudo awk '/NOPASSWD/ && !/lynis-scan/ {print $1; exit}' /etc/sudoers.d/monitor) [ -n "$u" ] && echo "$u ALL=(ALL) NOPASSWD: /usr/local/bin/lynis-scan.sh" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c && sudo chmod 440 /etc/sudoers.d/monitor

28. Ρύθμιση αναφορών Logwatch

Το Logwatch πρέπει να αποθηκεύει τις καθημερινές αναφορές στον φάκελο data/logwatch/ του έργου σε μορφή .txt. Η μονάδα εμφανίζει την τελευταία αναφορά και το αρχείο.

# Καθημερινά (6:00) — γραμμή cron (έτοιμο wrapper logwatch_daily.sh στο /usr/local/bin/, βλ. σύνοψη): 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1

Μονάδες πίνακα

29. Παρακολούθηση δικτύου (ενσωματωμένη)

Η παρακολούθηση δικτύου δεν απαιτεί εγκατάσταση — είναι μια ενσωματωμένη σελίδα του πίνακα. Εμφανίζει την κατάσταση δικτύου του διακομιστή από τοπικές πηγές:

  • διεπαφές και κίνηση — από /proc/net/dev·
  • κατάσταση συνδέσμων (UP/DOWN) και IP — μέσω ip·
  • συνδέσεις και θύρες σε ακρόαση — μέσω ss·
  • συμβάντα δικτύου του πυρήνα τελευταίων 24ω — μέσω journalctl -k.

Οι τρεις πρώτες πηγές λειτουργούν χωρίς sudo, οπότε οι διεπαφές, η κίνηση, οι συνδέσεις και οι θύρες φαίνονται αμέσως. Το τμήμα «Συμβάντα πυρήνα» χρησιμοποιεί journalctl -k — διαβάζεται μέσω της ομάδας systemd-journal («Ρύθμιση sudo», β.2), δεν χρειάζεται sudo. Ελέγξτε ότι όλα είναι προσβάσιμα από τον χρήστη web:

# Έλεγχος ως www-data (κάτω από αυτόν τρέχει η PHP): sudo -u www-data bash -c 'cat /proc/net/dev' sudo -u www-data bash -c 'ip -o link show' sudo -u www-data bash -c 'ss -s' sudo -u www-data journalctl -k --no-pager -n 5
Το τμήμα «Συμβάντα δικτύου πυρήνα» εμφανίζει συμβάντα της στοίβας δικτύου του πυρήνα (αλλαγή συνδέσμου up/down, σφάλματα φέροντος, «network unreachable»). Οι εγγραφές του τείχους UFW BLOCK δεν εμφανίζονται εδώ — βρίσκονται στις σελίδες «Τείχος προστασίας UFW» και «Χάρτης επιθέσεων». Κενό τμήμα με πράσινο τικ = μέσα στο 24ωρο δεν υπήρξαν αστοχίες δικτύου.

30. Δίσκος και SMART

Η ενσωματωμένη σελίδα εμφανίζει τρία πράγματα:

  • Συστήματα αρχείων — πληρότητα κατατμήσεων (df)· η μπάρα κοκκινίζει στο ≥90%·
  • Αποθηκευτικά μέσα — λίστα δίσκων (lsblk), μόνο πραγματικά (τα loop/snap αποκρύπτονται)·
  • Υγεία (SMART) — κατάσταση δίσκου και χαρακτηριστικά (smartctl).

Ο χώρος και η λίστα συσκευών λειτουργούν αμέσως, χωρίς ρύθμιση. Για το SMART απαιτείται το πακέτο smartmontools. Η διεργασία web δεν έχει άμεση πρόσβαση στις συσκευές δίσκων, γι' αυτό το SMART λαμβάνεται μέσω cron στο αρχείο data/disk/smart.txt, και ο πίνακας το διαβάζει.

Η εργασία μπαίνει στο root-cron (sudo crontab -e). Το έτοιμο wrapper smart-scan.sh τοποθετείται στο /usr/local/bin/ (chmod +x· δείτε τη σύνοψη εργασιών cron) και γράφει το ίδιο στο data/disk/ του πίνακα.

sudo apt install smartmontools # Γραμμή cron (κάθε 30 λεπτά): */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

Το wrapper smart-scan.sh εντοπίζει μόνο του το data/ του πίνακα — δεν χρειάζεται να ορίσετε διαδρομή. Εσωτερικά το lsblk -e7,11 εξαιρεί τα loop/cdrom.

Σε εικονικούς δίσκους (QEMU/KVM και παρόμοιους) συνήθως διατίθεται μόνο η γενική κατάσταση «υγεία: OK», ενώ η θερμοκρασία, οι ώρες λειτουργίας και οι ανακατανεμημένοι τομείς μπορεί να είναι κενά — αυτό είναι φυσιολογικό. Σε φυσικό διακομιστή εμφανίζονται όλα τα χαρακτηριστικά.

31. Επιδόσεις (CPU/RAM/Δίκτυο/Δίσκος)

Η σελίδα εμφανίζει το ιστορικό φορτίου του διακομιστή για τις τελευταίες 24 ώρες — Load Average, χρήση CPU και αναμονή I/O, RAM/Swap, δικτυακή κίνηση (λήψη/αποστολή), I/O δίσκου (ανάγνωση/εγγραφή), πλήρωση δίσκου και inodes, ανοιχτούς περιγραφείς αρχείων και συνδέσεις MySQL, καθώς και τον τρέχοντα αριθμό συνδέσεων TCP και διεργασιών. Το παράθυρο των 24 ωρών είναι το προεπιλεγμένο: τα κουμπιά επάνω το αλλάζουν σε 7 ημέρες ή 30 ημέρες.

Τα δεδομένα συλλέγει το cron/collect_metrics.php — κάθε 5 λεπτά γράφει ένα «ακατέργαστο» στιγμιότυπο των μετρητών (/proc/loadavg, /proc/meminfo, /proc/stat, /proc/net/dev, /proc/diskstats, df/df -i, /proc/sys/fs/file-nr, SHOW GLOBAL STATUS LIKE 'Threads_connected') στον πίνακα ΒΔ system_metrics· τα ποσοστά και τις ταχύτητες τα υπολογίζει η ίδια η σελίδα από τη διαφορά μεταξύ γειτονικών στιγμιότυπων (πλήρωση δίσκου/inodes/περιγραφέων/συνδέσεων MySQL — στιγμιαίες τιμές, χωρίς επανυπολογισμό). Δεν απαιτείται sudo — οι πηγές διαβάζονται χωρίς δικαιώματα root.

Δύο βάθη αποθήκευσης. Τα «ακατέργαστα» πεντάλεπτα στιγμιότυπα ζουν ένα εικοσιτετράωρο (συν μία ώρα περιθώριο, ώστε το παλαιότερο σημείο του γραφήματος να έχει ακόμη προκάτοχο για τον υπολογισμό). Κάθε ώρα που ολοκληρώνεται συμπτύσσεται σε μία γραμμή· αυτή η ωριαία σειρά διατηρείται 30 ημέρες και ακριβώς αυτήν διαβάζουν οι προβολές «7 ημέρες» και «30 ημέρες». Έτσι ένας μήνας ιστορικού κοστίζει περίπου 720 γραμμές αντί για περίπου 8600.

Στις περιόδους των 7 και 30 ημερών εμφανίζονται ωριαίοι μέσοι όροι και όχι μεμονωμένες μετρήσεις — μια αιχμή πέντε λεπτών εξομαλύνεται σε αυτή την κλίμακα, και η σελίδα το επισημαίνει. Για το Load Average η ωριαία γραμμή κρατά και τον μέσο όρο και την κορύφωση της ώρας, γι’ αυτό το γράφημα δείχνει και τις δύο γραμμές. Αμέσως μετά από ενημέρωση οι μεγάλες περίοδοι είναι κενές («δεν υπάρχει ακόμη ιστορικό για αυτή την περίοδο») — η ωριαία σειρά αρχίζει να συσσωρεύεται από εκείνη τη στιγμή.
# Γραμμή cron (κάθε 5 λεπτά): */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1

Το wrapper collect-metrics-all.sh (δείτε τη σύνοψη εργασιών cron) εντοπίζει μόνο του όλα τα εγκατεστημένα instances του πίνακα στον διακομιστή και εκτελεί το cron/collect_metrics.php του καθενός με ταυτότητα του κατόχου του ιστότοπου.

Μέχρι ο συλλέκτης να τρέξει τουλάχιστον δύο φορές (τα πρώτα ~10 λεπτά μετά την εγκατάσταση), η σελίδα εμφανίζει «γίνεται συλλογή δεδομένων» — τα γραφήματα χρειάζονται τουλάχιστον ένα ζεύγος γειτονικών σημείων για να υπολογίσουν ταχύτητες και ποσοστά.

Κορυφαίες διεργασίες. Κάτω από τα γραφήματα υπάρχουν δύο πίνακες με τις πέντε διεργασίες που καταναλώνουν την περισσότερη CPU:

  • «Διεργασίες στην τελευταία μέτρηση» — τι επιβάρυνε τον διακομιστή τη στιγμή του τελευταίου στιγμιότυπου (η ώρα αναγράφεται στην κεφαλίδα της κάρτας)·
  • «Διεργασίες στην κορύφωση της ημέρας» — οι ίδιες πέντε, αλλά από τη μέτρηση με το υψηλότερο Load Average των τελευταίων 24 ωρών. Αυτή είναι η απάντηση στο ερώτημα «τι ήταν εκείνο τη νύχτα», όταν η αιχμή στο γράφημα έχει προ πολλού περάσει.

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

Οι ίδιες οι διεργασίες της μέτρησης (ps, το σενάριο PHP της συλλογής και η αλυσίδα cron/sudo από πάνω) εξαιρούνται από τον κατάλογο — αλλιώς θα βρίσκονταν στην κορυφή κάθε στιγμιότυπου: το ps, τη στιγμή της εκκίνησης, δείχνει σχεδόν 100 % CPU. Οι υπόλοιπες εργασίες cron που έτρεξαν το ίδιο λεπτό εμφανίζονται κανονικά — ακριβώς γι’ αυτό υπάρχει ο πίνακας.

Ειδοποιήσεις φορτίου (ενότητα «Ρυθμίσεις» → «Ειδοποιήσεις φορτίου») — όταν ξεπεραστεί το όριο για CPU/RAM/δίσκο/inodes ο πίνακας στέλνει ειδοποίηση από όλα τα ενεργοποιημένα κανάλια (Telegram, Email, webhook, push — τα ίδια με την ημερήσια αναφορά· για τις ειδοποιήσεις δεν χρειάζεται να ενεργοποιηθεί κάτι επιπλέον) και άλλη μία όταν η μέτρηση επανέλθει στο φυσιολογικό. Όσο το όριο διατηρείται, δεν επαναλαμβάνει: η επόμενη ειδοποίηση έρχεται μόνο μετά από κύκλο «επανήλθε → ξεπεράστηκε ξανά».

Τα όρια ελέγχονται από το ίδιο το collect_metrics.php σε κάθε εκτέλεση (κάθε 5 λεπτά) — δεν χρειάζεται ξεχωριστό cron. Η κατάσταση «ήδη ειδοποιήσαμε / όχι ακόμη» αποθηκεύεται στο data/alerts_state.json, τα όρια — στις ρυθμίσεις του πίνακα.

32. Συμβάντα ασφάλειας (αισθητήρας κάθε 5 λεπτά)

Η ημερήσια αναφορά απαντά στο ερώτημα «πώς πάει ο διακομιστής». Ο αισθητήρας απαντά σε άλλο — «τι μόλις συνέβη». Κάθε 5 λεπτά ρωτά τις γρήγορες πηγές και καταγράφει μόνο ό,τι άλλαξε από τον προηγούμενο έλεγχο· η σελίδα «Συμβάντα ασφάλειας» στο μενού δείχνει τη λίστα των ευρημάτων.

Τους αργούς ελέγχους — Lynis, debsums, ενημερώσεις πακέτων, λήξη SSL — ο αισθητήρας δεν τους αγγίζει: οι αριθμοί τους έτσι κι αλλιώς αλλάζουν μία φορά την ημέρα και παραμένουν αρμοδιότητα της ημερήσιας αναφοράς.

Τι εντοπίζει — εννέα πηγές:

  • Fail2ban — νέοι αποκλεισμοί (συγκρίνεται ο κατάλογος των αποκλεισμένων διευθύνσεων, οπότε μια άρση αποκλεισμού δεν είναι συμβάν και ένας ισχύων αποκλεισμός αναφέρεται ακριβώς μία φορά)·
  • CrowdSec — νέες αποφάσεις·
  • Falco — συμβάντα επιπέδου Emergency, Alert και Critical·
  • Suricata — νέες ειδοποιήσεις· η σήμανση [Priority: 1] ανεβάζει το εύρημα σε κρίσιμο·
  • ClamAV — νέες γραμμές FOUND στο αρχείο καταγραφής της σάρωσης·
  • AIDE — αλλαγές αρχείων σύμφωνα με τον τελευταίο έλεγχο (δηλαδή όχι συχνότερα από όσο εκείνος εκτελείται βάσει του δικού του προγράμματος)·
  • SSH — επιτυχής σύνδεση ως root (κρίσιμο) και σύνδεση από διεύθυνση που δεν είχε εμφανιστεί ξανά (προειδοποίηση)·
  • Υπηρεσίες προστασίας — UFW, Fail2ban, CrowdSec, Suricata, Falco: ένα μήνυμα όταν μια υπηρεσία σταματά και ένα όταν λειτουργεί ξανά·
  • Θύρες — θύρα που έγινε προσβάσιμη από έξω· αν πίσω της βρίσκεται βάση δεδομένων ή cache, το εύρημα είναι κρίσιμο.

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

Ο πρώτος έλεγχος δεν στέλνει τίποτα. Κάθε πηγή κρατά μια σήμανση «ως πού έχει ήδη διαβαστεί» (αρχείο data/secwatch_state.json) και το πρώτο πέρασμα απλώς γράφει αυτή τη σήμανση. Διαφορετικά, με την ενεργοποίηση της παρακολούθησης θα ερχόταν ειδοποίηση για όλα όσα έχουν συσσωρευτεί στα αρχεία καταγραφής επί μήνες.

Ρύθμιση — «Ρυθμίσεις» → «Παρακολούθηση συμβάντων»:

  • Ενεργοποίηση της παρακολούθησης — όσο είναι κλειστή, η εργασία cron τρέχει στο κενό και η λίστα δεν γεμίζει·
  • Ειδοποίηση από — «Προειδοποίηση» ή «Κρίσιμο». Τα ευρήματα κάτω από το όριο μπαίνουν έτσι κι αλλιώς στη λίστα, αλλά όχι στις ειδοποιήσεις·
  • Παύση, λεπτά — το ελάχιστο διάστημα ανάμεσα σε ειδοποιήσεις, εξ ορισμού 15·
  • Ώρες ησυχίας — παράθυρο στη μορφή 23-7, κατά το οποίο οι προειδοποιήσεις δεν αποστέλλονται.
Τα κρίσιμα ευρήματα φεύγουν αμέσως — δεν τα κρατά ούτε η παύση ούτε οι ώρες ησυχίας: γι’ αυτά ακριβώς υπάρχει αισθητήρας ανά 5 λεπτά. Υπάρχει ωστόσο ασφαλιστική δικλείδα: το πολύ 6 ειδοποιήσεις την ώρα, για την περίπτωση που κάποια πηγή αρχίσει να «αναβοσβήνει».

Οι ειδοποιήσεις πηγαίνουν από τα ίδια κανάλια με την ημερήσια αναφορά (Telegram, Email, webhook, push) — δεν χρειάζεται να ενεργοποιηθεί κάτι επιπλέον. Όλα τα ευρήματα γράφονται στη λίστα ανεξάρτητα από το αν στάλθηκε ειδοποίηση, και διατηρούνται 90 ημέρες.

Η λίστα συμβάντων. Φίλτρα: περίοδος (24 ώρες, 7, 30 ή 90 ημέρες), σημαντικότητα και πηγή· εμφανίζονται οι τελευταίες 500 εγγραφές. Το κουμπί «Έλεγχος τώρα» εκτελεί ακριβώς το ίδιο πέρασμα με το cron — βολικό αμέσως μετά τη ρύθμιση, για να μην περιμένετε πέντε λεπτά· αναφέρει επίσης τον λόγο όταν δεν στάλθηκε ειδοποίηση («κάτω από το όριο σημαντικότητας», «ώρες ησυχίας», «δεν έχει ρυθμιστεί κανένα κανάλι ειδοποιήσεων»). Ο κόκκινος μετρητής δίπλα στο στοιχείο του μενού είναι ο αριθμός των κρίσιμων συμβάντων των τελευταίων 24 ωρών.

Η κάρτα διεύθυνσης. Ένα κλικ σε γραμμή της λίστας συμβάντων ή του μπλοκ Συσχετισμένες διευθύνσεις ανοίγει όσα είναι γνωστά για μία διεύθυνση: το χρονολόγιο των συμβάντων της, τη χώρα και, στην πρώτη γραμμή, ένα συμπέρασμα. Η γραμμή της λίστας ανοίγει την κάρτα όταν το συμβάν αφορά ακριβώς μία διεύθυνση· αν αναφέρει περισσότερες, σύνδεσμοι είναι οι ίδιες οι διευθύνσεις μέσα στη γραμμή. Τα συμπεράσματα είναι τέσσερα:

  • Πιθανή πρόσβαση — από τη διεύθυνση έγινε επιτυχής σύνδεση και η ίδια διεύθυνση είχε εντοπιστεί και από άλλες άμυνες, ή αμέσως μετά ενεργοποιήθηκαν το AIDE, το ClamAV ή άνοιξε νέα θύρα. Η μόνη περίπτωση που αξίζει άμεσο έλεγχο·
  • Σύνδεση από αυτή τη διεύθυνση — υπάρχει σύνδεση και τίποτε άλλο. Συνήθως είναι ο ιδιοκτήτης από νέο μέρος, γι αυτό η κάρτα δεν βάφεται κόκκινη·
  • Αποκλεισμένη — η διεύθυνση εντοπίστηκε και αποκλείστηκε: η άμυνα έκανε τη δουλειά της, δεν χρειάζεται τίποτε·
  • Χρειάζεται έλεγχο — υπάρχουν ανιχνεύσεις αλλά όχι αποκλεισμός. Αν η διεύθυνση επανέρχεται, κλείστε την χειροκίνητα.

Κάτω από το χρονολόγιο βρίσκεται το μπλοκ Τι συνέβαινε στον διακομιστή την ίδια ώρα: συμβάντα που δεν έχουν καθόλου διεύθυνση. Το AIDE δεν ξέρει ποιος άλλαξε το αρχείο, το ClamAV δεν ξέρει ποιος έφερε το μολυσμένο. Εμφανίζονται όσα εμπίπτουν στη δράση της διεύθυνσης και στις έξι ώρες μετά. Ακριβώς η σύνδεση μαζί με ό,τι ακολούθησε ξεχωρίζει την απόπειρα από την πραγματική πρόσβαση.

Η συσχέτιση γίνεται με βάση τη διεύθυνση. Ένας επιτιθέμενος που αλλάζει διεύθυνση τη σπάει. Η κάρτα δείχνει τι είδαν οι άμυνες και δεν αναλαμβάνει να ξεχωρίσει μια παραβίαση από τη δική σας σύνδεση από νέο μέρος.

Πρόγραμμα. Η εργασία μπαίνει στο crontab του root (sudo crontab -e), με μετατόπιση 2 λεπτών από τη συλλογή μετρήσεων, ώστε οι δύο να μην ξεκινούν ταυτόχρονα:

# κάθε 5 λεπτά — έλεγχος των συμβάντων ασφάλειας 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Εκτελείτε τον έλεγχο μόνο μέσω του wrapper, ποτέ απευθείας με php cron/security_watch.php. Το wrapper βρίσκει όλες τις εγκαταστάσεις του πίνακα στον διακομιστή και εκτελεί τον έλεγχο εκ μέρους του ιδιοκτήτη του ιστότοπου — με ακριβώς τα δικαιώματα sudo που χρησιμοποιεί ο πίνακας από τον ιστό. Μια απευθείας κλήση από το crontab του root θα δημιουργούσε το αρχείο κατάστασης data/secwatch_state.json με ιδιοκτήτη τον root, και το κουμπί «Έλεγχος τώρα» θα έπαυε να λειτουργεί.
Αν ο διακομιστής ετοιμάστηκε με την αυτόματη εγκατάσταση, η εργασία έχει ήδη προστεθεί — μένει μόνο να ενεργοποιήσετε την παρακολούθηση στις ρυθμίσεις.

33. Διακομιστής web: αιτήματα και κωδικοί απόκρισης

Η σελίδα «Διακομιστής web» αναλύει το αρχείο καταγραφής προσπελάσεων και δείχνει πόσα αιτήματα υπήρξαν, ποιο μέρος τους κατέληξε σε σφάλμα και ποιος τα έκανε. Το ModSecurity απαντά στο ερώτημα «τι μπλοκαρίστηκε», αυτή η σελίδα στο ερώτημα «τι έφτασε γενικά στον ιστότοπο».

Τι φαίνεται: αριθμός αιτημάτων, RPS, ποσοστό σφαλμάτων, ξεχωριστός μετρητής 5xx και ο όγκος που στάλθηκε· γράφημα αιτημάτων ανά ώρα· κατανομή των κωδικών 2xx/3xx/4xx/5xx· συχνές διευθύνσεις, συχνές IP, συχνά σφάλματα (κωδικός συν διαδρομή) και πελάτες (User-Agent). Περίοδος: 24 ώρες ή 7 ημέρες.

Πηγή είναι το αρχείο καταγραφής προσπελάσεων σε μορφή combined, οπότε ταιριάζουν και ο Nginx και ο Apache, και δεν χρειάζεται πρόσθετο άρθρωμα. Ο πίνακας αναζητά το αρχείο καταγραφής ανάμεσα στα τυπικά αρχεία:

  • /var/log/nginx/access.log
  • /var/log/apache2/access.log
  • /var/log/apache2/other_vhosts_access.log
  • /var/log/httpd/access_log

Εκτός από αυτά, ο πίνακας ελέγχει τα αρχεία *access*.log και *requests*.log στους καταλόγους /var/log/nginx/, /var/log/apache2/ και /var/log/httpd/. Έτσι βρίσκεται και το αρχείο καταγραφής που ένας ιστότοπος γράφει σε δικό του αρχείο με την οδηγία CustomLog — για παράδειγμα το arciveo-monitor_requests.log, που δημιουργεί ο εγκαταστάτης του Arcivéo.

Διαβάζεται μόνο ένα αρχείο καταγραφής: όταν ο Nginx βρίσκεται μπροστά από τον Apache, η άθροιση δύο αρχείων θα μετρούσε κάθε αίτημα δύο φορές. Λαμβάνεται το πρώτο αρχείο της παραπάνω λίστας στο οποίο έγινε εγγραφή το τελευταίο εικοσιτετράωρο (όσα βρέθηκαν μέσω μοτίβου ονόματος δοκιμάζονται μετά, από το νεότερο)· αν δεν έγινε εγγραφή σε κανένα για ένα εικοσιτετράωρο, λαμβάνεται το πιο πρόσφατο μη κενό. Έτσι, ένα αρχείο που άδειασε από το logrotate ή έμεινε από σταματημένο διακομιστή web δεν κρύβει πια το ενεργό. Διαβάζεται το τελευταίο τμήμα του αρχείου (3 MB) και το αποτέλεσμα αποθηκεύεται προσωρινά για 5 λεπτά — σε φορτωμένο ιστότοπο η επιλεγμένη περίοδος μπορεί λοιπόν να μην καλύπτεται πλήρως· η πραγματική κάλυψη αναγράφεται πάνω από το γράφημα.

«Ο πίνακας δεν μπορεί να διαβάσει το αρχείο καταγραφής του διακομιστή web». Η αιτία είναι σχεδόν πάντα τα δικαιώματα: τα αρχεία καταγραφής και ο κατάλογός τους ανήκουν στην ομάδα adm, και ο χρήστης του web δεν ανήκει σε αυτήν. Ο εγκαταστάτης του Arcivéo τον προσθέτει σε αυτή την ομάδα· μετά από χειροκίνητη εγκατάσταση βοηθά ένα μικρό wrapper του root, στο οποίο επιτρέπεται ένα ακριβώς πράγμα — να εμφανίζει το αρχείο καταγραφής (η σελίδα του ModSecurity λειτουργεί με τον ίδιο τρόπο). Το wrapper επιλέγει το αρχείο με τους ίδιους κανόνες με τον πίνακα. Η εντολή εμφανίζεται στην ίδια τη σελίδα· ορίστε και εδώ. Επικολλήστε την ολόκληρη — είναι μία εντολή:
sudo tee /usr/local/bin/monitor-weblog >/dev/null <<'EOF' && sudo chmod 755 /usr/local/bin/monitor-weblog && echo 'www-data ALL=(root) NOPASSWD: /usr/local/bin/monitor-weblog' | sudo tee /etc/sudoers.d/monitor-weblog >/dev/null && sudo visudo -c #!/bin/sh L="/var/log/nginx/access.log /var/log/apache2/access.log /var/log/apache2/other_vhosts_access.log /var/log/httpd/access_log $(ls -t /var/log/nginx/*access*.log /var/log/apache2/*access*.log /var/log/apache2/*requests*.log /var/log/httpd/*access_log 2>/dev/null)" for f in $L; do [ -r "$f" ] && [ -n "$(find "$f" -size +0 -mmin -1440 2>/dev/null)" ] && exec tail -c 3000000 "$f"; done for f in $(ls -t $L 2>/dev/null); do [ -r "$f" ] && [ -s "$f" ] && exec tail -c 3000000 "$f"; done EOF

Ο χρήστης του web μπορεί να διαφέρει από τον www-data — ελέγξτε με ποιον χρήστη τρέχει η δεξαμενή PHP-FPM του ιστότοπου (ps -o user= -C php-fpm) και βάλτε τον στη γραμμή του sudoers. Αν το όνομα του αρχείου καταγραφής δεν περιέχει ούτε access ούτε requests, προσθέστε τη διαδρομή του στην αρχή της γραμμής L=… μέσα στο wrapper.

«Δεν υπάρχουν εγγραφές για την επιλεγμένη περίοδο» — το αρχείο διαβάστηκε, αλλά δεν βρέθηκαν κατάλληλες γραμμές: είτε ο ιστότοπος πράγματι δεν άνοιξε, είτε το αρχείο μόλις εναλλάχθηκε (logrotate) και ξεκινά από την αρχή.

Απόπειρες γνωστών exploits. Ο πίνακας ελέγχου συγκρίνει τα αιτήματα του αρχείου καταγραφής με τις υπογραφές περίπου είκοσι διαδεδομένων exploits: PHP-CGI, διάσχιση καταλόγων στον Apache, PHPUnit, Log4Shell, ευπάθειες δρομολογητών, καμερών και πυλών VPN. Για κάθε απόπειρα απαντά αν μπορεί να λειτουργήσει σε αυτόν τον server και στηρίζεται σε γεγονότα: τις εγκατεστημένες εκδόσεις του Apache και της PHP, την ύπαρξη Java και τον κωδικό με τον οποίο ο server απάντησε στο αίτημα του αρχείου. Με κόκκινο σημειώνεται μόνο ό,τι μπορεί πραγματικά να λειτουργήσει.

Θωράκιση του web server. Ο πίνακας ελέγχου ζητά κάθε ιστότοπο του server μέσω 127.0.0.1 και ελέγχει τι λαμβάνει ο επισκέπτης: αν φαίνονται οι εκδόσεις του web server και της PHP, αν η μέθοδος TRACE είναι ενεργή και αν υπάρχουν οι προστατευτικές κεφαλίδες Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy και Content-Security-Policy. Οι ιστότοποι λαμβάνονται από τη διεύθυνση στην οποία ανοίγει ο πίνακας και από τα αρχεία των εικονικών κεντρικών υπολογιστών, αν ο πίνακας μπορεί να τα διαβάσει. Το αποτέλεσμα ανανεώνεται κάθε 10 λεπτά.

Αν κάτι λείπει, κάτω από τον πίνακα εμφανίζεται μία εντολή. Δημιουργεί ξεχωριστό αρχείο, zz-arciveo-hardening.conf, και επαναφορτώνει τον web server μόνο αφού περάσει ο έλεγχος ρυθμίσεων· οι κεφαλίδες που ο ιστότοπος ήδη στέλνει δεν διπλασιάζονται. Το CSP δεν προτείνεται ως μία γραμμή: η πολιτική φτιάχνεται για τον συγκεκριμένο ιστότοπο, αλλιώς σταματά να φορτώνει τα δικά του scripts, στυλ και γραμματοσειρές. Αναίρεση της αλλαγής στον Apache:

sudo a2disconf zz-arciveo-hardening && sudo systemctl reload apache2
Η υπογραφή στις σελίδες σφάλματος (ServerSignature) δεν επισημαίνεται όταν η έκδοση του web server είναι ήδη κρυφή: χωρίς έκδοση δείχνει μόνο το όνομα του server και το όνομα του κεντρικού υπολογιστή.

34. Χάρτης επιθέσεων (GeoIP)

Η σελίδα «Χάρτης επιθέσεων» εντοπίζει τη χώρα από την IP με την εντολή geoiplookup. Χωρίς το πακέτο GeoIP δεν εντοπίζονται οι χώρες και δεν εμφανίζονται σημεία στον χάρτη:

sudo apt install geoip-bin geoip-database # Έλεγχος: geoiplookup 8.8.8.8
Δεν απαιτείται sudo — η βάση /usr/share/GeoIP/GeoIP.dat είναι αναγνώσιμη από όλους, τα αποτελέσματα αποθηκεύονται προσωρινά στο tmp/geoip_cache.json. Ο ίδιος ο χάρτης (Leaflet + πλακίδια OpenStreetMap) φορτώνεται στο πρόγραμμα περιήγησης — χρειάζεται σύνδεση στο διαδίκτυο στον υπολογιστή όπου είναι ανοιχτός ο πίνακας.

35. Εξωτερική έκθεση, ενημερώσεις και αυτόματες ενημερώσεις

Δύο ενσωματωμένες κάρτες του dashboard που δείχνουν όχι το «ενεργό/ανενεργό» ενός εργαλείου, αλλά την πραγματική προστασία του διακομιστή. Δεν χρειάζονται εγκατάσταση, διαβάζονται τοπικά χωρίς sudo.

Εξωτερική έκθεση — πόσες υπηρεσίες ακούν σε όλες τις διεπαφές (0.0.0.0/[::]) και είναι προσβάσιμες από έξω. Επισημαίνει με κόκκινο αν εκτίθενται προς τα έξω βάσεις δεδομένων ή cache (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) — είναι άμεση τρύπα (−10 στη Βαθμολογία ασφάλειας). Πηγή: ss -tuln.

Αν η κάρτα είναι κόκκινη — κλείστε τη βάση δεδομένων προς τον έξω κόσμο: δέστε την στο 127.0.0.1 (bind-address στη ρύθμιση του MySQL/PostgreSQL, bind 127.0.0.1 στο Redis) ή κλείστε τη θύρα στο UFW.
«Ανοιχτή θύρα» ≠ «προσβάσιμη από έξω». Μια υπηρεσία που ακούει στο 127.0.0.1 (loopback) είναι ορατή μόνο στον ίδιο τον διακομιστή — από έξω δεν την προσεγγίζεις, ακόμη κι αν η θύρα είναι «ανοιχτή». Γι' αυτό το Postfix στη θύρα 25, δεμένο στο loopback, είναι ασφαλές: η αυτόματη ρύθμιση ορίζει inet_interfaces = loopback-only (συν ουδέτερο smtpd_banner — κλείνει την παρατήρηση MAIL-8818 του Lynis για την αποκάλυψη έκδοσης). Η κάρτα «Εξωτερική έκθεση» θεωρεί εκτεθειμένο προς τα έξω μόνο ό,τι ακούει στο 0.0.0.0/[::]· οι υπηρεσίες loopback δεν συμπεριλαμβάνονται.
Lynis MAIL-8818 χειροκίνητα (αν στήσατε το mail μόνοι σας): στο /etc/postfix/main.cf ορίστε smtpd_banner = $myhostname ESMTP (χωρίς έκδοση και ΛΣ) και inet_interfaces = loopback-only, μετά sudo systemctl restart postfix.

Ενημερώσεις ασφαλείας — πόσα security patch περιμένουν εγκατάσταση και αν χρειάζεται επανεκκίνηση μετά την ενημέρωση του πυρήνα (−5 στη Βαθμολογία ασφάλειας όταν υπάρχουν patch). Πηγή: /usr/lib/update-notifier/apt-check, αρχείο /var/run/reboot-required. Αναλυτική λίστα — στη σελίδα «Ενημερώσεις ασφαλείας».

# Εγκατάσταση ενημερώσεων: sudo apt update && sudo apt upgrade # Έλεγχος τι ακούει προς τα έξω: ss -tuln | grep -E '0\.0\.0\.0|\[::\]'
Η κάρτα ενημερώσεων λειτουργεί σε Ubuntu/Debian (update-notifier-common). Αν λείπει το apt-check — η μονάδα μετρά τα patch μέσω apt-get -s upgrade.

Αυτόματες ενημερώσεις ασφαλείας (unattended-upgrades) — στη σελίδα «Ενημερώσεις ασφαλείας» μια ξεχωριστή κάρτα δείχνει αν είναι ενεργή η αυτόματη εγκατάσταση των security patch και πότε εκτελέστηκε τελευταία φορά. Δεν χρειάζεται sudo — η κατάσταση διαβάζεται μέσω apt-config dump.

sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # ενεργοποίηση # Έλεγχος τι είναι ενεργό: apt-config dump | grep Unattended-Upgrade

Συντήρηση

36. Αντίγραφα ασφαλείας

Το backup είναι η βασική ασφάλεια: η απώλεια δεδομένων είναι χειρότερη από κάθε παραβίαση. Χρειάζονται δύο πράγματα — backup του διακομιστή/των ιστότοπων και ξεχωριστά backup της ΒΔ του πίνακα (εκεί βρίσκονται χρήστες, κλειδιά WebAuthn, ρυθμίσεις, άδεια).

Επιλογή A — HestiaCP: καρτέλα Backup στον χρήστη → κουμπί δημιουργίας backup (ή προγραμματισμένα στις ρυθμίσεις του διακομιστή). Το backup περιλαμβάνει ιστότοπους και τις ΒΔ τους.

Επιλογή B — χειροκίνητα (cron): dump της ΒΔ + αρχειοθέτηση του καταλόγου data/ του πίνακα:

# root-cron (sudo crontab -e) — καθημερινό backup στις 2:30 (βάλτε τα δικά σας ονόματα/διαδρομές): 30 2 * * * mysqldump -u root MY_DB | gzip > /var/backups/monitor-db-$(date +\%F).sql.gz 40 2 * * * tar czf /var/backups/monitor-data-$(date +\%F).tar.gz -C /path/to/monitor data # Διαγραφή αρχείων παλαιότερων των 14 ημερών: 0 3 * * * find /var/backups -name 'monitor-*' -mtime +14 -delete
Το backup στον ίδιο διακομιστή σας σώζει από λάθη, αλλά όχι από απώλεια του διακομιστή. Αντιγράφετε τα αρχεία σε εξωτερικό χώρο αποθήκευσης (άλλος διακομιστής, S3, rclone στο cloud). Ελέγχετε ότι η επαναφορά πράγματι λειτουργεί.

37. Ενημέρωση και μεταφορά του πίνακα

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

  • αντικατάσταση (κώδικας): public/, includes/, assets/, cron/, database/, καθώς και τα βασικά .htaccess (front controller — η δρομολόγηση δεν πρέπει να παραμένει από την παλιά έκδοση), manifest.json, sw.js;
  • μην αγγίξετε: config.php (δεδομένα ΒΔ), data/ (αναφορές), logs/, tmp/ (συνεδρίες και προσωρινή μνήμη).
# Μετά το ανέβασμα — καθαρίστε την cache της PHP (αν είναι ενεργό το opcache): sudo systemctl reload php*-fpm
Το FileZilla αναφέρει SSH_FX_PERMISSION_DENIED — Permission denied. Τα αρχεία του πίνακα ανήκουν στον www-data (έτσι ορίστηκαν κατά την εγκατάσταση), ενώ ο πελάτης SFTP συνδέεται με τον δικό σας χρήστη, που δεν έχει δικαίωμα εγγραφής. Το να δώσετε στον www-data ολόκληρο τον πίνακα «για να δουλέψει» είναι ακριβώς αυτό που οδηγεί σε αυτό το σφάλμα· παρακάτω τρεις τρόποι, οποιοσδήποτε λύνει το πρόβλημα.
# Παραλλαγή A (συνιστάται) — διαχωρίστε τους ιδιοκτήτες: ο κώδικας δικός σας, οι φάκελοι εργασίας του διακομιστή web. # Ο διακομιστής web δεν αποκτά καθόλου δικαίωμα εγγραφής στον ΚΩΔΙΚΑ του πίνακα: sudo chown -R deploy:www-data /path/to/monitor sudo chown -R www-data:www-data /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo find /path/to/monitor -type d -exec chmod 755 {} \; sudo find /path/to/monitor -type f -exec chmod 644 {} \; sudo chmod 750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo chmod 640 /path/to/monitor/config.php # Παραλλαγή B — ACL πάνω από τους τρέχοντες ιδιοκτήτες (δεν μεταφέρουμε τίποτα): sudo apt install -y acl sudo setfacl -R -m u:deploy:rwX /path/to/monitor sudo setfacl -R -d -m u:deploy:rwX /path/to/monitor # Παραλλαγή C — μέσω της ομάδας www-data. Πιο απλή, αλλά δικαίωμα εγγραφής στα # αρχεία του πίνακα αποκτά και ο διακομιστής web (με ευπάθεια στην PHP ο κώδικας αντικαθίσταται): sudo usermod -aG www-data deploy sudo find /path/to/monitor -type d -exec chmod 2775 {} \; sudo find /path/to/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /path/to/monitor/config.php sudo chmod 2750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs
Γιατί η παραλλαγή A είναι ασφαλής. Ο πίνακας γράφει μόνο σε τρεις καταλόγους — data/ (αναφορές), tmp/ (συνεδρίες και προσωρινή μνήμη), logs/· αυτοί παραμένουν στον www-data. Τα υπόλοιπα είναι κώδικας, και ο διακομιστής web τον χρειάζεται μόνο για ανάγνωση, την οποία δίνει η ομάδα www-data με δικαιώματα 644. Επιπλέον όφελος: με ευπάθεια στην PHP τα αρχεία του πίνακα δεν μπορούν πλέον να αντικατασταθούν. Στους πίνακες φιλοξενίας (HestiaCP και παρόμοιους) η παραλλαγή A δεν χρειάζεται: εκεί τα αρχεία του ιστότοπου ανήκουν έτσι κι αλλιώς στον λογαριασμό με τον οποίο συνδέεστε μέσω SFTP, ενώ ο διακομιστής web τα διαβάζει μέσω ομάδας.
Παγίδα της παραλλαγής B: κάθε επόμενο chmod στα αρχεία μηδενίζει τη μάσκα ACL, και η πρόσβαση χάνεται σιωπηλά. Αν μετά από «τακτοποίηση των δικαιωμάτων» το ανέβασμα σκοντάφτει ξανά σε Permission denied — επαναλάβετε και τις δύο εντολές setfacl.
Το bit 2 στην παραλλαγή C είναι το setgid: τα αρχεία που ανεβαίνουν μέσω SFTP παραμένουν στην ομάδα www-data, αλλιώς ο πίνακας δεν μπορεί να τα αντικαταστήσει. Μετά την παραλλαγή C συνδεθείτε ξανά στο FileZilla — η νέα ομάδα ισχύει μόνο σε νέα σύνδεση. Έλεγχος: id deploy (πρέπει να εμφανιστεί η ομάδα www-data) και ls -ld /path/to/monitor (drwxrwsr-x — το γράμμα s σημαίνει ότι το setgid είναι ενεργό).

Μεταφορά σε άλλον διακομιστή:

  1. Στον νέο διακομιστή στήστε τον ιστότοπο + HTTPS (δείτε τη σελίδα χειροκίνητης εγκατάστασης).
  2. Αντιγράψτε όλα τα αρχεία του πίνακα μαζί με τα config.php, data/.
  3. Μεταφέρετε τη ΒΔ: mysqldump στον παλιό → εισαγωγή στον νέο· διορθώστε τα δεδομένα ΒΔ στο config.php.
  4. Επαναλάβετε στον νέο διακομιστή: sudoers, συμμετοχή στην ομάδα adm, εργασίες cron.
  5. Η άδεια είναι συνδεδεμένη με τον τομέα — αν ο τομέας είναι ο ίδιος, το κλειδί θα συνεχίσει να λειτουργεί.

38. Δεύτερος ιστότοπος σε αυτόν τον διακομιστή (ακόμη ένα domain)

Ο πίνακας λειτουργεί ήδη και στον ίδιο διακομιστή χρειάζεται ακόμη ένας ιστότοπος — με δικό του domain δίπλα στον monitor. Μετά την αυτόματη εγκατάσταση ο διακομιστής είναι ένας συνηθισμένος Apache + PHP-FPM, οπότε ο ιστότοπος χρειάζεται τρία πράγματα: δικό του κατάλογο, δικό του vhost και δικό του πιστοποιητικό. Ο πίνακας δεν πειράζεται: παρακολουθεί ολόκληρο τον διακομιστή, δεύτερο αντίγραφο για το δεύτερο domain δεν χρειάζεται.

Η ενότητα αφορά διακομιστή χωρίς πίνακα φιλοξενίας. Αν είναι εγκατεστημένο το HestiaCP ή παρόμοιος πίνακας, προσθέστε το domain μέσα από αυτόν και όχι χειροκίνητα. Και αν σχεδιάζετε πολλούς ιστότοπους (μαζί και με email), εγκαταστήστε τον πίνακα πριν από την αυτόματη εγκατάσταση: το script τον εντοπίζει και περνά σε προσθετική λειτουργία, ενώ ένας πίνακας που εγκαθίσταται αργότερα ξαναχτίζει τη διαμόρφωση του Apache, του τείχους προστασίας και του email.
Τι αντικαθιστάτε στις εντολές. Το site2.example.com είναι η διεύθυνση του νέου ιστότοπου. Μπορεί να είναι είτε ξεχωριστό domain (mycompany.com) είτε υποτομέας (shop.mycompany.com) — για τον Apache δεν υπάρχει διαφορά, αλλάζουν μόνο η εγγραφή DNS (βήμα 1) και η έκδοση του πιστοποιητικού (βήμα 5). Το site2 είναι απλώς ένα σύντομο όνομα του ιστότοπου: έτσι ονομάζονται ο κατάλογος /var/www/site2 και το αρχείο διαμόρφωσης site2.conf. Με το domain δεν έχει καμία σχέση, ο Apache παίρνει τη διεύθυνση μόνο από το ServerName· το όνομα μπορεί να είναι οποιοδήποτε — για το shop.mycompany.com, π.χ., βολεύει το shop: κατάλογος /var/www/shop, διαμόρφωση shop.conf.

1. DNS. Στον πίνακα DNS του καταχωρητή σας δημιουργήστε μια εγγραφή A προς την IP αυτού του διακομιστή:

# Υποτομέας (shop.mycompany.com): Τύπος: A Όνομα: shop Τιμή: 203.0.113.10 TTL: 3600 # Ξεχωριστό domain (mycompany.com) — δύο εγγραφές, ώστε να δουλεύει και η διεύθυνση με www: Τύπος: A Όνομα: @ Τιμή: 203.0.113.10 TTL: 3600 Τύπος: A Όνομα: www Τιμή: 203.0.113.10 TTL: 3600

Μετά από λίγα λεπτά ελέγξτε: το dig +short site2.example.com πρέπει να επιστρέψει την IP του διακομιστή.

2. Κατάλογος του ιστότοπου.

sudo mkdir -p /var/www/site2 sudo chown -R www-data:www-data /var/www/site2

3. Το vhost. Το μπλοκ επικολλάται στο τερματικό ολόκληρο — η διαδρομή προς το socket του PHP-FPM εντοπίζεται μόνη της:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # αυτόματος εντοπισμός του socket PHP-FPM sudo tee /etc/apache2/sites-available/site2.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName site2.example.com # Ξεχωριστό domain: αφαιρέστε το # από την παρακάτω γραμμή, ώστε ο ιστότοπος να ανοίγει και με www. # Για υποτομέα η γραμμή δεν χρειάζεται. #ServerAlias www.site2.example.com DocumentRoot /var/www/site2 <Directory /var/www/site2> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/site2_error.log CustomLog ${APACHE_LOG_DIR}/site2_access.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/site2.conf

4. Ενεργοποιήστε τον ιστότοπο και ελέγξτε τη διαμόρφωση πριν την επαναφόρτωση:

sudo a2ensite site2.conf sudo apache2ctl configtest # αναμένεται: Syntax OK sudo systemctl reload apache2

5. SSL. Το certbot είναι ήδη εγκατεστημένο από την αυτόματη εγκατάσταση· σε αυτό το σημείο το DNS πρέπει να δείχνει στον διακομιστή:

# Υποτομέας — μία διεύθυνση: sudo certbot --apache -d site2.example.com # Ξεχωριστό domain — αμέσως και με www (και οι δύο εγγραφές A του βήματος 1 πρέπει να δείχνουν # στον διακομιστή και το www να βρίσκεται στο ServerAlias, αλλιώς το certbot δεν μπορεί να ελέγξει τη δεύτερη διεύθυνση): sudo certbot --apache -d site2.example.com -d www.site2.example.com

Το τρίτο και τα επόμενα domain προστίθενται με τον ίδιο τρόπο — επαναλάβετε τα βήματα 1–5 αλλάζοντας domain και κατάλογο.

Ποιος απαντά στα «ξένα» αιτήματα. Αν το Host δεν ταιριάζει με κανένα ServerName (επίσκεψη μέσω IP ή ξένο domain στραμμένο στον διακομιστή σας), ο Apache σερβίρει τον πρώτο αλφαβητικά ενεργοποιημένο ιστότοπο από το /etc/apache2/sites-enabled/. Το τυπικό 000-default το απενεργοποιεί η αυτόματη εγκατάσταση, οπότε αυτόν τον ρόλο «υπηρεσίας» τον κρατά το vhost του πίνακα (arciveo-monitor.conf) — στους ιστότοπους που ανοίγουν με το δικό τους όνομα αυτό δεν επηρεάζει. Αν θέλετε μέσω IP να ανοίγει άλλος ιστότοπος, ονομάστε το αρχείο του ώστε να προηγείται αλφαβητικά (για παράδειγμα 000-site2.conf).
Η προστασία ισχύει για ολόκληρο τον διακομιστή: UFW, Fail2ban, CrowdSec, ModSecurity και Suricata λειτουργούν ήδη και καλύπτουν αυτόματα τον νέο ιστότοπο, δεν χρειάζεται ξεχωριστή ρύθμιση. Οι θύρες 80/443 είναι επίσης ήδη ανοιχτές. Ο ιστότοπος έχει δικά του αρχεία καταγραφής: site2_error.log και site2_access.log στο /var/log/apache2/.
Μην τοποθετείτε τον κατάλογο του νέου ιστότοπου μέσα στον κατάλογο του πίνακα — η ρίζα web του πίνακα διέπεται από το δικό της .htaccess (front controller) και ένας ένθετος ιστότοπος θα σέρβιρε κάτι διαφορετικό από αυτό που περιμένετε. Κρατήστε τους ιστότοπους δίπλα δίπλα: /var/www/monitor, /var/www/site2.

39. Επαναφορά πρόσβασης (χαμένο κλειδί, κωδικός, μπλοκάρισμα IP)

Αν δεν μπορείτε να συνδεθείτε — όλα διορθώνονται απευθείας στη ΒΔ από τον διακομιστή. Ανοίξτε τη ΒΔ (το όνομα από το config.php):

sudo mysql MY_DB

Χάθηκε το κλειδί WebAuthn (δεν περνά ο δεύτερος παράγοντας) — απενεργοποιήστε το 2FA, συνδεθείτε με κωδικό και καταχωρίστε νέο κλειδί:

UPDATE users SET webauthn_enabled = 0;

Ξεχάσατε τον κωδικό — ορίστε νέο hash (δημιουργήστε τον στον διακομιστή και βάλτε τον):

# Δημιουργία hash νέου κωδικού: php -r "echo password_hash('NEW_PASSWORD', PASSWORD_BCRYPT), \"\n\";" # Στη ΒΔ (βάλτε το hash που πήρατε): # UPDATE users SET password = '$2y$10$...' WHERE username = 'admin';

Κλειδωθήκατε έξω με το φίλτρο IP — απενεργοποιήστε τον περιορισμό:

UPDATE settings SET value = '0' WHERE name = 'ip_restriction_enabled';
Πρόσβαση στη ΒΔ υπάρχει πάντα: sudo mysql στον διακομιστή, ή phpMyAdmin / η ενότητα ΒΔ στον πίνακα του hosting. Μετά την επαναφορά, ενεργοποιήστε ξανά το WebAuthn και το φίλτρο IP.

40. Όλες οι εργασίες cron σε ένα μέρος

Η σύνοψη των εργασιών βρίσκεται στο root-cron του διακομιστή (προστίθενται μέσω sudo crontab -e). Αφήστε μόνο τις γραμμές των εργαλείων που χρησιμοποιείτε· προσαρμόστε τις διαδρομές στον διακομιστή σας.

# Cron διακομιστή της μονάδας (root) — προσθέστε μέσω: sudo crontab -e # 01:30 — σάρωση ClamAV σε επικίνδυνες διαδρομές (web, home, temp) → κάρτες «Αρχεία που ελέγχθηκαν» και «Τελευταία σάρωση» 30 1 * * * /usr/local/bin/clamav-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 02:00 — έλεγχος ακεραιότητας αρχείων AIDE (απαιτείται ρητό --config) 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # κατά την εκκίνηση — επαναφορά δικαιωμάτων /var/lib/aide (το αρχείο tmpfiles του πακέτου # aide-common.conf τα επαναφέρει σε 0700 και το panel δεν βλέπει πλέον τη βάση) @reboot chmod 755 /var/lib/aide # 03:00 — έλεγχος ασφαλείας Lynis 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:00 — ενημέρωση λίστας αποκλεισμού ipsum (level 1) 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1 # το set ipsum κατά την εκκίνηση το φορτώνει η υπηρεσία ipsum-load.service (ΠΡΙΝ το firewall, αλλιώς # το UFW δεν θα δει το set στο before.rules) — δεν είναι cron. Εδώ μόνο η καθημερινή ανανέωση παραπάνω. # 06:00 — αναφορά Logwatch 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1 # κάθε 30 λεπτά — έλεγχος δίσκων SMART */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:30 — ακεραιότητα πακέτων debsums 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 08:00 — προγραμματισμένη αναφορά σε Email και Telegram 0 8 * * * /usr/local/bin/daily-report-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # κάθε ώρα — ανανέωση των λιστών πακέτων (για την κάρτα «Ενημερώσεις ασφαλείας») 0 * * * * /usr/bin/apt-get update -qq >/dev/null 2>&1 # κάθε 5 λεπτά — στιγμιότυπο πόρων (CPU/RAM/δίκτυο/δίσκος) για τη σελίδα «Απόδοση» */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # κάθε 5 λεπτά, με μετατόπιση από το στιγμιότυπο παραπάνω — αισθητήρας συμβάντων # ασφάλειας: νέοι αποκλεισμοί, ειδοποιήσεις IDS, σταματημένη προστασία, ανοιχτή θύρα. # Όσο η παρακολούθηση είναι κλειστή στις ρυθμίσεις, η εργασία δεν κάνει τίποτα. 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # κάθε 15 λεπτά — επισκόπηση του διακομιστή προς τον λογαριασμό, ώστε πολλοί # διακομιστές να φαίνονται σε έναν κατάλογο. Όσο η επισκόπηση είναι κλειστή, η εργασία δεν κάνει τίποτα. 3,18,33,48 * * * * /usr/local/bin/fleet-push-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Λεπτομέρειες για το καθένα — στις αντίστοιχες ενότητες. Οι εργασίες αντιγράφων ασφαλείας (προηγούμενη ενότητα) προστίθενται στο ίδιο cron. Μετά τις αλλαγές ελέγξτε: sudo crontab -l και ότι η υπηρεσία cron είναι ενεργή.
Η ώρα cron = ζώνη ώρας του διακομιστή, όχι το TIMEZONE από το config.php. Η σταθερά TIMEZONE επηρεάζει μόνο την PHP (πώς το panel εμφανίζει τις ημερομηνίες), αλλά ο δαίμονας cron εκτελεί τις εργασίες με βάση την ώρα του συστήματος του λειτουργικού. Αν η ζώνη του διακομιστή δεν συμπίπτει με τη δική σας, η αναφορά «08:00» θα φτάσει σε λάθος ώρα. Παράδειγμα: ο διακομιστής βρίσκεται σε άλλη ζώνη (Europe/Berlin, UTC+2) και εσείς στην Αθήνα (UTC+3) → η αναφορά «08:00» θα φτάσει στις 09:00 για εσάς. Ελέγξτε και, αν χρειάζεται, ρυθμίστε τη ζώνη του συστήματος στη δική σας:
# Έλεγχος τρέχουσας ζώνης διακομιστή: timedatectl # Ορισμός δικής σας ζώνης (παράδειγμα) και επανεκκίνηση του cron: sudo timedatectl set-timezone Europe/Athens sudo systemctl restart cron
Μετά από αυτό η γραμμή 0 8 * * * θα εκτελεστεί στις 08:00 τοπική ώρα. Διαφορετικά θα έπρεπε να μετατοπίζετε το ίδιο το cron, αλλά με τη μετάβαση σε χειμερινή/θερινή ώρα η μετατόπιση θα ξαναχαλάσει — γι' αυτό είναι σωστότερο να ρυθμίσετε τη ζώνη του συστήματος.
Έτοιμα scripts-περιτυλίγματα. Τα λειτουργικά τους αντίγραφα και ένα δείγμα crontab (crontab.txt) βρίσκονται στον φάκελο system/ δίπλα στο έργο, εκτός του public_html. Αυτό δεν είναι μέρος του ιστότοπου — δεν χρειάζεται να τα ανεβάσετε στο web-root· τοποθετήστε τα στον διακομιστή στις διαδρομές του συστήματος (όπως στο crontab παραπάνω):
  • lynis-scan.sh → /usr/local/bin/ (chmod +x) — εκτελεί lynis audit system, κατά τη σάρωση θέτει το flag /tmp/lynis-running και αντιγράφει το lynis-report.dat στο data/lynis/ του panel·
  • logwatch_daily.sh → /usr/local/bin/ (chmod +x) — δημιουργεί την καθημερινή αναφορά Logwatch (sshd, fail2ban, sudo, postfix) στο data/logwatch/·
  • smart-scan.sh → /usr/local/bin/ (chmod +x) — καταγράφει την κατάσταση των δίσκων (smartctl) στο data/disk/·
  • debsums-scan.sh → /usr/local/bin/ (chmod +x) — ελέγχει την ακεραιότητα των πακέτων (debsums) στο data/debsums/·
  • clamav-scan.sh → /usr/local/bin/ (chmod +x) — σάρωση antivirus ClamAV σε επικίνδυνες διαδρομές (web, home, temp)· γράφει τη σύνοψη στο /var/log/clamav/scan.log, από όπου τη διαβάζει η σελίδα ClamAV (γραμμή 01:30 στο crontab παραπάνω)·
  • load-ipsum.sh → /usr/local/bin/ (chmod +x) — ενημερώνει το σύνολο ipset ipsum (level 1) επιτόπου, χωρίς να σπάει τους ενεργούς κανόνες του firewall (γραμμή 04:00 στο crontab παραπάνω)·
  • daily-report-all.sh → /usr/local/bin/ (chmod +x) — εκτελεί την αναφορά cron/daily_report.php του panel (γραμμή 08:00 στο crontab παραπάνω)·
  • daily_report.php — περιλαμβάνεται ήδη στο panel (cron/daily_report.php), εκτελείται μέσω daily-report-all.sh, δεν χρειάζεται ξεχωριστή εγκατάσταση·
  • collect-metrics-all.sh → /usr/local/bin/ (chmod +x) — εκτελεί το cron/collect_metrics.php του panel (σελίδα «Απόδοση», γραμμή */5 στο crontab παραπάνω)· το collect_metrics.php περιλαμβάνεται ήδη στο panel, δεν χρειάζεται ξεχωριστή εγκατάσταση·
  • security-watch-all.sh → /usr/local/bin/ (chmod +x) — εκτελεί το cron/security_watch.php του πίνακα εκ μέρους του ιδιοκτήτη του ιστότοπου (σελίδα «Συμβάντα ασφάλειας», γραμμή 2-57/5 στο crontab παραπάνω)· το security_watch.php περιλαμβάνεται ήδη στον πίνακα και δεν εγκαθίσταται ξεχωριστά·
  • fleet-push-all.sh → /usr/local/bin/ (chmod +x) — στέλνει την επισκόπηση του διακομιστή στον λογαριασμό μέσω του cron/fleet_push.php του πίνακα (γραμμή 3,18,33,48 παραπάνω)·
  • crontab.txt (system/cron/) — δείγμα εργασιών· προσθέστε τις γραμμές που χρειάζεστε μέσω sudo crontab -e.
Η διαδρομή προς το script στο crontab πρέπει να συμπίπτει με αυτή όπου το τοποθετήσατε.
Πώς να τοποθετήσετε ένα script στο /usr/local/bin/. Απευθείας από το FileZilla δεν μπορείτε να γράψετε εκεί — ο κατάλογος ανήκει στον root και ο SFTP-client θα λάβει SSH_FX_PERMISSION_DENIED. Η σειρά είναι η εξής: πρώτα ανεβάστε το αρχείο στο /tmp (εκεί γράφουν όλοι), μετά μεταφέρετέ το στη θέση του με μία εντολή:
# στο FileZilla: στο πεδίο «Απομακρυσμένος ιστότοπος» εισαγάγετε /tmp και ανεβάστε εκεί το script, # μετά μέσω SSH (το install ορίζει αμέσως ιδιοκτήτη και δικαιώματα, δεν χρειάζονται chown/chmod): sudo install -o root -g root -m 755 /tmp/lynis-scan.sh /usr/local/bin/lynis-scan.sh rm -f /tmp/lynis-scan.sh # έλεγχος: το αρχείο στη θέση του, δικαιώματα rwxr-xr-x, σύνταξη ακέραιη bash -n /usr/local/bin/lynis-scan.sh && ls -l /usr/local/bin/lynis-scan.sh
Μην μπερδέψετε τους καταλόγους: χρειάζεστε το /tmp στη ρίζα του διακομιστή — όχι το /var/tmp ούτε το tmp/ μέσα στο ίδιο το panel (το τελευταίο ανήκει στον www-data και είναι κλειστό για τον χρήστη σας). Στο δέντρο του FileZilla το /tmp είναι κλάδος ανώτατου επιπέδου, δίπλα στο var, όχι μέσα σε αυτό.
Στήσατε τον διακομιστή με αυτόματη ρύθμιση; Αυτά τα περιτυλίγματα και οι εργασίες cron τους είναι ήδη εγκατεστημένα από το script (στο /usr/local/bin/, log — /var/log/arciveo-cron.log) — δεν χρειάζεται να κάνετε τίποτα χειροκίνητα.
Πού ψάχνουν τα scripts το panel. Τα περιτυλίγματα είναι ανεξάρτητα από domain: εντοπίζουν τις εγκαταστάσεις του panel σαρώνοντας τα /home/*/web/*/public_html και /var/www/*, και τοποθετούν τις αναφορές στο data/ τους. Αν το panel βρίσκεται σε άλλη διαδρομή — προσθέστε τη στη γραμμή for app in … μέσα στα scripts, αλλιώς οι αναφορές Lynis/SMART/debsums/Logwatch δεν θα φτάσουν στο panel.
cron.log και δικαιώματα πρόσβασης. Το αρχείο logs/cron.log το δημιουργεί πρώτο το root-cron — θα ανήκει στον root, και η καρτέλα «Αρχείο καταγραφής cron» στο panel δεν θα μπορεί ούτε να το διαβάσει ούτε να το καθαρίσει. Δημιουργήστε το αρχείο εκ των προτέρων ως χρήστης web (ιδιοκτήτης του καταλόγου του ιστότοπου· στο HestiaCP είναι ο λογαριασμός, π.χ. admin) — τότε το root-cron θα προσθέτει μόνο εγγραφές, χωρίς να αλλάζει τον ιδιοκτήτη:
# δημιουργία εκ των προτέρων ως χρήστης web (πριν την προσθήκη των γραμμών cron): sudo -u OWNER touch /path/to/monitor/logs/cron.log # αν το cron.log έχει ήδη δημιουργηθεί από το root-cron — αναθέστε το στον χρήστη web: sudo chown OWNER:OWNER /path/to/monitor/logs/cron.log sudo chmod 644 /path/to/monitor/logs/cron.log
Δείτε τον ιδιοκτήτη του καταλόγου: stat -c %U /path/to/monitor.
Διαχείριση από το panel. Στην ενότητα «Σύστημα» υπάρχει η σελίδα «Crontab» — μπορείτε να δείτε και να προσθέσετε εργασίες χωρίς SSH. Το panel επεξεργάζεται μόνο τις εργασίες που προστέθηκαν μέσω αυτού (ξεχωριστό μπλοκ στο root-crontab, σημειωμένο με ειδικά σχόλια)· ό,τι υπάρχει ήδη στο crontab (λίστα παραπάνω) εμφανίζεται εκεί ως λίστα read-only «Λοιπές εργασίες διακομιστή» με το κουμπί «Αντιγραφή στον επεξεργαστή» — αυτό απλώς μεταφέρει το πρόγραμμα/εντολή στη φόρμα προσθήκης, χωρίς να αγγίζει την αρχική γραμμή. Για να «περάσετε» μια υπάρχουσα εργασία υπό τη διαχείριση του panel — αντιγράψτε τη στον επεξεργαστή, αποθηκεύστε, μετά διαγράψτε χειροκίνητα την παλιά γραμμή (sudo crontab -e), αλλιώς θα εκτελείται δύο φορές.
Εφάπαξ ρύθμιση στον διακομιστή. Η σελίδα χρειάζεται ένα προνομιακό script-περιτύλιγμα — όχι σκέτο sudo crontab (αυτό θα ήταν άμεση κλιμάκωση σε root από οποιονδήποτε αποκτούσε πρόσβαση στη συνεδρία του panel), αλλά ένα στενό script με δύο εντολές (list/set), που αγγίζει μόνο το δικό του μπλοκ ανάμεσα στα ειδικά σχόλια. Εγκαταστήστε το μία φορά:
sudo install -m 0755 -o root -g root /dev/stdin /usr/local/sbin/arciveo-cron <<'ARCIVEO_CRON_EOF' #!/bin/bash set -euo pipefail BEGIN='# >>> ARCIVEO-CRON-MANAGED (edited from the panel; do not edit by hand) >>>' END='# <<< ARCIVEO-CRON-MANAGED <<<' cmd=${1:-} case "$cmd" in list) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} list" >&2; exit 2; } crontab -l -u root 2>/dev/null || true ;; set) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} set (body on stdin)" >&2; exit 2; } body=$(cat) if grep -qF "$BEGIN" <<<"$body" || grep -qF "$END" <<<"$body"; then echo "invalid body: markers not allowed" >&2; exit 2 fi current=$(crontab -l -u root 2>/dev/null || true) tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT { if grep -qF "$BEGIN" <<<"$current"; then awk -v b="$BEGIN" '{print} $0==b{exit}' <<<"$current" else [ -n "$current" ] && printf '%s\n' "$current" echo "$BEGIN" fi printf '%s\n' "$body" echo "$END" if grep -qF "$END" <<<"$current"; then awk -v e="$END" 'f{print} $0==e{f=1}' <<<"$current" fi } > "$tmp" crontab -u root "$tmp" ;; *) echo "usage: ${0##*/} <list|set>" >&2; exit 2 ;; esac ARCIVEO_CRON_EOF echo "www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/arciveo-cron" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c
Ο χρήστης web μπορεί να διαφέρει από τον www-data — ελέγξτε υπό ποιον τρέχει το pool PHP-FPM του ιστότοπου (ps -o user= -C php-fpm) και βάλτε τον στη γραμμή sudoers.
Το νέο αρχείο ανέβηκε με λάθος ιδιοκτήτη — η σελίδα απαντά «Access denied.». Αν το αρχείο public/crontab_monitor.php ανέβηκε μέσω FTP/SFTP υπό διαφορετικό χρήστη συστήματος (π.χ. root) από τα υπόλοιπα αρχεία του ιστότοπου, ο web server δεν θα μπορεί να το διαβάσει. Συγκρίνετε τον ιδιοκτήτη και τα δικαιώματα με ένα διπλανό αρχείο και προσαρμόστε τα:
ls -la public/crontab_monitor.php public/ssl_monitor.php sudo chown OWNER:OWNER public/crontab_monitor.php sudo chmod 644 public/crontab_monitor.php

Διαγνωστικά

41. Το εργαλείο είναι εγκατεστημένο, αλλά εμφανίζεται «Μη εγκατεστημένο»

Η μονάδα εντοπίζει τα εργαλεία μέσω του dpkg-query — της βάσης πακέτων APT. Αν το εργαλείο δεν εγκαταστάθηκε μέσω apt (χειροκίνητα, από snap ή από πηγαίο κώδικα), το dpkg δεν το βλέπει.

# Έλεγχος μέσω dpkg: dpkg -l fail2ban | grep '^ii' dpkg -l auditd | grep '^ii' # Εύρεση διαδρομής του εκτελέσιμου: which ufw fail2ban-client auditctl # Δοκιμή sudo ως www-data: sudo -u www-data sudo fail2ban-client status sudo -u www-data sudo ufw status verbose

42. Επίλυση προβλημάτων (500, χωρίς δεδομένα)

Σφάλμα 500 — ελέγξτε τα αρχεία καταγραφής της PHP, του nginx και του ίδιου του monitor:

tail -50 /var/log/nginx/error.log tail -50 /var/log/php*-fpm.log # Αρχεία καταγραφής του monitor: tail -50 logs/monitor_$(date +%Y-%m-%d).log # Δικαιώματα φακέλων: ls -la data/ tmp/ logs/
Ο πίνακας σε πάνελ φιλοξενίας (HestiaCP, ISPmanager, cPanel); Εκεί η PHP δεν τρέχει ως www-data, αλλά ως λογαριασμός χρήστη (π.χ. admin — ιδιοκτήτης του καταλόγου του ιστότοπου). Όλοι οι κανόνες sudo και η συμμετοχή σε ομάδες (adm, systemd-journal) πρέπει να οριστούν σε αυτόν τον χρήστη, αλλιώς οι μονάδες θα δείξουν «Ανενεργό / 0» ενώ οι υπηρεσίες λειτουργούν. Για να βρείτε τον πραγματικό χρήστη της PHP: ps -o user= -C php-fpm | sort -u ή τον ιδιοκτήτη του καταλόγου του ιστότοπου stat -c '%U' /path/to/monitor. Στη συνέχεια σε όλες τις παρακάτω εντολές βάλτε αυτόν αντί για www-data. Η αυτόματη εγκατάσταση εντοπίζει μόνη της τον χρήστη web και ορίζει τα sudoers σε αυτόν.

Δεν εμφανίζονται δεδομένα — σχεδόν πάντα φταίνε τα μη ορισμένα δικαιώματα sudo. Ελέγξτε τη συγκεκριμένη εντολή ως χρήστης web (αντικαταστήστε το www-data με τον δικό σας). Η σημαία -n = χωρίς κωδικό, όπως στην PHP — αν ζητά κωδικό, τότε δεν υπάρχει κανόνας στο sudoers:

sudo -u www-data sudo -n fail2ban-client status sudo -u www-data sudo -n ufw status verbose sudo -u www-data sudo -n ipset list -t ipsum sudo -u www-data sudo -n /usr/sbin/ausearch -m USER_LOGIN -ts today sudo -u www-data sudo -n /usr/sbin/aa-status sudo -u www-data sudo -n /usr/sbin/psad --Status sudo -u www-data journalctl -u falco --no-pager -n 5
Η μονάδα γράφει «Ανενεργό» / «0», ενώ το εργαλείο λειτουργεί (π.χ. το sudo aa-status στο τερματικό δείχνει προφίλ, αλλά η σελίδα «AppArmor» δείχνει «Ανενεργό»). Αιτία: ο χρήστης web δεν έχει δικαίωμα sudo για την εντολή αυτής της μονάδας. Ελέγξτε την από την παραπάνω λίστα: αν ζητά κωδικό — προσθέστε τη γραμμή που λείπει στο /etc/sudoers.d/monitor («Ρύθμιση sudo»). Συχνές «νέες» εντολές: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD).
Αν μια συγκεκριμένη σελίδα (Falco, ModSecurity, Auditd, ανοιχτές θύρες UFW) είναι κενή — αντιπαραβάλετε με τη λίστα στην ενότητα για το sudo: πιθανώς δεν επιτρέπεται το apache2ctl, ausearch, aa-status ή ss, ή ο χρήστης web δεν είναι στις ομάδες adm/systemd-journal (από εκεί διαβάζονται τα αρχεία καταγραφής fail2ban/auth/modsec και το journalctl — Falco και συμβάντα πυρήνα).

43. Η σελίδα είναι κενή, αν και υπάρχουν δεδομένα στον διακομιστή

Σύμπτωμα: στον διακομιστή υπάρχουν δεδομένα (φαίνονται μέσω shell), αλλά η σελίδα δείχνει «δεν υπάρχουν δεδομένα» ή λανθασμένη κατάσταση — για παράδειγμα το AIDE γράφει «Μη αρχικοποιημένη», αν και η βάση έχει δημιουργηθεί.

Η αιτία είναι το open_basedir: πολλά panel και hosting περιορίζουν το pool του PHP-FPM στον κατάλογο του domain, γι' αυτό οι συναρτήσεις PHP file_exists(), file_get_contents(), filemtime() σε συστημικές διαδρομές (/var/lib/aide, /var/log, /proc…) μπλοκάρονται. Η μονάδα το παρακάμπτει διαβάζοντας τέτοιες διαδρομές με τυπικές συστημικές εντολές (cat, test, stat).

# Φαίνεται το αρχείο μέσω shell (έτσι το διαβάζει η μονάδα): sudo -u www-data bash -lc 'test -e /var/lib/aide/aide.db && echo VISIBLE || echo NO' # Τρέχουσα τιμή open_basedir για το pool του domain: grep -ri open_basedir /etc/php/*/fpm/pool.d/ 2>/dev/null
Αν το shell «βλέπει» το αρχείο (VISIBLE), αλλά η σελίδα όχι — πρόκειται για open_basedir. Η σωστή λύση είναι η ανάγνωση με συστημικές εντολές (έχει ήδη γίνει για το AIDE και τη Μονάδα δικτύου). Δεν χρειάζεται να επεκτείνετε το open_basedir στα /var, /proc και είναι λιγότερο ασφαλές.

44. Η σελίδα SSL δεν λειτουργεί

Η μονάδα ελέγχει τα πιστοποιητικά συνδεόμενη απευθείας στους τομείς μέσω της θύρας 443. Αν ο τομέας δεν είναι προσβάσιμος από τον ίδιο τον διακομιστή ή η θύρα είναι κλειστή από το τείχος προστασίας, ο έλεγχος θα αποτύχει.

# Χειροκίνητος έλεγχος πιστοποιητικού: echo | openssl s_client -connect monitor.example.com:443 2>/dev/null \ | openssl x509 -noout -dates # Έλεγχος προσβασιμότητας: curl -I https://monitor.example.com
Τους τομείς η μονάδα τους λαμβάνει αυτόματα από τα configs του nginx (/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) και του Apache (/etc/apache2/sites-enabled/), καθώς και τον τρέχοντα host από το HTTP_HOST.
Αυτόματος εντοπισμός υποτομέων. Οι υποτομείς εντοπίζονται αυτόματα από τα δημόσια αρχεία καταγραφής Certificate Transparency και ελέγχονται μέσω δικτύου — ακόμη κι αν φιλοξενούνται σε άλλους διακομιστές. Δεν χρειάζεται να προσθέσετε τίποτα χειροκίνητα.

45. Φαίνεται μόνο μία ΒΔ από τις πολλές

Ο monitor συνδέεται στη MySQL με τον χρήστη από το config.php, ο οποίος έχει πρόσβαση μόνο στη δική του βάση. Η MySQL εμφανίζει στο information_schema μόνο τις βάσεις με δικαιώματα — γι' αυτό οι υπόλοιπες δεν φαίνονται.

Για να βλέπει ο monitor όλες τις ΒΔ, δώστε σε αυτόν τον χρήστη μόνο δικαίωμα ανάγνωσης (μία φορά ως root· βάλτε το όνομα χρήστη από το config.php):

sudo mysql -u root GRANT SELECT, PROCESS, SHOW DATABASES ON *.* TO 'DB_USER'@'localhost'; FLUSH PRIVILEGES; EXIT;
SELECT ON *.* δίνει μόνο δικαίωμα ανάγνωσης — δεν είναι δυνατή η τροποποίηση, διαγραφή ή δημιουργία οτιδήποτε· είναι ασφαλές για την παρακολούθηση.
Χωρίς αυτό το GRANT ο πίνακας βλέπει μόνο τη δική του βάση — δεν είναι σφάλμα, αλλά περιορισμός δικαιωμάτων. Κανένα sudo mysql δεν χρησιμοποιεί ο πίνακας: η λίστα των βάσεων λαμβάνεται μέσω της δικής του σύνδεσης PDO.

46. Η PostgreSQL δεν εμφανίζεται στη σελίδα «Βάση δεδομένων»

Η PostgreSQL απαιτεί πρόσβαση επιπέδου χρήστη postgres, την οποία ο διαδικτυακός χρήστης του πίνακα δεν διαθέτει. Το άνοιγμα ενός ευρέος sudo psql από την PHP είναι επισφαλές — αντ' αυτού ο πίνακας καλεί ένα στενό wrapper χωρίς παραμέτρους, που τυπώνει μόνο την έκδοση, το πλήθος συνδέσεων και τη λίστα βάσεων με τα μεγέθη τους. Δημιουργήστε το:

sudo tee /usr/local/bin/monitor-pgstat >/dev/null <<'EOF' #!/bin/sh # Arciveo Security Monitor - read-only PostgreSQL version, connections and per-database size sudo -u postgres psql -tAc "SELECT version();" | grep -oE 'PostgreSQL [0-9.]+' echo "---" sudo -u postgres psql -tAc "SELECT count(*) FROM pg_stat_activity;" echo "---" sudo -u postgres psql -tAc "SELECT datname || '|' || pg_size_pretty(pg_database_size(datname)) FROM pg_database WHERE datistemplate = false;" EOF sudo chown root:root /usr/local/bin/monitor-pgstat sudo chmod 755 /usr/local/bin/monitor-pgstat # στο /etc/sudoers.d/monitor (χρήστης = αυτός με τον οποίο τρέχει το PHP-FPM): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
Αν δεν χρησιμοποιείτε την PostgreSQL — αφαιρέστε τη γραμμή monitor-pgstat από το sudoers (βήμα 13 της χειροκίνητης εγκατάστασης) και μη δημιουργήσετε το script: η κάρτα της PostgreSQL απλώς θα παραμείνει ανενεργή.

47. Ενεργοποιήθηκε ειδοποίηση — τι να κάνετε

Ο πίνακας δείχνει τι συμβαίνει· παρακάτω θα βρείτε τι να κάνετε σε τυπικές περιπτώσεις. Γενική αρχή: μην πανικοβάλλεστε, αντιπαραβάλετε με τη νόμιμη δραστηριότητα (οι ενέργειές σας, ενημερώσεις, αντίγραφα ασφαλείας) και αντιδράστε ανάλογα με τη σοβαρότητα.

  • Χάρτης επιθέσεων / πολλά μπλοκαρίσματα fail2ban — είναι κάτι φυσιολογικό για κάθε διακομιστή στο διαδίκτυο (τα bots δοκιμάζουν συνεχώς SSH/web). Το σημαντικό είναι τα μπλοκαρίσματα να λειτουργούν. Βεβαιωθείτε ότι η σύνδεση μέσω SSH γίνεται μόνο με κλειδί (ο κωδικός είναι απενεργοποιημένος) και ότι η IP σας βρίσκεται στο ignoreip.
  • Το ModSecurity μπλόκαρε αιτήματα — το WAF αποκρούει επιθέσεις στον ιστότοπο, αυτή είναι η δουλειά του. Αν μπλοκάρεται η νόμιμη κίνησή σας (ψευδής ενεργοποίηση) — βρείτε το rule id στις λεπτομέρειες και προσθέστε εξαίρεση στη διαμόρφωση CRS.
  • AIDE: τροποποιήθηκαν αρχεία — αντιπαραβάλετε τη λίστα με ό,τι κάνατε εσείς (ενημέρωση πακέτων, επεξεργασία διαμορφώσεων — φυσιολογικά). Αλλαγές σε δυαδικά αρχεία του συστήματος που δεν αγγίξατε αποτελούν λόγο ανησυχίας. Μετά από νόμιμες αλλαγές, ενημερώστε τη βάση AIDE.
  • debsums: τροποποιήθηκαν δυαδικά/βιβλιοθήκες (εκτός /etc, εκτός /usr/share) — πιθανή αντικατάσταση. Ελέγξτε το πακέτο: debsums PACKAGE_NAME, και αν έχετε αμφιβολίες επανεγκαταστήστε το (apt install --reinstall).
  • ClamAV / maldet: εντοπίστηκε απειλή — ελέγξτε το αρχείο στην καραντίνα, μην το ανοίγετε. Αν πρόκειται για web-shell στον κατάλογο του ιστότοπου — απομονώστε τον διακομιστή και αναζητήστε το σημείο εισόδου (ευάλωτο plugin, διαρροή διαπιστευτηρίων).
  • Falco: κρίσιμα συμβάντα (εκτέλεση shell σε container, πρόσβαση σε ευαίσθητα αρχεία) — αναλύστε το συμβάν: ποιανού είναι η διεργασία, τι την εκκίνησε. Συχνά είναι νόμιμη δραστηριότητα διαχείρισης.
  • Εξωτερική έκθεση: με κόκκινο η ΒΔ/cache — κλείστε το αμέσως: δέστε την υπηρεσία στο 127.0.0.1 ή κλείστε τη θύρα στο UFW. Είναι πραγματικό κενό ασφαλείας.
  • Το SSL λήγει / έληξε — ανανεώστε το πιστοποιητικό (το Let's Encrypt ανανεώνεται μόνο του· αν όχι — ελέγξτε το certbot renew ή τις ρυθμίσεις στον πίνακα).
  • Εκκρεμούν ενημερώσεις ασφαλείας — εγκαταστήστε τες: sudo apt update && sudo apt upgrade· μετά από ενημέρωση του πυρήνα επανεκκινήστε τον διακομιστή.
Ενδείξεις πραγματικής παραβίασης (άγνωστες διεργασίες/χρήστες, τροποποιημένα δυαδικά, εξερχόμενο spam, άγνωστες εργασίες cron): αποσυνδέστε τον διακομιστή από την εξωτερική πρόσβαση, κρατήστε ένα αντίγραφο ασφαλείας για ανάλυση και, αν τα δεδομένα είναι κρίσιμα, στήστε καθαρό διακομιστή από ένα αξιόπιστο αντίγραφο ασφαλείας — η αξιόπιστη εκκαθάριση ενός rootkit είναι δύσκολη.