Ενότητα 2 · 2.3
Έξυπνη χρήση του SSH
Ενότητα 2: SSH και κλειδιά · Χρόνος ανάγνωσης: 10 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να χρησιμοποιείτε το SSH καθημερινά με άνεση, με ένα δικό σας αρχείο ρυθμίσεων, να αντιγράφετε αρχεία με scp και rsync και να φτάνετε σε μια βάση δεδομένων μέσω tunnel, χωρίς να χρειάζεται να ανοίξετε τη θύρα της βάσης δεδομένων προς το internet.
Βασικές έννοιες: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding, -L, tunnel, ProxyJump, ServerAliveInterval, διαφορετικός αριθμός θύρας, ανάκληση κλειδιού
Λιγότερη πληκτρολόγηση με το ~/.ssh/config
Μετά από μερικές εβδομάδες θα πληκτρολογείτε αυτό δεκάδες φορές την ημέρα:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10Με ένα αρχείο ρυθμίσεων για τον client η εντολή γίνεται πιο σύντομη και κάνετε λιγότερα λάθη. Το αρχείο βρίσκεται στον δικό σας υπολογιστή: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, χωρίς επέκταση).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Τώρα αρκεί απλώς:
anna@laptop:~$ ssh web1
anna@web1:~$Τι κάνουν οι γραμμές;
- Host είναι το ψευδώνυμο που επιλέγετε εσείς. Το πληκτρολογείτε μετά από
ssh,scpκαιrsync. - HostName είναι η πραγματική διεύθυνση: μια διεύθυνση IP ή ένα όνομα που υπάρχει στο DNS.
- User και Port είναι το όνομα χρήστη και η θύρα, ώστε να μη χρειάζεται πλέον να τα θυμάστε.
- IdentityFile δείχνει το κλειδί. Είναι χρήσιμο αν έχετε πολλά κλειδιά· χωρίς αυτή τη γραμμή το ssh δοκιμάζει τα προεπιλεγμένα σας κλειδιά.
- ServerAliveInterval 60 στέλνει κάθε 60 δευτερόλεπτα ένα μικρό σήμα ζωής. Πολλοί οικιακοί router και δίκτυα wifi διακόπτουν μια αδρανή σύνδεση μετά από λίγα λεπτά· με αυτή τη ρύθμιση η συνεδρία σας παραμένει ανοιχτή.
Και εδώ ισχύει η πρώτη τιμή, όπως και στον server. Τοποθετήστε λοιπόν γενικούς κανόνες όπως το Host * στο τέλος του αρχείου.
Αντιγραφή αρχείων: scp, rsync και sftp
Το scp αντιγράφει ένα αρχείο, με την ίδια μορφή όπως το cp, αλλά με host: μπροστά:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .Το rsync είναι πιο έξυπνο για φακέλους και μεγάλες ποσότητες δεδομένων: στέλνει μόνο ό,τι έχει αλλάξει και μπορεί να συνεχίσει μια αντιγραφή που διακόπηκε. Πρέπει να είναι εγκατεστημένο και στις δύο πλευρές (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Προσέξτε την κάθετο (slash) μετά το ./site/: με κάθετο το rsync αντιγράφει το περιεχόμενο του φακέλου, χωρίς κάθετο τον ίδιο τον φάκελο (τότε παίρνετε /var/www/example.com/site/). Αν έχετε αμφιβολία, δοκιμάστε πρώτα με --dry-run και να είστε πολύ προσεκτικοί με το --delete, που διαγράφει στην πλευρά του παραλήπτη ό,τι δεν υπάρχει στη δική σας πλευρά.
Το sftp και γραφικά προγράμματα όπως το FileZilla ή το WinSCP χρησιμοποιούν την ίδια σύνδεση SSH και το ίδιο κλειδί. Δεν χρειάζεται λοιπόν ξεχωριστός FTP server. Δεν συνιστάται ένας παλιομοδίτικος FTP server σε VPS: το απλό FTP στέλνει τον κωδικό πρόσβασής σας χωρίς κρυπτογράφηση μέσω του δικτύου.
Ένα tunnel αντί για μια ανοιχτή θύρα
Αυτό είναι ίσως το πιο χρήσιμο πράγμα που μπορεί να κάνει το SSH. Ας υποθέσουμε ότι στον server σας εκτελείται μια βάση δεδομένων PostgreSQL. Θέλετε να συνδεθείτε σε αυτήν από το laptop σας με ένα γραφικό πρόγραμμα. Ο πειρασμός να ανοίξετε τη θύρα 5432 προς το internet είναι μεγάλος. Μην το κάνετε: οι ανοιχτές θύρες βάσεων δεδομένων είναι μία από τις σημαντικότερες αιτίες διαρροών δεδομένων (μάθημα 10.2), και το μάθημα ελέγχει αργότερα από έξω ότι είναι κλειστές (άσκηση Z5.1).
Με το τοπικό port forwarding αφήνετε το SSH να δημιουργήσει ένα tunnel:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Διαβάστε το ως εξής: «άκου στο laptop μου στη θύρα 5432 και στείλε ό,τι φτάνει εκεί μέσω της σύνδεσης SSH στο 127.0.0.1:5432, όπως φαίνεται από τον server». Όσο αυτή η συνεδρία είναι ανοιχτή, συνδέετε το πρόγραμμα βάσης δεδομένων σας με το localhost θύρα 5432 στο δικό σας laptop και καταλήγετε στη βάση δεδομένων του server.
Τι κάνει αυτή τη λύση τόσο καλή;
- Η βάση δεδομένων ακούει μόνο στο
127.0.0.1στον server και είναι απρόσιτη από έξω. - Η σύνδεση κρυπτογραφείται από το SSH, ακόμη κι αν η ίδια η βάση δεδομένων δεν έχει κρυπτογράφηση.
- Πρόσβαση έχει μόνο όποιος μπορεί να συνδεθεί με SSH. Χρησιμοποιείτε λοιπόν την ισχυρή προστασία που ήδη έχετε.
Αν στο laptop σας κάτι χρησιμοποιεί ήδη τη θύρα 5432, επιλέξτε αριστερά άλλον αριθμό: -L 15432:127.0.0.1:5432, και συνδεθείτε στη θύρα 15432. Αν προσθέσετε το tunnel στο ~/.ssh/config, θα το έχετε πάντα διαθέσιμο:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432Με το ssh -N web1-db παίρνετε μόνο το tunnel, χωρίς γραμμή εντολών.
Μέσω ενδιάμεσου server: ProxyJump
Μερικές φορές μπορείτε να φτάσετε σε έναν server μόνο μέσω κάποιου άλλου, για παράδειγμα έναν server βάσης δεδομένων χωρίς δημόσια διεύθυνση IP πίσω από τον web server σας. Το ProxyJump περνά μέσω του πρώτου server στον δεύτερο:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1Η διαφορά από το agent forwarding (μάθημα 2.1): με το ProxyJump η κρυπτογράφηση είναι από άκρο σε άκρο, μεταξύ του laptop σας και του db1. Ο ενδιάμεσος server απλώς προωθεί τα πακέτα και δεν μπορεί να χρησιμοποιήσει το κλειδί σας.
Διαφορετικός αριθμός θύρας: ναι ή όχι;
Πολλοί οδηγοί προτείνουν να μεταφέρετε το SSH σε άλλη θύρα, για παράδειγμα 2222. Τι κάνει αυτό στην πράξη;
- Μειώνει τον θόρυβο: οι περισσότερες αυτοματοποιημένες απόπειρες μαντέματος δοκιμάζουν μόνο τη θύρα 22. Το αρχείο καταγραφής σας γίνεται πιο ήσυχο.
- Δεν είναι μέτρο ασφαλείας. Ένας scanner που ελέγχει όλες τις θύρες βρίσκει το SSH μέσα σε δευτερόλεπτα από το banner έκδοσής του.
Με κλειδιά και απενεργοποιημένη σύνδεση με κωδικό (μάθημα 2.2), η θύρα έχει μικρή σημασία για την ασφάλεια. Αν θέλετε παρ' όλα αυτά να την αλλάξετε, κάντε το με τη σωστή σειρά: ανοίξτε τη νέα θύρα στο firewall, αφήστε το SSH να ακούει και στις δύο θύρες, δοκιμάστε σε δεύτερο παράθυρο και μόνο τότε κλείστε την παλιά θύρα. Στο Ubuntu 24.04 και νεότερα χρειάζονται επίσης τα systemctl daemon-reload και systemctl restart ssh.socket (μάθημα 2.2). Μην ξεχνάτε ότι ο πάροχός σας μπορεί να έχει επίσης firewall.
Ανάκληση πρόσβασης
Ένας πρώην συνάδελφος ή ένας κατασκευαστής ιστοτόπων είχε κλειδί στον server σας και δεν συνεργάζεται πλέον μαζί σας; Η ανάκληση της πρόσβασης είναι απλή, αν την παρακολουθείτε:
- Δείτε όλα τα κλειδιά:
ssh-keygen -lf ~/.ssh/authorized_keys, και κάντε το για κάθε χρήστη (και για τον/root/.ssh/authorized_keys). - Αφαιρέστε τη γραμμή αυτού του ατόμου.
- Αν χρησιμοποιούσε δικό του λογαριασμό χρήστη, κλειδώστε τον (μάθημα 3.1) και ελέγξτε αν ήταν στην ομάδα
sudo(μάθημα 3.2). - Αν έχει δει κωδικούς πρόσβασης, όπως έναν κωδικό βάσης δεδομένων σε αρχείο ρυθμίσεων, αλλάξτε και αυτούς.
Ένα απλό κλειδί δεν έχει ημερομηνία λήξης. Ό,τι δεν αφαιρέσετε συνεχίζει να λειτουργεί, ακόμη και χρόνια αργότερα. Αν δίνετε σε κάποιον προσωρινή πρόσβαση, μπορείτε να βάλετε πριν από τη γραμμή του στο authorized_keys την επιλογή expiry-time="20261231"· μετά από αυτή την ημερομηνία ο server απορρίπτει το κλειδί.
Σύνοψη
- Το
~/.ssh/configστον δικό σας υπολογιστή αποθηκεύει για κάθε server το όνομα, τον χρήστη, τη θύρα και το κλειδί· τοHost *μπαίνει στο τέλος. - scp για μεμονωμένα αρχεία, rsync για φακέλους (προσοχή στην κάθετο και στο
--delete), sftp αντί για FTP. - Με το
ssh -Lφτάνετε σε μια βάση δεδομένων μέσω κρυπτογραφημένου tunnel, ενώ η θύρα της βάσης δεδομένων μένει κλειστή από έξω. - Το ProxyJump περνά με ασφάλεια μέσω ενδιάμεσου server· είναι καλύτερο από το agent forwarding.
- Ένας διαφορετικός αριθμός θύρας μειώνει τον θόρυβο, αλλά δεν προστατεύει. Τα κλειδιά που δεν αφαιρείτε συνεχίζουν να λειτουργούν.
Κουίζ
Άσκηση
Άσκηση O2.3: Ένα SSH config και ένα tunnel. Δημιουργήστε στον δικό σας υπολογιστή ένα ~/.ssh/config με ένα ψευδώνυμο για τον server σας, συνδεθείτε μόνο με ssh <bijnaam>, αντιγράψτε ένα αρχείο με scp ή rsync και δημιουργήστε ένα tunnel με -L προς μια υπηρεσία που στον server σας ακούει μόνο στο 127.0.0.1 (αν δεν έχετε ακόμη βάση δεδομένων, χρησιμοποιήστε τη θύρα 22 του ίδιου του server: ssh -L 2200:127.0.0.1:22 <bijnaam> και στη συνέχεια ssh -p 2200 anna@localhost). Απαντήστε στις ερωτήσεις σχετικά με το τι κάνει το tunnel και γιατί η θύρα δεν χρειάζεται να είναι ανοιχτή.
Άσκηση O2.3: Ένα SSH config και ένα tunnel
Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.
Ο φορητός σας υπολογιστής ακούει στην αριστερή θύρα, η κίνηση περνά κρυπτογραφημένη μέσω SSH και καταλήγει στον server στο 127.0.0.1:<poort>. Η υπηρεσία παραμένει απρόσιτη από έξω. Μια άλλη θύρα SSH δίνει λιγότερο θόρυβο στο log σας, αλλά δεν αποτελεί ασφάλεια· τα κλειδιά και η απενεργοποίηση της σύνδεσης με κωδικό πρόσβασης αποτελούν.
Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.
Για περαιτέρω μελέτη
Τα βήματα σε αυτά τα άρθρα ισχύουν για τα VPS και τα panels της WebOké· σε άλλους παρόχους η διαδικασία είναι παρόμοια.
- Σύνδεση στο VPS σας με SSH (και δημιουργία κλειδιού SSH)
- Εγχειρίδιο ssh_config (ρυθμίσεις client): https://man.openbsd.org/ssh_config
- Εγχειρίδιο ssh (επιλογές
-L,-J,-N): https://man.openbsd.org/ssh
