Η λίστα των ανοιχτών θυρών είναι η λίστα των τρόπων να φτάσει κανείς στον διακομιστή σας. Όλα τα υπόλοιπα — τείχη προστασίας, WAF, ανίχνευση εισβολών — χτίζονται πάνω σε αυτήν. Γι' αυτό το «τι ακούει εδώ» έρχεται πρώτο σε κάθε έλεγχο, και γι' αυτό είναι επίσης ο έλεγχος που συχνότερα δίνει δυσάρεστη απάντηση: τα μισά από όσα εμφανίζονται δεν τα ανοίξατε εσείς αλλά το πρόγραμμα εγκατάστασης κάποιου πακέτου.
Διαβάζοντας την έξοδο
sudo ss -tulpn
Οι σημαίες: t για TCP, u για UDP, l μόνο για όσα ακούν, p για τη διεργασία, n για να μείνουν οι αριθμοί αριθμοί. Χωρίς sudo η στήλη της διεργασίας είναι κενή και η άσκηση χάνει το νόημά της.
Σημασία έχει η στήλη Local Address:Port, και η διαφορά εκεί είναι θεμελιώδης:
127.0.0.1:3306— η υπηρεσία είναι προσβάσιμη μόνο από το ίδιο το μηχάνημα. Αυτό είναι καλό·0.0.0.0:3306— από κάθε διεύθυνση IPv4, δηλαδή από το διαδίκτυο. Αυτό χρειάζεται έλεγχο·[::]:3306— το ίδιο για IPv6. Ξεχωριστή γραμμή, και τακτικά παραβλέπεται·203.0.113.25:443— σε συγκεκριμένη διεύθυνση, συνήθως σκόπιμα.
Έπειτα, για κάθε γραμμή με 0.0.0.0 ή [::], κάντε ένα ερώτημα: πρέπει ένας ξένος να μπορεί να φτάσει εδώ; Για τις 80 και 443 η απάντηση είναι ναι. Για σχεδόν όλα τα υπόλοιπα είναι όχι.
Τα συνηθισμένα ευρήματα
Redis, θύρα 6379. Η πιο επικίνδυνη γραμμή εκεί. Από προεπιλογή το Redis δεν απαιτεί κωδικό και οι εντολές του επιτρέπουν την εγγραφή αρχείου στον δίσκο — δηλαδή ξένο κλειδί στο authorized_keys. Ανάμεσα στην εμφάνιση του Redis σε δημόσια διεύθυνση και τη χρήση του περνούν ώρες, ενίοτε λιγότερο. Ελέγξτε για bind 127.0.0.1 και protected-mode yes στη ρύθμιση.
Memcached, 11211/UDP. Ακόμη κι αν δεν υπάρχει τίποτα πολύτιμο μέσα, ο διακομιστής σας γίνεται ενισχυτής για ξένες επιθέσεις — και το παράπονο θα έρθει από τον πάροχό σας.
MySQL και PostgreSQL, 3306 και 5432. Υπάρχει κωδικός, αλλά η μαντεψιά τρέχει εναντίον του συνεχώς και οι εκδόσεις των βάσεων ενημερώνονται πιο σπάνια απ' ό,τι θα ήθελε κανείς. Σχεδόν ποτέ δεν χρειάζεται να βλέπουν προς τα έξω: η εφαρμογή ζει στο ίδιο μηχάνημα και μια σήραγγα SSH αρκεί για τη δική σας δουλειά.
Elasticsearch 9200, MongoDB 27017. Ιστορικά χωρίς πιστοποίηση από προεπιλογή. Οι δημόσιες εγκαταστάσεις τους είναι μόνιμη πηγή ειδήσεων για διαρροές δεδομένων.
Το API του Docker, 2375. Μια ανοιχτή θύρα ελέγχου του Docker είναι root στον υπολογιστή υποδοχής χωρίς κανέναν απολύτως κωδικό. Εμφανίζεται συνήθως μετά από πειράματα με απομακρυσμένη πρόσβαση στο Docker.
Πίνακες ελέγχου και phpMyAdmin στις δικές τους θύρες: 8080, 8083, 10000. Δεν λέμε ότι δεν πρέπει ποτέ να ανοίγουν, αλλά αυτοί ακριβώς μαζεύουν τον κύριο όγκο των προσπαθειών.
Διορθώστε το στην υπηρεσία, όχι στο τείχος προστασίας
Η παρόρμηση να κλείσετε κάθε εύρημα με έναν κανόνα UFW είναι κατανοητή, αλλά αυτή είναι η δεύτερη γραμμή, όχι η πρώτη. Ένας κανόνας μπορεί να διαγραφεί κατά λάθος, ένα τείχος προστασίας μπορεί να απενεργοποιηθεί προσωρινά κατά την αποσφαλμάτωση, και το Docker δημοσιεύει θύρες παρακάμπτοντας εντελώς το UFW. Μια ρύθμιση σύνδεσης στο ίδιο το αρχείο της υπηρεσίας επιβιώνει από όλα αυτά:
- MySQL/MariaDB —
bind-address = 127.0.0.1· - PostgreSQL —
listen_addresses = 'localhost'· - Redis —
bind 127.0.0.1 ::1· - Docker Compose — δημοσίευση ως
"127.0.0.1:5432:5432".
Το τείχος προστασίας μπαίνει από πάνω ως ασφάλιση, όχι αντί γι' αυτό.
Βρίσκοντας τη διεργασία όταν δεν είναι σαφές
Το ss δίνει το όνομα και το pid. Έπειτα:
sudo systemctl status <pid>
sudo lsof -i :8080
Η πρώτη εντολή ονομάζει τη μονάδα systemd στην οποία ανήκει η διεργασία — συνήθως αρκεί για να καταλάβετε τι είναι και αν χρειάζεται. Μια άγνωστη διεργασία που ακούει σε υψηλή θύρα και ξεκίνησε εκτός των καταλόγων συστήματος — από το /tmp ή το /dev/shm, ας πούμε — δεν είναι πια ζήτημα ρύθμισης αλλά λόγος για ξεχωριστή διερεύνηση.
Ο έλεγχος από έξω είναι υποχρεωτικός
Το ss απαντά «τι ακούει», όχι «τι είναι προσβάσιμο». Ανάμεσά τους στέκονται το τείχος προστασίας, το NAT και οι δικοί του κανόνες του παρόχου. Η μόνη τίμια απάντηση έρχεται από σάρωση από άλλο μηχάνημα:
nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1
Μην παραλείψετε τη δεύτερη εντολή: σχεδόν κάθε VPS έχει διεύθυνση IPv6, οι κανόνες της γράφονται χωριστά και η υπηρεσία ακούει και στις δύο εκδόσεις του πρωτοκόλλου ταυτόχρονα.
Αυτός δεν είναι εφάπαξ έλεγχος
Η λίστα των ανοιχτών θυρών αλλάζει από μόνη της. Εγκαταστήσατε ένα πακέτο και έφερε μια υπηρεσία και άνοιξε μια θύρα. Ενημερώσατε έναν πίνακα και επανέφερε μια προεπιλογή. Ξεκινήσατε ένα container και δημοσίευσε μια θύρα παρακάμπτοντας το τείχος προστασίας. Ένας εφάπαξ έλεγχος απαντά για σήμερα και τίποτα παραπάνω.
Η αξία δεν βρίσκεται στην ίδια τη λίστα αλλά στις αλλαγές της: μια νέα θύρα που χθες δεν υπήρχε είναι σύντομο και εξαιρετικά κατατοπιστικό σήμα. Έτσι ακριβώς αξίζει να την παρακολουθείτε — ως στιγμιότυπο με ιστορικό, όχι ως έξοδο του ss ανακαλούμενη από μνήμης. Η σελίδα επίδειξης παρακάτω δείχνει ακριβώς αυτό.