Το ερώτημα σπάνια προκύπτει από το πουθενά. Ο διακομιστής έγινε πιο αργός, ο πάροχος φιλοξενίας έστειλε σημείωμα για εξερχόμενη κίνηση ή υπάρχει στο ταχυδρομείο σας ειδοποίηση για μια σύνδεση που δεν κάνατε ποτέ. Ακολουθεί το δυσάρεστο μέρος: δεν είναι προφανές τι να κοιτάξετε και με ποια σειρά, ενώ το πρώτο ένστικτο — σβήστε τα όλα και ξεκινήστε ξανά — είναι σχεδόν πάντα πρόωρο.
Παρακάτω υπάρχει μια σειρά ελέγχων που παίρνει περίπου είκοσι λεπτά και στις περισσότερες περιπτώσεις δίνει σαφή απάντηση. Ξεκινά από το φθηνότερο και καταλήγει στο ακριβότερο: πρώτα ό,τι φαίνεται αμέσως, μετά ό,τι πρέπει να συγκριθεί με ένα σημείο αναφοράς.
Βήμα πρώτο: ποιος συνδέθηκε
Ξεκινήστε από τις συνδέσεις. Αν μπήκε κάποιος άλλος, σχεδόν σίγουρα ήρθε μέσω SSH και υπάρχει ίχνος.
last -20
lastb | head -20
who
Η last δείχνει τις πιο πρόσφατες επιτυχημένες συνδέσεις, η lastb τις αποτυχημένες, η who όποιον είναι συνδεδεμένος αυτή τη στιγμή. Σημασία δεν έχει το πλήθος αλλά το σχήμα. Χιλιάδες αποτυχημένες προσπάθειες από διευθύνσεις που δεν επανεμφανίζονται ποτέ είναι το συνηθισμένο υπόβαθρο της τυφλής δοκιμής κωδικών· τρέχει ασταμάτητα εναντίον κάθε δημόσιας διεύθυνσης και δεν σημαίνει τίποτα.
Αυτό που πρέπει να σας ανησυχήσει είναι άλλο:
- μια επιτυχημένη σύνδεση από διεύθυνση όπου δεν βρίσκεται κανείς δικός σας·
- μια σύνδεση με όνομα χρήστη που δεν δημιουργήσατε ποτέ·
- αποτυχημένες προσπάθειες εναντίον ονόματος χρήστη που υπάρχει πραγματικά σε αυτό το μηχάνημα — αυτό σημαίνει ότι κάποιος έμαθε ποιοι είναι οι χρήστες σας αντί να δοκιμάζει λεξικό·
- μια συνεδρία ανοιχτή αυτή τη στιγμή που δεν την ανοίξατε εσείς.
Ελέγξτε ξεχωριστά αν εμφανίστηκαν άγνωστα κλειδιά. Το αρχείο ~/.ssh/authorized_keys είναι ο συνηθέστερος τρόπος να παραμείνει κανείς μέσα: ο κωδικός μπορεί να αλλάζει όσο θέλετε, το κλειδί μένει.
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
Κάθε γραμμή εκεί είναι η πρόσβαση κάποιου. Αν δεν μπορείτε να πείτε ποιανού, θεωρήστε την ξένη.
Βήμα δεύτερο: τι άλλαξε στο σύστημα
Μια εισβολή σχεδόν πάντα αφήνει ίχνη στον δίσκο: ένα αντικατεστημένο εκτελέσιμο, μια επιπλέον γραμμή σε ρύθμιση, ένα νέο αρχείο στον κατάλογο του διακομιστή ιστού. Ο έλεγχος με το μάτι είναι μάταιος — χρειάζεστε σημείο αναφοράς.
Σε Debian και Ubuntu το σημείο αναφοράς υπάρχει ήδη: κάθε πακέτο γνωρίζει τα αθροίσματα ελέγχου των δικών του αρχείων.
sudo apt install debsums
sudo debsums -c
Η εντολή παραθέτει τα αρχεία που διαφέρουν από αυτά που εγκατέστησε η διανομή. Μέρος των ευρημάτων θα είναι νόμιμο — τα αρχεία ρυθμίσεων στο /etc υπάρχουν για να τα επεξεργάζεστε. Ένα τροποποιημένο εκτελέσιμο στο /usr/bin, στο /usr/sbin ή στο /bin σε διακομιστή που δεν πειράξατε ποτέ με το χέρι είναι εντελώς άλλη υπόθεση.
Η δεύτερη πηγή είναι πρόσφατα αρχεία εκεί όπου δεν θα έπρεπε να υπάρχουν. Ένα web shell κάθεται συνήθως σε κατάλογο μεταφορτώσεων και μοιάζει με ένα αθώο .php:
find /var/www -type f -name '*.php' -mtime -14 -ls
Οι δεκατέσσερις μέρες είναι μόνο αφετηρία· χρησιμοποιήστε το διάστημα για το οποίο ξέρετε ότι δεν δημοσιεύσατε τίποτα.
Βήμα τρίτο: τι βγαίνει προς τα έξω
Ένας παραβιασμένος διακομιστής σπάνια παραβιάζεται για τον εαυτό του. Χρησιμοποιείται: για αποστολή ανεπιθύμητης αλληλογραφίας, για εξόρυξη, για πρόσβαση σε άλλα δίκτυα, για φιλοξενία ξένων αρχείων. Όλα αυτά δημιουργούν εξερχόμενες συνδέσεις που πριν δεν υπήρχαν.
ss -tulpn
ss -tp state established
Η πρώτη εντολή δείχνει τι ακούει, η δεύτερη τι είναι συνδεδεμένο αυτή τη στιγμή. Διαβάστε τη στήλη της διεργασίας. Ερωτήματα εγείρουν: μια άγνωστη διεργασία που ακούει στο 0.0.0.0· εξερχόμενες συνδέσεις σε υψηλές θύρες διευθύνσεων με τις οποίες η εφαρμογή σας δεν έχει καμία δουλειά· και προπάντων μια διεργασία που ξεκίνησε από το /tmp ή το /dev/shm — τίποτα νόμιμο δεν τρέχει από αυτούς τους καταλόγους.
Κοιτάξτε και το φορτίο όσο είστε εκεί. Ένας miner προδίδεται κρατώντας τον επεξεργαστή απασχολημένο σε έναν ιστότοπο που δεν απολαμβάνει καμία απολύτως δημοτικότητα.
Αν τα σημάδια υπάρχουν
Η πρώτη παρόρμηση είναι να καθαρίσετε γρήγορα: να σβήσετε το ξένο κλειδί, να σκοτώσετε τη διεργασία, να διαγράψετε το αρχείο. Μην το κάνετε — θα κατέστρεφατε ακριβώς εκείνο που θα μπορούσε αργότερα να εξηγήσει πώς μπήκαν. Και αν αυτό μείνει ανεξήγητο, θα επιστρέψουν, ίσως και αύριο.
Μια σειρά που διατηρεί και τα δεδομένα και την εικόνα:
- Πάρτε στιγμιότυπο δίσκου στον πάροχό σας, αν είναι διαθέσιμο. Είναι το μόνο βήμα που δεν μπορεί να επαναληφθεί αργότερα.
- Αποκόψτε το μηχάνημα από το δίκτυο ή κλείστε τα πάντα εκτός από τη δική σας IP — αλλά μην το σβήσετε. Ο τερματισμός χάνει τη λίστα διεργασιών και τις ανοιχτές συνδέσεις, δηλαδή τα μισά τεκμήρια.
- Αντιγράψτε τα αρχεία καταγραφής εκτός μηχανήματος: το
/var/log/auth.log, τα αρχεία του διακομιστή ιστού, την έξοδο των τριών παραπάνω εντολών. - Μόνο τώρα βρείτε πώς μπήκαν.
Μια καθαρή επανεγκατάσταση είναι το σωστό τέλος αν η πρόσβαση αποκτήθηκε με δικαιώματα root. Καμία ποσότητα καθαρισμού δεν εγγυάται ότι δεν έμεινε κάτι πίσω. Όμως η επανεγκατάσταση χωρίς κατανόηση της αιτίας είναι ανώφελη: θα ξαναβάλετε την ίδια τρύπα σε ένα φρέσκο σύστημα.
Πώς να μην έρθει το ερώτημα ξαφνικά
Όλα τα παραπάνω είναι ένας εφάπαξ χειροκίνητος έλεγχος και απαντούν στο ερώτημα «τι συμβαίνει αυτή τη στιγμή». Το πρόβλημα είναι ότι το ερώτημα τίθεται συνήθως αργά: αφού γράψει ο πάροχος ή αφού πέσει ο ιστότοπος.
Καθένας από αυτούς τους ελέγχους υπάρχει ως ξεχωριστό εργαλείο που μπορεί να παρακολουθεί συνεχώς: αποτυχημένες συνδέσεις — fail2ban, αλλαγές αρχείων — AIDE, ακεραιότητα πακέτων — debsums, ανοιχτές θύρες — ένα τακτικό στιγμιότυπο του ss. Η εγκατάστασή τους μία προς μία δεν είναι δύσκολη· δύσκολο είναι να αποκτήσετε τη συνήθεια να συνδέεστε καθημερινά για να διαβάζετε έξι διαφορετικές εξόδους, γι' αυτό και στην πράξη κανείς δεν τις διαβάζει.
Αυτό ακριβώς είναι το νόημα ενός πίνακα που τις συγκεντρώνει: τα ίδια δεδομένα, αλλά σε μία σελίδα και με ιστορικό, ώστε το «χθες δεν ήταν έτσι» να φαίνεται χωρίς ειδική εξόρμηση. Παρακάτω είναι οι σελίδες επίδειξης που δείχνουν πώς μοιάζει αυτό συναρμολογημένο.