Ενότητα 2 · 2.2
Ασφαλής ρύθμιση του SSH server
Ενότητα 2: SSH και κλειδιά · Χρόνος ανάγνωσης: 12 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να απενεργοποιήσετε τη σύνδεση με κωδικό πρόσβασης και τη σύνδεση του root με κωδικό πρόσβασης, να ελέγξετε ποια ρύθμιση ισχύει πραγματικά και να το κάνετε χωρίς να κλειδωθείτε έξω.
Βασικές έννοιες: sshd, sshd_config, sshd_config.d, μετράει η πρώτη τιμή, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, δεύτερη συνεδρία, cloud-init, ssh.socket
Πρώτα το δίχτυ ασφαλείας
Αυτό το μάθημα κλείνει μια πόρτα από την οποία περνάτε και εσείς οι ίδιοι. Ένα τυπογραφικό λάθος μπορεί να σημαίνει ότι δεν μπορείτε πλέον να συνδεθείτε. Γι' αυτό, πάντα πριν ξεκινήσετε:
- Δύο κλειδιά λειτουργούν (μάθημα 2.1) και έχετε ελέγξει σε νέο παράθυρο ότι η σύνδεση με κλειδί επιτυγχάνει.
- Ένα snapshot του VPS σας. Στο WebOké το δημιουργείτε στην οθόνη του VPS· σε άλλους παρόχους ονομάζεται επίσης snapshot ή image. Αν κάτι πάει στραβά, το επαναφέρετε.
- Γνωρίζετε την κονσόλα του παρόχου σας: από εκεί μπαίνετε χωρίς SSH.
- Η τρέχουσα συνεδρία SSH σας μένει ανοιχτή μέχρι το τέλος. Μια ενεργή συνεδρία συνεχίζει να λειτουργεί όταν αλλάζετε τις ρυθμίσεις ή επαναφορτώνετε την υπηρεσία. Δοκιμάζετε κάθε αλλαγή σε δεύτερο παράθυρο.
Πού βρίσκονται οι ρυθμίσεις
Ο SSH server ονομάζεται sshd. Οι ρυθμίσεις του βρίσκονται στο /etc/ssh/sshd_config. Στο Debian και στο Ubuntu, στην αρχή αυτού του αρχείου υπάρχει αυτή η γραμμή:
Include /etc/ssh/sshd_config.d/*.confΌλα τα αρχεία με .conf στον φάκελο sshd_config.d διαβάζονται επομένως πριν από το υπόλοιπο κύριο αρχείο, με αλφαβητική σειρά. Αυτό είναι πρακτικό: βάζετε τις δικές σας ρυθμίσεις σε ξεχωριστό αρχείο και αφήνετε ανέγγιχτο το κύριο αρχείο, ώστε μια ενημέρωση του πακέτου να μην επηρεάζει τις αλλαγές σας.
Έχει όμως μια συνέπεια που αιφνιδιάζει πολλούς. Στο sshd_config ισχύει: για κάθε ρύθμιση μετράει η πρώτη τιμή που συναντά ο sshd. Οι επόμενες γραμμές με την ίδια ρύθμιση αγνοούνται. Αν γράψετε στο τέλος του sshd_config PasswordAuthentication no, δεν υπερισχύετε λοιπόν ενός αρχείου στο sshd_config.d που λέει yes.
Η παγίδα του cloud-init
Πολλά images VPS ρυθμίζονται κατά την πρώτη εκκίνηση από το cloud-init. Ανάλογα με το πώς έχουν ρυθμιστεί το image και η εγκατάσταση, το cloud-init γράφει ένα αρχείο όπως το /etc/ssh/sshd_config.d/50-cloud-init.conf που περιέχει για παράδειγμα:
PasswordAuthentication yesΕπειδή αυτό το αρχείο διαβάζεται πριν από το κύριο αρχείο, η σύνδεση με κωδικό πρόσβασης παραμένει ενεργή, ό,τι κι αν γράψετε στο sshd_config. Μην το θεωρείτε λοιπόν δεδομένο, αλλά ελέγξτε:
root@web1:~# grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config:#PasswordAuthentication yes
/etc/ssh/sshd_config.d/50-cloud-init.conf:PasswordAuthentication yesΔύο καθαρές λύσεις: αλλάξτε αυτό το αρχείο σε no ή βάλτε τις δικές σας ρυθμίσεις σε ένα αρχείο που έρχεται νωρίτερα στο αλφάβητο, όπως το 00-beveiliging.conf. Ένα αρχείο 99-mijn.conf αντίθετα δεν λειτουργεί, γιατί τότε το cloud-init έχει ήδη υπερισχύσει.
Οι ρυθμίσεις που μετράνε
Δημιουργήστε το δικό σας αρχείο:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confμε αυτό το περιεχόμενο:
# Σύνδεση μόνο με κλειδί
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordΤι σημαίνει κάθε γραμμή;
- PasswordAuthentication no: ο server δεν δέχεται πλέον κωδικό πρόσβασης. Η προεπιλεγμένη τιμή του OpenSSH είναι
yes. - KbdInteractiveAuthentication no: το "keyboard-interactive" είναι ένας δεύτερος τρόπος να ζητηθεί κωδικός πρόσβασης, μέσω PAM. Αν το αφήσετε ενεργό, κάποιος μπορεί παρ' όλα αυτά να δοκιμάσει κωδικό πρόσβασης, ακόμη κι αν το
PasswordAuthenticationείναιno. Σε παλαιότερους οδηγούς αυτή η ρύθμιση ονομάζεταιChallengeResponseAuthentication· από το OpenSSH 8.7 αυτό είναι ένα παρωχημένο εναλλακτικό όνομα για το ίδιο πράγμα. Το Debian το έχει ήδη από προεπιλογή σεno, αλλά γράψτε το ούτως ή άλλως: έτσι είναι σαφές και ισχύει και σε άλλα συστήματα. - PermitRootLogin prohibit-password: ο root μπορεί να συνδεθεί, αλλά μόνο με κλειδί. Αυτή είναι η προεπιλογή από το OpenSSH 7.0. Αυστηρότερο είναι το
PermitRootLogin no: ο root δεν μπορεί καθόλου να μπει μέσω SSH, συνδέεστε ως κανονικός χρήστης και χρησιμοποιείτε sudo (μάθημα 3.2). Ορίστεnoμόνο όταν είστε βέβαιοι ότι η σύνδεση ως αυτός ο χρήστης και τοsudoλειτουργούν.
Προαιρετικά, για όσους θέλουν περισσότερα:
AllowUsers anna
AuthenticationMethods publickeyΤο AllowUsers επιτρέπει την είσοδο μόνο στους χρήστες που αναφέρονται· κάθε άλλο όνομα απορρίπτεται, ακόμη κι αν έχει έγκυρο κλειδί. Πρακτικό, αλλά μην ξεχάσετε τον εαυτό σας και μην ξεχάσετε να το συμπληρώσετε όταν προσθέσετε δεύτερο διαχειριστή. Το AuthenticationMethods publickey δηλώνει σε μία γραμμή ότι ισχύουν μόνο κλειδιά.
Δοκιμή, εφαρμογή, έλεγχος
Πρώτα αφήνετε τον sshd να ελέγξει το αρχείο. Αυτό δεν ξεκινά και δεν αλλάζει τίποτα:
root@web1:~# sshd -t
root@web1:~#Καμία έξοδος σημαίνει: κανένα σφάλμα. Σε περίπτωση τυπογραφικού λάθους βλέπετε τη γραμμή και το αρχείο. Μόνο τότε επαναφορτώνετε την υπηρεσία:
root@web1:~# systemctl reload sshΣτο Debian και στο Ubuntu η υπηρεσία ονομάζεται ssh, στο AlmaLinux και στο Rocky Linux sshd.
Στη συνέχεια ελέγχετε ποια τιμή ισχύει πραγματικά. Το sshd -T εμφανίζει την πλήρη, υπολογισμένη διαμόρφωση, με επεξεργασμένα όλα τα αρχεία Include:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(Το without-password είναι το παλιό όνομα του prohibit-password. Εκδόσεις του OpenSSH πριν από την 10.1, όπως στο Debian 13 και στο Ubuntu 24.04, εμφανίζουν ακόμη το παλιό όνομα· οι νεότερες εμφανίζουν prohibit-password. Σημαίνει το ίδιο.)
Και τώρα το σημαντικότερο: δοκιμάστε σε ένα δεύτερο παράθυρο, ενώ το πρώτο μένει ανοιχτό.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Αν αυτό λειτουργεί, δοκιμάστε σκόπιμα να συνδεθείτε με κωδικό πρόσβασης. Αυτό πρέπει να αποτύχει:
anna@laptop:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no anna@192.0.2.10
anna@192.0.2.10: Permission denied (publickey).Μετά το Permission denied εμφανίζονται σε παρένθεση οι μέθοδοι σύνδεσης που προσφέρει ακόμη ο server. Αν εκεί υπάρχει μόνο publickey, όλα είναι σωστά. Αν υπάρχει και password ή keyboard-interactive, τότε κάπου ισχύει ακόμη άλλη τιμή: ελέγξτε ξανά με sshd -T.
Ακριβώς αυτή τη λίστα ελέγχει και η άσκηση του μαθήματος, από έξω. Ο SSH client σας ρωτά σε κάθε σύνδεση πρώτα ποιες μέθοδοι επιτρέπονται, με ένα αίτημα τύπου "none". Ο server απαντά με τη λίστα, χωρίς να δοκιμαστεί κωδικός πρόσβασης ή κλειδί.
Ubuntu 24.04 και νεότερα: ssh.socket
Στο Ubuntu από την έκδοση 22.10 δεν ακούει ο ίδιος ο sshd στη θύρα 22, αλλά το systemd, μέσω του ssh.socket. Μόνο όταν έρθει μια σύνδεση, το systemd ξεκινά την υπηρεσία SSH. Για τις ρυθμίσεις αυτού του μαθήματος αυτό δεν έχει καμία σημασία: αρκεί systemctl reload ssh ή restart ssh.
Έχει όμως σημασία όταν αλλάζετε τη θύρα ή τη διεύθυνση ακρόασης (Port, ListenAddress). Από το Ubuntu 24.04 το systemd διαβάζει αυτές τις τιμές από το sshd_config, αλλά μόνο μετά από:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketΑν το ξεχάσετε, ο server συνεχίζει απλώς να ακούει στην παλιά θύρα. Χειρότερα: αν ρυθμίσετε πρώτα το firewall σας σε νέα θύρα και το SSH μείνει στην παλιά, κλειδώνεστε έξω. Ελέγχετε πάντα με ss -tlnp | grep ssh πού ακούει πραγματικά ο server (μάθημα 5.1) και ανοίξτε τη νέα θύρα στο firewall σας πριν κλείσετε την παλιά. Αν μια διαφορετική θύρα έχει νόημα, το διαβάζετε στο μάθημα 2.3.
Αν παρ' όλα αυτά κάτι πάει στραβά
Αν δεν μπορείτε πλέον να συνδεθείτε, ανοίξτε την κονσόλα του παρόχου σας, συνδεθείτε ως root (με τον κωδικό πρόσβασης, γιατί η κονσόλα είναι ένα "πληκτρολόγιο συνδεδεμένο στον server" και όχι SSH) και αναιρέστε το αρχείο σας:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshΑν ούτε αυτό πετύχει, επαναφέρετε το snapshot. Στο WebOké μπορείτε επίσης να ορίσετε νέο κωδικό πρόσβασης root στην οθόνη του VPS· άλλοι πάροχοι έχουν συχνά παρόμοιο κουμπί ή λειτουργία διάσωσης (rescue).
Στο AlmaLinux και στο Rocky Linux
Η υπηρεσία ονομάζεται sshd (systemctl reload sshd). Και εκεί υπάρχει ένα Include /etc/ssh/sshd_config.d/*.conf στην αρχή και το σύστημα παραδίδει δικά του αρχεία σε αυτόν τον φάκελο· ισχύει ο ίδιος κανόνας "μετράει η πρώτη τιμή". Αν αλλάξετε τη θύρα, πρέπει το SELinux να επιτρέπει επίσης αυτή τη θύρα (semanage port -a -t ssh_port_t -p tcp 2222) και το firewalld να την ανοίξει.
Σύνοψη
- Στο
sshd_configμετράει η πρώτη τιμή· τα αρχεία στοsshd_config.dδιαβάζονται πρώτα. Βάλτε τις δικές σας ρυθμίσεις σε ένα αρχείο όπως το00-beveiliging.conf. - Ορίστε
PasswordAuthentication noκαιKbdInteractiveAuthentication no· ο root μόνο με κλειδί (prohibit-password) ή καθόλου (no). - Ελέγξτε με
sshd -tπριν από την επαναφόρτωση και μεsshd -Tποια τιμή ισχύει πραγματικά· προσέξτε ένα50-cloud-init.conf. - Δοκιμάστε σε δεύτερο παράθυρο και κρατήστε την πρώτη συνεδρία ανοιχτή. Γνωρίστε την κονσόλα και δημιουργήστε εκ των προτέρων ένα snapshot.
- Στο Ubuntu 24.04+ μια διαφορετική θύρα απαιτεί
systemctl daemon-reloadκαιsystemctl restart ssh.socket.
Κουίζ
Άσκηση
Άσκηση Z2.2: Η σύνδεση με κωδικό πρόσβασης είναι απενεργοποιημένη. Απενεργοποιήστε τη σύνδεση με κωδικό πρόσβασης και το keyboard-interactive όπως σε αυτό το μάθημα και αφήστε στη συνέχεια το πρόγραμμα να ελέγξει από έξω. Συμπληρώστε τη διεύθυνση IP ή το hostname του server σας, τη θύρα SSH (προεπιλογή 22) και το όνομα χρήστη με το οποίο συνδέεστε εσείς (για παράδειγμα anna, όχι root ή ένα επινοημένο όνομα). Το πρόγραμμα δεν συνδέεται: ρωτά μόνο, όπως κάθε SSH client πριν από τη σύνδεση, ποιες μεθόδους σύνδεσης προσφέρει ο server σας για αυτόν τον χρήστη. Σωστό είναι: μόνο publickey.
Για περαιτέρω μελέτη
Τα βήματα σε αυτά τα άρθρα αφορούν την οθόνη VPS του WebOké· σε άλλους παρόχους λειτουργεί παρόμοια.
- Ασφάλεια του VPS σας: τα πρώτα πέντε λεπτά
- Δεν έχετε πια πρόσβαση στο VPS σας: τι κάνετε;
- Snapshots και backups του VPS σας
- Εγχειρίδιο sshd_config: https://man.openbsd.org/sshd_config
- Ubuntu: SSHd now uses socket-based activation: https://discourse.ubuntu.com/t/sshd-now-uses-socket-based-activation-ubuntu-22-10-and-later/30189
