Βασικές Έννοιες

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 που θα περιγράψουμε αργότερα.

Συνοπτικά, τα βήματα εγκαθίδρυσης της σύνδεσης είναι:

  1. Ζεύξη των δύο σημείων.
  2. Ανταλλαγή της ακολουθίας "SSH-protoversion-softwareversion-comments".
  3. Διαπραγμάτευση αλγορίθμων κρυπτογράφησης και MAC και πιστοποίηση ταυτότητας του server.
  4. Αίτηση εξυπηρέτησης από τον client στον sever.
  5. Ανταλλαγή περαιτέρω δεδομένων.

Τα δύο πρώτα βήματα συζητήθηκαν στο παρών κεφάλαιο. Παρακάτω θα αναφερθούμε στα υπόλοιπα βήματα.

Διαπραγμάτευση Αλγορίθμων

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

Η πιστοποίηση της ταυτότητας μπορεί να είναι υπονοούμενη και μετά από αυτήν ακολουθεί η αίτηση εξυπηρέτησης του 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_CHANGEREQ

string 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/

Βασικές Έννοιες