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

Ένα μόνο πράγμα είναι τρομακτικό σε αυτό: να απενεργοποιήσετε τον κωδικό και να μείνετε απέξω. Να η σειρά με την οποία αυτό δεν μπορεί να συμβεί.

Το κλειδί

Δημιουργείται στο δικό σας μηχάνημα, όχι στον διακομιστή:

ssh-keygen -t ed25519 -C "work laptop"

ed25519 αντί για RSA: πιο σύντομο, πιο γρήγορο και χωρίς ερωτήματα για το μήκος. Το RSA χρειάζεται μόνο αν πρέπει να φτάσετε σε κάτι πολύ παλιό· τότε -t rsa -b 4096.

Αξίζει να βάλετε φράση πρόσβασης στο κλειδί: το αρχείο του κλειδιού μπορεί να κλαπεί από φορητό υπολογιστή και χωρίς φράση δουλεύει αμέσως. Δεν θα χρειάζεται να την πληκτρολογείτε κάθε φορά — αυτό το αναλαμβάνει ο ssh-agent και σε macOS και στα περισσότερα επιτραπέζια Linux τρέχει ήδη.

Η αντιγραφή του στον διακομιστή είναι μία εντολή, όσο ο κωδικός δουλεύει ακόμη:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.25

Αν το ssh-copy-id δεν είναι διαθέσιμο, το περιεχόμενο του αρχείου .pub προστίθεται ως γραμμή στο ~/.ssh/authorized_keys του διακομιστή. Τα δικαιώματα έχουν σημασία: ο κατάλογος .ssh 700, το αρχείο 600, με ιδιοκτήτη τον χρήστη. Με οτιδήποτε άλλο ο sshd αρνείται αθόρυβα να διαβάσει το αρχείο, και αυτή είναι η συνηθέστερη αιτία του «το κλειδί δεν δουλεύει».

Ο έλεγχος που το κρίνει

Πριν απενεργοποιήσετε οτιδήποτε, ανοίξτε μια δεύτερη σύνδεση χωρίς να κλείσετε την πρώτη:

ssh -o PasswordAuthentication=no user@203.0.113.25

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

Απενεργοποίηση κωδικών και ένα μη προφανές εμπόδιο

Οι ρυθμίσεις μπαίνουν σε ξεχωριστό αρχείο ώστε μια ενημέρωση πακέτου να μην τις αντικαταστήσει. Αλλά το όνομα του αρχείου έχει σημασία:

sudo tee /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PasswordAuthentication no
PermitRootLogin no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LogLevel VERBOSE
EOF

Το θέμα είναι ότι το OpenSSH χρησιμοποιεί την πρώτη τιμή που βρίσκει για μια παράμετρο, όχι την τελευταία όπως σχεδόν παντού αλλού. Τα αρχεία στο sshd_config.d διαβάζονται αλφαβητικά, και οι εικόνες νέφους του Ubuntu βάζουν εκεί το 50-cloud-init.conf, που συχνά περιέχει PasswordAuthentication yes. Το δικό σας αρχείο με αριθμό 90 δεν θα κάνει τίποτα σε αυτή την περίπτωση: η ρύθμιση φαίνεται στη θέση της ενώ ο κωδικός συνεχίζει να δουλεύει. Εξ ου και ο αριθμός 10 — διαβάζεται νωρίτερα.

Μπορείτε να δείτε τι προέκυψε πραγματικά χωρίς μαντεψιές:

sudo sshd -T | grep -Ei 'passwordauth|permitrootlogin|pubkeyauth'

Αυτή η εντολή τυπώνει την ενεργή ρύθμιση μετά από όλα τα include. Εμπιστευτείτε αυτήν, όχι το περιεχόμενο των αρχείων.

Έπειτα έλεγχος σύνταξης και ήπια επαναφόρτωση της υπηρεσίας:

sudo sshd -t && sudo systemctl reload ssh

Το sshd -t είναι υποχρεωτικό: ένα τυπογραφικό λάθος στη ρύθμιση μαζί με restart αφήνει την υπηρεσία πεσμένη και εσάς απέξω. Το reload επίσης δεν σπάει ανοιχτές συνεδρίες.

Ubuntu 24.04: η θύρα δεν είναι εκεί που νομίζετε

Ξεχωριστή παγίδα στο πρόσφατο Ubuntu: ο sshd εκεί ξεκινά μέσω ενός socket του systemd. Σε αυτή τη λειτουργία η γραμμή Port στο sshd_config δεν κάνει τίποτα — ακούει το socket, όχι ο δαίμονας. Αν αλλάζετε θύρα, αυτό είναι που πρέπει να επεξεργαστείτε:

sudo systemctl edit ssh.socket

και το ListenStream= (κενή τιμή μηδενίζει την προηγούμενη) πρέπει να ορίζει τη νέα θύρα. Το σύμπτωμα που το προδίδει: η ρύθμιση άλλαξε, η υπηρεσία επανεκκινήθηκε και ο διακομιστής απαντά ακόμη στην 22.

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

Ποιος επιτρέπεται να συνδέεται

Χρήσιμη προσθήκη είναι μια ρητή λίστα:

AllowUsers deploy admin

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

Εφεδρικός τρόπος εισόδου

Ένα κλειδί σε έναν φορητό υπολογιστή είναι ένα μοναδικό σημείο αστοχίας. Ο δίσκος πεθαίνει, ο φορητός χάνεται και ο διακομιστής γίνεται απρόσιτος οριστικά. Ένα λογικό ελάχιστο:

  • ένα δεύτερο κλειδί από άλλη συσκευή στο authorized_keys·
  • ένα αντίγραφο του ιδιωτικού κλειδιού σε διαχειριστή κωδικών ή σε κρυπτογραφημένο στικάκι·
  • δοκιμασμένη πρόσβαση σε κονσόλα στον πάροχό σας — VNC ή σειριακή. Δοκιμασμένη σημαίνει ότι έχετε συνδεθεί μέσω αυτής τουλάχιστον μία φορά, όχι ότι «υπάρχει κάπου ένα κουμπί στον πίνακα».

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

Και μετά

Η μαντεψιά κωδικών δεν θα εξαφανιστεί, απλώς γίνεται άχρηστη: τα αρχεία θα συνεχίσουν να μαζεύουν χιλιάδες γραμμές Failed password, καμία από τις οποίες δεν μπορεί να τελειώσει με επιτυχία. Αυτό που αξίζει να παρακολουθείτε τώρα είναι οι επιτυχημένες συνδέσεις: από ποια διεύθυνση, με ποιον χρήστη, ποια ώρα. Μια επιτυχημένη σύνδεση με κλειδί από άγνωστη διεύθυνση είναι πολύ πιο σημαντικό συμβάν από ένα εκατομμύριο αποτυχίες, και πολύ πιο δύσκολο να το προσέξετε μέσα στη γενική ροή. Αυτή ακριβώς την εικόνα δείχνει η σελίδα επίδειξης παρακάτω.