5.7 SSH (Secure Shell)
5.7.1
ΕισαγωγήΤα εργαλεία απομακρυσμένης επικοινωνίας
(rsh, rcp, rlogin) είναι γνωστά για την ευκολία χρήσης τους και την παροχή γρήγορης πρόσβασης σε άλλες μηχανές. Το πρόβλημα, όμως, είναι ότι βασίζονται σε IP διευθύνσεις ή host names για την πιστοποίηση της ταυτότητας των μηχανών, γεγονός που τα καθιστά ανασφαλή καθ' ότι οι υπηρεσίες του DNS δεν είναι άξιες εμπιστοσύνης. Επίσης, η μετάδοση των κωδικών χωρίς κανένα είδος προστασίας οξύνει τις τρύπες ασφαλείας. Για να μπορούν, λοιπόν, να χρησιμοποιούνται σε ασφαλή περιβάλλοντα πρέπει να διαθέτουν πιο καλύτερους μηχανισμούς πιστοποίησης ταυτότητας. Η εισαγωγή της έννοιας της κρυπτογράφησης και των ψηφιακών υπογραφών στα εργαλεία rsh, rcp και rlogin, δημιούργησε το Secure Shell (SSH).Το SSH σχεδιάστηκε για να αντικαταστήσει τα εργαλεία
rsh, rcp και rlogin με τα αντίστοιχα ssh, scp και slogin, με επιπλέον χαρακτηριστικά αυτά της ισχυρής από άκρη σε άκρη κρυπτογράφηση, της βελτιωμένης πιστοποίησης ταυτότητας χρήστη και μηχανής και την προώθηση TCP πορτών και Χ11 συνδέσεων.Σε αυτό το σημείο είναι απαραίτητο να εξηγήσουμε τον όρο "προώθηση
TCP πορτών". Ας θεωρήσουμε τις τρεις μηχανές του παρακάτω παραδείγματος. Η μηχανή Χ είναι ο client και εγκαθιστά σύνδεση με τον server Υ μέσω SSH. Μια πόρτα ρου Χ, ας πούμε η 1999, ρυθμίζεται για προώθηση σε μια άλλη πόρτα στο απομακρυσμένο σύστημα Ζ, ας πούμε την 23. Η πόρτα προωθείται μέσω του κρυπτογραφημένου καναλιού στον Υ και από εκεί προωθείται στην πόρτα 23 του Ζ. Έτσι, η εντολή telnet localhost 1999 θα έχει σαν αποτέλεσμα μια telnet σύνδεση με τον Ζ.Η τρέχοντα έκδοση του πρωτοκόλλου είναι η 2 (version 2.0).
5.7.2
Περιγραφή του SSH πρωτοκόλλουΤο SSH είναι ένα πρωτόκολλο που παρέχει ασφαλή απομακρυσμένη σύνδεση σε υπολογιστές πάνω από μη ασφαλές δίκτυο. Αποτελείται από τρία βασικά στοιχεία:
Σχηματική αναπαράσταση των επιμέρους πρωτοκόλλων του SSH.
5.7.3
Δομή του SSHΙδιωτικά Και Δημόσια Κλειδιά
Κάθε
server και client πρέπει να έχει ένα ζευγάρι ιδιωτικής – δημόσιας κλείδας για να μπορεί να επαλήθευση την ταυτότητα του στο άλλο άκρο. Επιτρέπεται η κατοχή περισσότερων του ενός ζευγάρια κλειδιών, όταν χρησιμοποιούνται με διαφορετικούς αλγόριθμους, ενώ η από κοινού χρήση ενός ζεύγους από πολλούς server δεν απαγορεύεται.Για να μπορεί ο
client με ευκολία να επαληθεύει την ταυτότητα του server είναι απαραίτητο να γνωρίζει την δημόσια κλείδα που αντιστοιχεί στον server που θέλει να συνδεθεί. Υπάρχουν δυο διαφορετικά μοντέλα που εξασφαλίζουν την προηγούμενη προϋπόθεση:Οι εφαρμογές του SSH μπορούν να παρέχουν επιπρόσθετες μεθόδους επικύρωσης των δημόσιων κλειδιών, όπως για παράδειγμα την παραγωγή ενός δεκαεξαδικού "αποτυπώματος" της κλείδας και από τα δύο άκρα και την σύγκριση τους μέσω εξωτερικών καναλιών επικοινωνίας (π.χ. τηλέφωνο). Κλείδες που δεν επαληθεύονται, κανονικά δεν πρέπει να γίνονται δεκτές.
Επεκτασιμότητα
Βασικός στόχος της σχεδίασης είναι η διατήρηση του πρωτοκόλλου όσο το δυνατόν απλό γίνεται, με όσο το δυνατόν λιγότερους αλγόριθμους. Όλες οι εφαρμογές πρέπει να υποστηρίζουν ένα ελάχιστο σύνολο αλγόριθμων για να εξασφαλιστεί η δια – λειτουργικότητα. Στο μέλλον αναμένεται η πρόσθεση και άλλων αλγορίθμων.
Θέματα Πολιτικής
Το πρωτόκολλο επιτρέπει την διαπραγμάτευση όλων των χρησιμοποιούμενων αλγορίθμων. Έτσι, οι αλγόριθμοι κρυπτογράφησης, ανταλλαγή κλειδιών και συμπίεσης καθώς επίσης και οι μηχανισμοί ασύμμετρων κλειδιών και παροχής ακεραιότητας, μπορούν να επιλεγούν από λίστες που παρέχουν ο client και ο server ο ένας στον άλλο και μάλιστα διαφορετικοί για κάθε κατεύθυνση. Η πολιτική ασφαλείας κάθε συστήματος καθορίζει ποιοι προτιμούνται.
Τα παρακάτω θέματα πολιτικής θα πρέπει υπολογίζονται κατά την ρύθμιση SSH εφαρμογών:
Ιδιότητες Ασφάλειας
Ο πρωταρχικός στόχος του SSH πρωτοκόλλου είναι η βελτίωση της ασφάλειας στο Internet και ο τρόπος με τον οποίο προσπαθεί να το επιτύχει αυτό βασίζεται στο εξής σκεπτικό:
Για την ταχεία ανάπτυξη και υιοθέτηση του πρωτοκόλλου, κάποιες έχουν γίνει παραχωρήσεις. Σημαντικότερη από αυτές είναι η καθιέρωση της επαλήθευσης των κλείδων με υποχρεωτική, γεγονός όμως που δεν συνιστάται.
5.7.4 Transport Layer Protocol
Το
Transport Layer Protocol είναι ένα ασφαλές χαμηλού επιπέδου πρωτόκολλο μεταφοράς, που παρέχει ισχυρή κρυπτογράφηση, πιστοποίηση του server και ακεραιότητα των δεδομένων. Σε αυτό το επίπεδο γίνεται η διαπραγμάτευση των αλγόρίθμων ανταλλαγής κλειδιών, συμμετρικής κρυπτογράφησης, ασύμμετρης κρυπτογράφησης, hash και MAC. Συνήθως τρέχει πάνω από TCP/IP. Η πιστοποίηση ταυτότητας σε αυτό το επίπεδο αναφέρεται μόνο σε πιστοποίηση υπολογιστικών μηχανών και όχι χρηστών. Το User Authentication Protocol αναλαμβάνει την επιβεβαίωση της ταυτότητας των χρηστών.Έχει σχεδιαστεί για να είναι απλό, ευέλικτο, να επιτρέπει την διαπραγμάτευση παραμέτρων και να χρησιμοποιεί ένα ελάχιστο αριθμό απαραίτητων μηνυμάτων για την εγκαθίδρυση της σύνδεσης. Για τα περισσότερα περιβάλλοντα, έχει υπολογιστεί ότι ένας αριθμός 2 ανταλλαγών
(round-trips) είναι αρκετός για πλήρη επικοινωνία όλων των απαραίτητων πληροφοριών. Η χειρότερη περίπτωση είναι 3 round-trips.Εγκατάσταση της Σύνδεσης
Την διαδικασία ξεκινά ο
client, ενώ ο server χρησιμοποιεί την πόρτα (port) 22 για ανταποκρίνεται τις επερχόμενες κλήσεις για σύνδεση. Όταν επιτευχθεί η ζεύξη των επικοινωνούντων σημείων, τα δύο άκρα πρέπει να στείλουν μια ακολουθία χαρακτήρων της μορφής "SSH-protoversion-softwareversion-comments" ακολουθούμενη από χαρακτήρες αλλαγής γραμμής και επιστροφής του κέρσορα (carriage return and newline characters). Το μέγιστο μήκος αυτής της ακολουθίας είναι 255 χαρακτήρες περιλαμβανομένων και των χαρακτήρων ελέγχου. Οι αριθμοί έκδοσης πρέπει να αποτελούνται από εκτυπώσιμους ASCII χαρακτήρες εκτός του κενού διαστήματος και του σήματος της αφαίρεσης (-). Χρησιμοποιείται για συμβατότητα μεταξύ παλιών εκδόσεων και για να υποδηλώσει τις δυνατότητες του συστήματος. Το πεδίο comments περιέχει επιπρόσθετες πληροφορίες που μπορεί να είναι χρήσιμες στην επίλυση διάφορων προβλημάτων.
Η διαπραγμάτευση για των αλγορίθμων ξεκινά μόλις σταλεί και από τις δύο μεριές αυτό το αναγνωριστικό. Όλα τα πακέτα που ακολουθούν χρησιμοποιούν το
Binary Packet Protocol που θα περιγράψουμε αργότερα.Συνοπτικά, τα βήματα εγκαθίδρυσης της σύνδεσης είναι:
Τα δύο πρώτα βήματα συζητήθηκαν στο παρών κεφάλαιο. Παρακάτω θα αναφερθούμε στα υπόλοιπα βήματα.
Διαπραγμάτευση Αλγορίθμων
Η διαδικασία αυτή ξεκινά με την αποστολή από κάθε πλευρά λίστας των υποστηριζόμενων αλγόριθμων, στην κορυφή της οποίας υπάρχει αυτός που προτιμάται περισσότερο. Δίνεται η δυνατότητα σε κάθε σύστημα να μαντέψει τους αλγόριθμους που χρησιμοποιεί το ανταποκρινόμενο σύστημα υπηρεσία και μπορεί να στείλει ένα αρχικό πακέτο χρησιμοποιώντας αυτούς. Εάν οι αλγόριθμοι είχαν προβλεφθεί σωστά, τότε χρησιμοποιούνται κατά την διάρκεια της υπόλοιπης σύνδεσης και το πακέτο λαμβάνεται σαν το πρώτο πακέτο διαπραγμάτευσης. Διαφορετικά το πακέτο πρέπει αν αγνοηθεί και η διαδικασία να ξαναρχίσει με το κανονικό αρχικό πακέτο.
Η πιστοποίηση της ταυτότητας μπορεί να είναι υπονοούμενη και μετά από αυτήν ακολουθεί η αίτηση εξυπηρέτησης του
client.Το αρχικό πακέτο, που σηματοδοτεί την αρχή αυτού του βήματος, έχει την παρακάτω δομή:
byte SSH_MSG_KEXINIT
byte[16] cookie (random bytes)
string kex_algorithms
string server_host_key_algorithms
string encryption_algorithms_client_to_server
string encryption_algorithms_server_to_client
string mac_algorithms_client_to_server
string mac_algorithms_server_to_client
string compression_algorithms_client_to_server
string compression_algorithms_server_to_client
string languages_client_to_server
string languages_server_to_client
boolean first_kex_packet_follows
uint32 0 (reserved for future extension)
Στην πρώτη στήλη αναφέρεται η μορφή των δεδομένων κάθε πεδίου (δυαδικά,
boolean κτλ.), ενώ η δεύτερη στήλη περιγράφει την χρησιμότητα αυτών. Με τον όρο byte περιγράφουμε ποσότητα 8 bits (octet) και ομοίως ο γενικός όρος byte[n] περιγράφει μονοδιάστατο πίνακα bytes, όπου n ο αριθμός των bytes του πίνακα. Ο όρος boolean υποδηλώνει μοναδικό byte που παίρνει τις τιμές 0 ή 1. Η τιμή 0 φανερώνει "ΛΑΘΟΣ" και η τιμή 1 φανερώνει "ΑΛΗΘΕΙΑ". Ο όρος uint32 αναφέρεται σε ακέραιο 32 bit αποθηκευμένος σαν 4 bytes με το Most Significant Bit (MSB) πρώτο. Τέλος, ο όρος string παρουσιάζει δυαδικά δεδομένα αυθαίρετου μήκους.Ακολουθεί μια σύντομη περιγραφή των πεδίων:
SSH_MSG_KEXINIT
Το πεδίο αυτό προσδιορίζει την ταυτότητα του πακέτου.
cookie:
Είναι μια τυχαία τιμή που παράγεται από τον
server.kex_algorithms
Περιέχει λίστα με τους διαθέσιμους αλγόριθμους ανταλλαγής κλειδιών. Ο πρώτος στην λίστα είναι αυτός που προτιμάται. Η μία και μοναδική μέθοδος που απαιτείται είναι η
Diffie-Hellman με hash αλγόριθμο τον SHA-1.server_host_key_algorithms
Περιέχει λίστα με τους υποστηριζόμενους αλγόριθμους για την ασύμμετρη κρυπτογραφία, δηλαδή για το ζεύγος ιδιωτικής και δημόσιας κλείδας. Ο
server δηλώνει τους αλγόριθμους για τους οποίου έχει κλείδες και ο client δηλώνει τους αλγόριθμους που δέχεται. Η επιλογή του αλγόριθμου εξαρτάται από το κατά πόσο απαιτείται από την μέθοδο ανταλλαγής κλειδιών ψηφιακή υπογραφή ή κρυπτογράφηση. Επιλέγεται ο πρώτος από την λίστα του client που ικανοποιεί όλες τις απαιτήσεις και που υποστηρίζεται από τον server. Εάν δεν υπάρχει τέτοιος αλγόριθμος πρέπει να τερματιστεί η σύνδεση.encryption_algorithms
Περιέχει λίστα με τους αποδεκτούς συμμετρικούς αλγόριθμους με σειρά προτεραιότητας. Ο αλγόριθμος που επιλέγεται για την κάθε κατεύθυνση πρέπει να είναι ο πρώτος στην λίστα του
client που υπάρχει και στην λίστα του server. Εάν δεν υπάρχει τέτοιος αλγόριθμος πρέπει να τερματιστεί η σύνδεση.mac_algorithms
Περιέχονται όλοι οι αποδεκτοί
MAC αλγόριθμοι σε σειρά προτεραιότητας. Επιλέγεται ο πρώτος στην λίστα του client που υπάρχει και στην λίστα του server. Εάν δεν υπάρχει τέτοιος αλγόριθμος πρέπει να τερματιστεί η σύνδεση. Οι αλγόριθμοι που υποστηρίζονται είναι:compression_algorithms
Περιέχονται οι αποδεκτοί αλγόριθμοι συμπίεσης με πρώτο αυτόν που προτιμάται. Επιλέγεται ο πρώτος στην λίστα του
client που υπάρχει και στην λίστα του server. Εάν δεν υπάρχει τέτοιος αλγόριθμος πρέπει να τερματιστεί η σύνδεση.languages
Λίστα χωρισμένοι με κόμμα υποστηριζόμενων γλωσσών. Αυτή η λίστα μπορεί να αγνοηθεί και από τους δύο.
first_kex_packet_follows
Υποδηλώνει κατά πόσο ακολουθεί πακέτο με αλγόριθμους που έχουν μαντέψει ο
client και ο server. Εάν θα σταλεί τέτοιο πακέτο, τότε η τιμή είναι "ΑΛΗΘΕΙΑ" (TRUE) εάν όχι τότε είναι "ΛΑΘΟΣ" (FALSE). Μετά την παραλαβή του πακέτου SSH_MSG_KEYINIT από την αντίστοιχη πλευρά, το κάθε σύστημα θα γνωρίζει κατά πόσο έπεσε μέσα στις προβλέψεις του.Με το πέρας αυτού του βήματος, παράγονται δύο τιμές που έχουν στην κατοχή τους και τα δύο συστήματα: ένα μυστικό κλειδί Κ και μια
hash value. Από αυτά τα δύο και με κατάλληλο αλγόριθμο προκύπτουν κλειδιά κρυπτογράφησης και πιστοποίησης. Η hash value χρησιμοποιείται και σαν session identifier, τιμή που ταυτίζει με μοναδικό τρόπο την σύνδεση.Μετά την καθιέρωση των χρησιμοποιούμενων αλγόριθμων, υποχρεούται ο server να αποδείξει την ταυτότητα του. Αυτό επιτυγχάνεται με την υπογραφή του
session identifier με την ιδιωτική τού κλείδα και αποστολή του αποτελέσματος στον client. Μαζί αποστέλλονται και κατάλληλος αριθμός πιστοποιητικών που εμπεριέχούν την δημόσια κλείδα του server.Αίτηση Εξυπηρέτησης
Αφού ληφθούν όλες οι απαραίτητες αποφάσεις σχετικά με τους χρησιμοποιούμενους μηχανισμούς, ο client στέλνει πακέτο που περιέχει αίτηση για συγκεκριμένη υπηρεσία. Το πακέτο έχει την εξής μορφή:
byte SSH_MSG_SERVICE_REQUEST
string service name
όπου η πρώτη γραμμή ταυτίζει το πακέτο σαν πακέτο αίτησης εξυπηρέτησης και η δεύτερη γραμμή δηλώνει το όνομα της υπηρεσίας που ζητείται. Τα ονόματα ssh-useraut και ssh-connection είναι κρατημένα για της υπηρεσίες του πρωτοκόλλου
User Authentication και Connection αντίστοιχα.Εάν ο
server απορρίψει την αίτηση, στέλνει κατάλληλο μήνυμα αποσύνδεσης και η σύνδεση τερματίζεται. Διαφορετικά, εάν η υπηρεσία υποστηρίζεται και επιτρέπεται στον client, απαντά μεbyte SSH_MSG_SERVICE_ACCEPT
string service name
Ο client περιμένει για την απάντηση του
server πριν προχωρήσει σε αποστολή άλλων δεδομένων.Binary Packet Protocol
Κάθε πακέτο είναι της μορφής:
uint32 packet_length
byte padding_length
byte[n1] payload; n1 = packet_length - padding_length - 1
byte[n2] random padding; n2 = padding_length
byte[m] mac (message authentication code); m = mac_length
Αναλυτικά για το κάθε πεδίο έχουμε:
packet_length
Το μήκος του πακέτου, εξαιρουμένου των MAC bytes και του παρών πεδίου.
padding_length
Το μήκος των συμπληρωματικών bytes.
payload
Τα χρήσιμα περιεχόμενα του πακέτου. Εάν έχει βρεθεί αλγόριθμος συμπίεσης, τα περιεχόμενα είναι συμπιεσμένα. Αρχικά, δεν υπάρχει συμπίεση.
random padding
Συμπληρωματικά bytes των χρήσιμων περιεχομένων, εάν χρειάζεται
mac (message authentication code)
Περιέχει τα bytes του Message Authentication Code (MAC). Το πεδίο αυτό είναι άδειο πριν να συμφωνηθεί ο
MAC αλγόριθμος.Το ελάχιστο μήκος του πακέτου είναι 16 bytes και το μέγιστο 35000 bytes. Όλες οι εφαρμογές πρέπει να μπορούν να επεξεργάζονται πακέτα με ασυμπίεστο
payload 23768 bytes ή λιγότερο. Πακέτα με μεγαλύτερο μήκος, θα στέλνονται μόνο όταν η έκδοση του πρωτοκόλλου στο "SSH-protoversion-softwareversion-comments" υποδηλώνει ότι υποστηρίζονται.Κατηγορίες Αλγόριθμων
Αλγόριθμοι Συμπίεσης
Εάν έχει διαπραγματευθεί ο αλγόριθμος συμπίεσης, τότε συμπιέζονται μόνο τα περιεχόμενα του πεδίου payload σε κάθε πακέτο. Το μήκος του πακέτου και το MAC υπολογίζονται από το συμπιεσμένο payload. Ορίζεται ο αλγόριθμος GNU ZLIB (LZ77), η υποστήριξή του οποίου είναι προαιρετική, ενώ υπάρχει πάντα η δυνατότητα μη συμπίεσης. Η συμπίεση για κάθε κατεύθυνση πρέπει να είναι ανεξάρτητη του αλγόριθμου που χρησιμοποιείται στην άλλη αντίθετη φορά.
Αλγόριθμοι Κρυπτογράφησης
Όταν χρησιμοποιείται κρυπτογράφηση, το μήκος του πακέτου, το μήκος των συμπληρωματικών bytes, τα περιεχόμενα και τα συμπληρωματικά bytes κρυπτογραφούνται με το αλγόριθμο που έχει προεπιλεχθεί. Οι αλγόριθμοι επιλέγονται ανεξάρτητα για κάθε κατεύθυνση και για κάθε κατεύθυνση μπορεί να τρέχει διαφορετικός αλγόριθμος.
Οι ακόλουθοι ciphers υποστηρίζονται επί του παρόντος:
Από αυτούς ο Triple DES είναι υποχρεωτικά υποστηριζόμενος, ο Blowfish απλά συνιστάται, ενώ οι υπόλοιποι είναι προαιρετικοί.
Αλγόριθμοι MAC
Η ακεραιότητα των δεδομένων εξασφαλίζεται με την παραγωγή του MAC του μυστικού κλειδιού Κ, του αύξοντα αριθμού του πακέτου και των χρήσιμων περιεχομένων του πακέτου. Αρχικά, πριν την διαπραγμάτευση του αλγόριθμου, δεν υπάρχει MAC. Η παραγωγή του γίνεται πριν την κρυπτογράφηση των περιεχομένων. Τα MAC bytes μεταδίδονται στο τέλος του πακέτου, χωρίς κρυπτογράφηση.
Ο αύξοντας αριθμός του πακέτου είναι ένας ακέραιος που σε μορφή uint32 και είναι μηδέν για το πρώτο πακέτο. Αυξάνεται με την αποστολή κάθε πακέτου και μηδενίζεται κάθε 232 πακέτα, ενώ ο ίδιος δεν περιλαμβάνεται στο πακέτο ποτέ.
Οι αλγόριθμοι MAC επιλέγονται ανεξάρτητα για κάθε κατεύθυνση και για κάθε κατεύθυνση μπορεί να τρέχει διαφορετικός αλγόριθμος.
Οι αλγόριθμοι που υποστηρίζονται είναι:
Ο πρώτος είναι απαιτούμενος, ο δεύτερος προαιρετικός και ο τρίτος δεν συνιστάται.
Αλγόριθμοι Ανταλλαγής Κλειδιών
Ένας τέτοιος αλγόριθμος καθορίζει πως παράγονται και ανταλλάσσονται κλειδιά κρυπτογράφησης μίας χρήσης και πως γίνεται η πιστοποίηση της ταυτότητας του
server. Η μία και μοναδική μέθοδος που υποστηρίζεται είναι η Diffie-Hellman με hash αλγόριθμο τον SHA-1.Αλγόριθμοι Ασύμμετρων Κλειδιών
Υπάρχουν τρία διαφορετικά στοιχεία που απαρτίζουν ένα ζεύγος ιδιωτικής-δημόσιας κλείδας:
Οι υποστηριζόμενοι αλγόριθμοι για αυτήν την κατηγορία είναι:
Η υποστήριξη του
DSS είναι απαιτούμενη, του X.509 συνιστάται και οι υπόλοιποι δύο είναι προαιρετικοί.
5.7.5 User Authentication Protocol
Σε αυτό το πρωτόκολλο γίνεται η πιστοποίηση της ταυτότητας του χρήστη που χειρίζεται το μηχανή του
client. Προορίζεται να τρέχει πάνω από το SSH Transport Layer Protocol, το οποίο παρέχει ακεραιτότητα δεδομένων και απόρρητη επικοινωνία. Η πρώτη αίτηση εξυπηρέτησης από τον client μετά την διαπραγμάτευση των αλγορίθμων και πιστοποίηση της ταυτότητας του server, είναι για την υπηρεσία με το όνομα "ssh-userauth"και αναφέρεται σε αυτό το πρωτόκολλο.Όταν το πρωτόκολλο ξεκινά, λαμβάνει από το
Transport Layer Protocol το session identifier που χρησιμοποιείται για να προσδιορίζει την σύνδεση με μοναδικό τρόπο. Ο server οδηγεί την διαδικασία της επαλήθευσης της ταυτότητας του χρήστη, λέγοντας στον client ποιες μέθοδοι μπορούν να εφαρμοστούν. Ο server έχει τον απόλυτο έλεγχο της διαδικασίας, αλλά παράλληλα παρέχει στον client την ευελιξία να επιλέξει τον αλγόριθμο που υποστηρίζει περισσότερο ή που είναι πιο βολική στον χρήστη. Οι υποστηριζόμενες μέθοδοι είναι τρεις: (α) με χρήση των δημοσίων κλείδων των χρηστών, (β) με χρήση μυστικών κωδικών και (γ) με χρήση των δημοσίων κλείδων των μηχανών που εργάζονται οι χρήστες. Θα αναλυθούν και οι τρεις παρακάτω.Αιτήσεις για Πιστοποίηση Ταυτότητας
Ο
server θα πρέπει να έχει ένα προκαθορισμένο χρονικό όριο κατά την διάρκεια του οποίου πρέπει να έχει ολοκληρωθεί η πιστοποίηση της ταυτότητας του χρήστη. Εάν η πιστοποίηση δεν έχει γίνει δεκτή μέσα στο διάστημα αυτό, η σύνδεση θα πρέπει να διακοπεί. Ο χρόνος που συνιστάται είναι 10 λεπτά. Επιπλέον, η SSH εφαρμογή θα πρέπει να περιορίζει τον αριθμό των αποτυχημένων προσπαθειών κατά την διάρκεια μιας συγκεκριμένης σύνδεσης. Ο αριθμός αυτό συνιστάται στις 20 προσπάθειες.Όλες αιτήσεις για πιστοποίηση του χρήστη πρέπει να έχουν την ακόλουθη μορφή:
byte SSH_MSG_USERAUTH_REQUEST
string user name (in ISO-10646 UTF-8 encoding)
string service name (in US-ASCII)
string method name (US-ASCII)
rest of the packet is method-specific
Στο πεδίο
user name δίνεται το όνομα του χρήστη. Εάν είναι άκυρο ο server μπορεί να συνδεθεί αμέσως ή να στείλει μια λίστα με τους αποδεκτές μεθόδους πιστοποίησης ταυτότητας, αλλά πότε να μην δεχθεί κανέναν από αυτούς. Με αυτόν τον τρόπο αποφεύγει να δώσει πληροφορίες με το ποια ονόματα υπάρχουν και ποια όχι.Το πεδίο
service name καθορίζει την υπηρεσία που θα ξεκινήσει μετά από την πιστοποίηση. Εάν δεν είναι διαθέσιμη o server μπορεί να αποσυνδεθεί αμέσως ή οποιαδήποτε στιγμή αργότερα και η πιστοποίηση του χρήστη δεν πρέπει να γίνει δεκτή.Το πεδίο
method name περιέχει την μέθοδο που επιθυμεί να χρησιμοποιήσει ο χρήστης. Μπορεί να χρησιμοποιηθεί η τιμή "none", αλλά τότε η προσπάθεια θα απορριφθεί από τον server. Σκοπός της, κυρίως, είναι η αποστολή των υποστηριζόμενων μεθόδων στον client.Ακολουθούν δεδομένα που σχετίζονται με την μέθοδο πιστοποίησης που ζητήθηκε από τον χρήστη και αποτελούν την προσπάθεια του να αποδείξει την ταυτότητα του.
Απάντηση σε Αιτήσεις Πιστοποίησης Ταυτότητας
Εάν ο
server απορρίψει την αίτηση, πρέπει να απαντήσει με το ακόλουθου μήνυμα:byte SSH_MSG_USERAUTH_FAILURE
string authentications that can continue
boolean partial success
Η δεύτερη γραμμή περιέχει λίστα από μεθόδους που μπορούν να συνεχίσουν αυτόν τον διάλογο.
Το πεδίο
partial success θα είναι "ΑΛΗΘΕΙΑ" όταν η προηγούμενη προσπάθεια ήταν επιτυχής, αλλά απαιτούνται και επιπλέον πιστοποιήσεις. Θα είναι "ΛΑΘΟΣ" όταν η αρχική προσπάθεια ήταν αποτυχημένη.Όταν ο
server δεχθεί την πρώτη προσπάθεια, τότε απαντά με:byte SSH_MSG_USERAUTH_SUCCESS
Ο
client μπορεί να στείλει πολλές αιτήσεις χωρίς να περιμένει για απάντηση από τον server. Ο server πρέπει να είναι σε θέση να αναγνωρίζει τις αποτυχημένες αιτήσεις και να στέλνει μηνύματα αποτυχίας, ενώ όταν δεχθεί μήνυμα που να μπορεί να επαληθεύσει την ταυτότητα του χρήστη να αποκρίνεται με μήνυμα επιτυχίας. Το τελευταίο μπορεί να στέλνεται μόνο μια φορά. Όταν ο server στείλει αυτό το μήνυμα, η διαδικασία έχει ολοκληρωθεί και ξεκινά την ζητούμενη υπηρεσία.Μέθοδοι Πιστοποίησης
Χρήση της Δημόσιας Κλείδας του Χρήστη (
Public Key Authentication)Είναι η μόνη απαιτούμενη μέθοδος και όλες οι εφαρμογές πρέπει να την υποστηρίζουν. Σε αυτήν, η κατοχή μίας ιδιωτικής κλείδας χρησιμεύει σαν αποδεικτικό στοιχείο της ταυτότητας του χρήστη, σε συνδυασμό με τη σχετιζόμενη δημόσια κλείδα. Λειτουργεί με την αποστολή από τον
client, της υπογραφής του χρήστη που έχει δημιουργηθεί με χρήση της ιδιωτικής του κλείδας. Οι ιδιωτικές κλείδες συχνά αποθηκεύονται κρυπτογραφημένες στον client και ο χρήστης πρέπει να δώσει μία φράση – κλειδί για να αποκτήσει πρόσβαση σε αυτήν. Επειδή η διαδικασία της υπογραφής περιλαμβάνει χρονοβόρους υπολογισμούς, χρησιμοποιείται το παρακάτω μήνυμα για να ερευνηθεί εάν είναι αποδεκτή η πιστοποίηση με την συγκεκριμένη κλείδα, ώστε να αποτραπεί άχρηστη και ασύμφορη επεξεργασία.byte SSH_MSG_USERAUTH_REQUEST
string user name
string service
string "publickey"
boolean FALSE
string public key algorithm name
string public key blob (=certificates)
Οι αλγόριθμοι ασύμμετρων κλειδιών αποφασίσθηκαν στο
Transport Layer Protocol. Ανταποκρίνονταν, όμως, στα ασύμμετρα κλειδιά που χρησιμοποιήθηκαν κατά την πιστοποίηση της ταυτότητας του server. Οπότε, είναι δυνατόν κάποιοι από αυτούς να μην ισχύουν για αυτήν την περίπτωση πιστοποίησης. Εάν συμβαίνει κάτι τέτοιο, ο server απαντά με ένα από τα δύο μηνύματα:SSH_MSG_USERAUTH_FAILURE
ή μεbyte SSH_MSG_USERAUTH_PK_OK
string public key algorithm name from the request
string public key blob from the request
Για να πραγματοποιήσει ουσιαστική πιστοποίηση, ο
client στέλνει μία υπογραφή του χρήστη που έχει δημιουργηθεί με την ιδιωτική του κλείδα. Ο client μπορεί να στείλει το παρακάτω μήνυμα χωρίς πρώτα να επαληθεύσει κατά πόσο η κλείδα είναι αποδεκτή.byte SSH_MSG_USERAUTH_REQUEST
string user name
string service
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
string signature
Η υπογραφή γίνεται πάνω στα έξης δεδομένα: (α) το
session identifier και (β) στο πεδίο payload του πακέτου. Όταν o server παραλάβει το μήνυμα, πρέπει πρώτα να ελέγξει εάν το είναι αποδεκτή η δημόσια κλείδα και έπειτα να ελέγξει εάν είναι σωστή η υπογραφή. Δεδομένου ότι και οι δύο έλεγχοι επιτύχουν, η μέθοδος έχει θετικό αποτέλεσμα και μήνυμα επιτυχίας αποστέλλεται στον client. Υπάρχει περίπτωση, όμως, ο server να απαιτεί και επιπλέον πιστοποιήσεις. Η τελική απάντηση, λοιπόν, του server πρέπει να είναι είτε SSH_MSG_USERAUTH_SUCCESS (όταν δεν χρειάζεται περαιτέρω πιστοποίηση και η υπογραφή ήταν έγκυρη) είτε SSH_MSG_USERAUTH_FAI-LURE
(όταν περισσότερες πιστοποιήσεις χρειάζονται ή η αίτηση απέτυχε).
Χρήση Μυστικού Κωδικού (Password Authentication)
Όλες οι SSH εφαρμογές θα πρέπει να υποστηρίζουν αυτή την μέθοδο. Τα παρακάτω πακέτα χρησιμοποιούνται:
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service
string "password"
boolean FALSE
string plaintext password (ISO-10646 UTF-8)
Παρ' όλο που ο κωδικό μεταδίδεται μη κρυπτογραφημένος μέσα στο πακέτο, ολόκληρο το πακέτο κρυπτογραφείται από το
Transport Layer Protocol. Κανονικά, θα πρέπει να ελεγχθεί κατά πόσο είναι ενεργοποιημένος κάποιος αλγόριθμος κρυπτογράφησης. Εάν δεν εξασφαλίζεται η εμπιστευτικότητα της επικοινωνίας, τότε αυτή η μέθοδος θα πρέπει να πάψει να θεωρείται διαθέσιμη.Ο
server μπορεί να ζητήσει από τον χρήστη να αλλάξει κωδικό με το παρακάτω μήνυμα: byte SSH_MSG_USERAUTH_PASSWD_CHANGEREQstring prompt (ISO-10646 UTF-8)
string language tag (as defined in RFC 1766)
Ο
client, μετά από υπόδειξη του χρήστη, μπορεί να ανταποκριθεί με τον καινούργιο κωδικό. Ο χρήστης μπορεί να αλλάξει τον κωδικό του χωρίς να του ζητηθεί από τον server.byte SSH_MSG_USERAUTH_REQUEST
string user name
string service
string "password"
boolean TRUE
string plaintext old password (ISO-10646 UTF-8)
string plaintext new password (ISO-10646 UTF-8)
Χρήση της Δημόσιας Κλείδας του Client
(Host-Based Authentication)Μερικά
sites επιθυμούν να επιτρέψουν πιστοποίηση του χρήστη, βασιζόμενη στην μηχανή-client που βρίσκεται αυτός σε συνδυασμό με το όνομα του. Παρ' όλο που δεν συνιστάται δίκτυα υψηλής ασφάλειας, μπορεί να είναι πολύ βολική για μερικά περιβάλλοντα. Είναι προαιρετική η υποστήριξη της μεθόδου και πρέπει να τηρείται προσοχή ώστε ο χρήστης να μην έχει την δυνατότητα να αποκτήσει την δημόσια κλείδα του client.Η μέθοδος λειτουργεί με την αποστολή υπογραφής που έχει δημιουργηθεί με την ιδιωτική κλείδα του
client, την οποία ελέγχει ο server με την δημόσια κλείδα του client. Το μήνυμα έχει ως εξής:byte SSH_MSG_USERAUTH_REQUEST
string user name
string service
string "hostbased"
string public key algorithm for host key
string public host key and certificates for client host
string client host name (FQDN; US-ASCII)
string client user name on the remote host (ISO-10646 UTF-8)
string signature
Οι αλγόριθμοι έχουν διαπραγματευτεί στο
Transport Layer Protocol. Η υπογραφή προκύπτει από το session identifier και τα περιεχόμενα του payload του πακέτου. Ο server πρέπει να επιβεβαιώσει η δημόσια κλείδα ανήκει όντως στον client, ότι ο χρήστης επιτρέπεται να συνδεθεί και ότι η υπογραφή είναι έγκυρη.5.7.6 Connection Protocol
Το
Connection Protocol έχει σχεδιαστεί για να τρέχει πάνω από το SSH Transport Layer Protocol και το User Authentication Protocol. Παρέχει interactive login session, απομακρυσμένη εκτέλεση εντολών, προώθηση TCP/IP και Χ11 συνδέσεων. Οι υπηρεσίες του έπονται των υπηρεσιών του User Authentication Protocol και αναγνωρίζονται από το όνομα "ssh-connection".Ο Μηχανισμός των Καναλιών
Όλες τερματικές
sessions, οι προωθημένες TCP/IP και Χ11 συνδέσεις, η απομακρυσμένη εκτέλεση εντολών κ.α. αποτελούν κανάλια. Οποιαδήποτε πλευρά μπορεί να ανοίξει ένα κανάλι και πολλαπλά λογικά κανάλια πολυπλέκονται σε ένα φυσικό.Τα κανάλια αναγνωρίζονται από μοναδικούς αριθμούς διαφορετικούς σε κάθε πλευρά. Όταν οποιοδήποτε άκρο επιθυμεί την δημιουργία καναλιού, ετοιμάζει αίτηση που περιέχει τον αριθμό που έχει αντιστοιχήσει τοπικά στο κανάλι, ώστε ο αποδέκτης της αίτησης να μπορεί στην συνέχεια για να προσδιορίζει το κανάλι χρησιμοποιώντας αυτόν τον αριθμό.
Τα κανάλια είναι ελεγχόμενης ροής δεδομένων (
flow-controlled), που σημαίνει ότι δεν αποστέλλονται δεδομένα έως ότου παραληφθεί μήνυμα που να δηλώνει ότι υπάρχει ελεύθερος χώρος στο παράθυρο.Δημιουργία Καναλιών
Όταν επιθυμείται η δημιουργία καναλιού και αφού το καινούργιο κανάλι έχει αντιστοιχηθεί με κατάλληλο αριθμό αναγνώρισης, στέλνεται το ακόλουθο μήνυμα στο άλλο άκρο:
byte SSH_MSG_CHANNEL_OPEN
string channel type (restricted to US-ASCII)
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
... channel type specific data follows
Το πεδίο
channel type περιγράφει τον τύπο του καναλιού που επιθυμεί ο αποστολέας να δημιουργήσει. Στο πεδίο sender channel περιέχεται ο αριθμός που έχει αντιστοιχήσει ο αποστολέας στο κανάλι. Στο initial window size καθορίζεται πόσα bytes Δεδομένων μπορούν να σταλούν μέσα από το κανάλι αρχικά, χωρίς να χρειάζεται να ξαναρυθμιστεί το μέγεθος του. Τέλος, το maximum packet size καθορίζει τον μέγιστο μέγεθος κάθε πακέτου που δέχεται ο αποστολέας της αίτησης.Το απομακρυσμένο σύστημα αποφασίζει κατά πόσο μπορεί να ανοίξει το κανάλι και ανταποκρίνεται είτε με
byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION
uint32 recipient channel
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
... channel type specific data follows
όπου
recipient channel είναι ο αριθμός καναλιού του συστήματος που ξεκίνησε την διαδικασία και sender channel είναι ο αριθμός του αποστολέα του παρών μηνύματος, είτε μεbyte SSH_MSG_CHANNEL_OPEN_FAILURE
uint32 recipient channel
uint32 reason code
string additional textual information (ISO-10646 UTF-8
[RFC-2044])
string language tag (as defined in [RFC-1766])
Εάν ο αποδέκτης του αρχικού SSH_MSG_CHANNEL_OPEN μηνύματος δεν υποστηρίζει το ζητούμενο κανάλι, τότε απλά απαντά με το SSH_MSG_CHANNEL_O- PEN_FAILURE. Στο πεδίο
reason code περιέχεται ακέραιος που υποδηλώνει την αιτία που δεν μπορούσε να δημιουργηθεί το κανάλι. Στο παρακάτω πίνακα βλέπουμε τους κωδικούς με την σημασία τους.SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1
SSH_OPEN_CONNECT_FAILED 2
SSH_OPEN_UNKNOWN_CHANNEL_TYPE 3
SSH_OPEN_RESOURCE_SHORTAGE 4
Μεταφορά Δεδομένων
Το μέγεθος του παραθύρου
(window size) καθορίζει πόσα bytes μπορεί να στείλει η άλλη οντότητα χωρίς να χρειάζεται η εκ νέού ρύθμιση του μεγέθους του. Το ακόλουθο μήνυμα χρησιμοποιείται για την ρύθμιση του παραθύρου.byte SSH_MSG_CHANNEL_WINDOW_ADJUST
uint32 recipient channel
uint32 bytes to add
Με αυτό το μήνυμα το μέγεθος του παραθύρου αυξάνεται σύμφωνα με το ποσό που ορίζεται στο πεδίο
bytes to add. Η μεταφορά δεδομένων γίνεται με μηνύματα του τύπου:byte SSH_MSG_CHANNEL_DATA
uint32 recipient channel
string data
Το μέγιστο πόσο δεδομένων που επιτρέπεται να σταλεί είναι ίσο με το μέγεθος του παραθύρου, το οποίο μειώνεται με κάθε αποστολή. Και οι δύο πλευρές μπορούν να αγνοήσουν τα δεδομένα που στέλνονται όταν το παράθυρο έχει γεμίσει.
Κλείσιμο Καναλιών
Όταν κάποιος από τους συνδιαλλέγοντες δεν θα στείλει άλλα δεδομένα στο κανάλι, θα πρέπει να στείλει το εξής μήνυμα:
byte SSH_MSG_CHANNEL_EOF
uint32 recipient_channel
Η σύνδεση δεν διακόπτεται, απλά τερματίζεται η αποστολή δεδομένων σε μία από τις δύο κατευθύνσεις. Στην άλλη κατεύθυνση η ροή των δεδομένων συνεχίζεται κανονικά. Για το μήνυμα αυτό δεν υπάρχει σαφής απάντηση και το ίδιο δεν καταλαμβάνει χώρο από το παράθυρο και μπορεί να σταλεί ακόμα και αν δεν υπάρχει διαθέσιμος χώρος.
Όταν οποιοσδήποτε από τους δύο επιθυμεί να τερματίσει το κανάλι, στέλνει το μήνυμα
byte SSH_MSG_CHANNEL_CLOSE
uint32 recipient_channel
το οποίο πρέπει να απαντηθεί με παρόμοιο μήνυμα από τον παραλήπτη του. Το κανάλι θεωρείται ότι έχει κλείσει για ένα άκρο όταν έχει στείλει και παραλάβει το μήνυμα αυτό και συνεπώς ο αριθμός του καναλιού μπορεί να ξαναχρησιμοποιηθεί. Η αποστολή του μηνύματος δεν προϋποθέτει την αποστολή του
SSH_MSG_CHANNEL_ EOF. Ομοίως, το μήνυμα δεν καταλαμβάνει χώρο από το παράθυρο.Αιτήσεις Σχετικές με Κανάλια
Για πολλούς τύπους καναλιών, υπάρχουν αιτήσεις εξυπηρέτησης που είναι συγκεκριμένες για κάθε κανάλι. Αυτές οι αιτήσεις αναφέρονται σε υπηρεσίες που μπορεί αν προσφέρει το κανάλι. Παράδειγμα είναι η αίτηση για ένα
pseudo terminal για ένα κανάλι interactive session.Όλες οι αιτήσεις έχουν την εξής μορφή:
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string request type (restricted to US-ASCII)
boolean want reply
... type-specific data
Εάν το πεδίο
want reply είναι "FALSE", τότε δεν θα σταλεί απάντηση στην αίτηση. Διαφορετικά, η απάντηση θα είναι μία από τις παρακάτω:byte SSH_MSG_CHANNEL_SUCCESS
uint32 recipient_channel
ή
byte SSH_MSG_CHANNEL_FAILURE
uint32 recipient_channel
Εάν η αίτηση δεν αναγνωρίζεται ή δεν υποστηρίζεται για το κανάλι το
SSH_MSG_CHANNEL_FAILURE επιστρέφεται. Όλα τα παραπάνω μηνύματα δεν καταναλώνουν τον διαθέσιμο χώρο του παραθύρου.Στον παρακάτω πίνακα παρουσιάζονται όλοι οι κυριότεροι τύποι καναλιών και οι αντίστοιχες αιτήσεις.
Channel |
Channel Type |
Request |
Request Type |
INTERACTIVE SESSION |
"session" |
PSEUDO TERMINAL | "pty-req" |
X11 FORWARDING | "x11-req" |
||
AUTHENTICATION AGENT | "auth-agent-req" |
||
ENVIRONMENT VARIABLE PASSING | "env" |
||
SHELL | "shell" |
||
COMMAND | "exec" |
||
SUBSYSTEM | "subsystem" |
||
SIGNAL | "signal" |
||
RETURNING EXIT STATUS | "exit-status" |
||
X11 CHANNEL |
"x11" |
- |
- |
AUTHENTICATION AGENT |
"auth=agent" |
- |
- |
TCP/IP FORWARDING |
"forwarded-tcpip" |
||
- |
- |
PORT FORWARDING |
"tcpip-forward" |
Τα κανάλια
X11 και AUTHENTICATION AGENT έπονται πάντα των αιτήσεων X11 FORWARDING και AUTHENTICATION AGENT REQUEST, διαφορετικά δεν γίνονται δεκτά. Ομοίως και το κανάλι TCP/IP FORWARDING το οποίο ακολουθεί πάντα μία αίτηση PORT FORWARDING.5.7.7
Παρεχόμενη ΠροστασίαΤο SSH προστατεύει απέναντι στις εξής επιθέσεις:
Με άλλα λόγια, το SSH δεν εμπιστεύεται ποτέ το δίκτυο και κάποιος που έχει καταλάβει το δίκτυο μπορεί μόνο να αναγκάσει το SSH να αποσυνδεθεί.
Όλα αυτά ισχύουν όμως με την προϋπόθεση ότι δεν είναι δυνατή η απόκτηση
root access με άλλα μέσα. Σε αυτήν την περίπτωση το SSH δεν μπορεί να βοηθήσει σε τίποτα.5.7.8
Θέματα ΑσφάλειαςΌσο αναφορά το
SSH Transport Layer Protocol, είναι αναμενόμενο ότι μερικές φορές θα χρησιμοποιείται χωρίς αξιόπιστη συσχέτιση μεταξύ των δημοσίων κλείδων των μηχανών και της ταυτότητας των μηχανών. Τέτοια χρήση του πρωτοκόλλου είναι ανασφαλής, άλλα μπορεί να παρέχει ικανοποιητική ασφάλεια σε κάποια συστήματα.Όταν το
SSH Transport Layer Protocol δεν υποστηρίζει την κρυπτογράφηση των πακέτων, τότε οι μέθοδοι πιστοποιήσεις ταυτότητας του SSH User Authentication Protocol βασίζονται στην ανταλλαγή μυστικών δεδομένων, θα πρέπει να απαγορεύονται.Τέλος, παρά την ασφάλεια που προστίθεται στις Χ11 συνδέσεις και στην προώθηση των TCP/IP πορτών, είναι προτιμότερο οι εφαρμογές του SSH να αποφεύγουν την υποστήριξη τους, καθ' ότι τα
firewalls δεν μπορούν να εξετάσουν την κυκλοφορία λόγω του κρυπτογραφημένου καναλιού.5.7.9
Περαιτέρω ΠληροφορίεςΣτις ακόλουθες ηλεκτρονικές σελίδες διατίθονται πιο αναλυτικές πληροφορίες για το SSH πρωτόκολλο:
SSH - Welcome - SSH 2.0 Protocol Specifications -- http://www.ssh.fi/drafts/
SSH - Products - SSH Protocol --
http://www.ssh.fi/sshprotocols2/standardization.html
SSH – Welcome -- http://www.ssh.fi/