Τι είναι το πρωτόκολλο SSH (Secure Shell)

Το SSH είναι ένα πρωτόκολλο που παρέχει ασφαλή απομακρυσμένη πρόσβαση σε υπολογιστές πάνω από ένα μη ασφαλές δίκτυο. Η υλοποίηση του SSH το καθιστά απλό και φθηνό. Το SSH1 παρείχε ασφαλής απομακρυσμένη πρόσβαση και δημιουργήθηκε με σκοπό να αντικαταστήσει το TELNET και άλλα σχήματα τα οποία δεν ήταν αρκετά ασφαλή. Το πρωτόκολλο SSH βασίζεται στο μοντέλο πελάτη - εξυπηρετητή (client - server) και χρησιμοποιείται για να προστατέψει δικτυακές λειτουργίες όπως μεταφοράς αρχείου και ηλεκτρονικού ταχυδρομείου. Η νεότερη έκδοση SSH2 παρέχει, ένα τυποποιημένο ορισμό και βελτιώνει κατά πάρα πολύ το SSH1. Το SSH είναι ευρέως διαδεδομένο στα περισσότερα ανοικτά συστήματα και έχει καθιερωθεί ως η κυριότερη ή η πιο συχνή επιλογή για απομακρυσμένη πρόσβαση μεταξύ υπολογιστικών συστημάτων. Το SSH είναι οργανωμένο σε τρία πρωτόκολλα όπου τρέχουν πάνω από το TCP και τα οποία είναι:


  1. Το πρωτόκολλο επιπέδου μεταφοράς SSH (SSH Transport layer protocol) παρέχει πιστοποίηση ταυτότητας του εξυπηρετητή (server), ακεραιότητα των δεδομένων και εξασφάλιση του απόρρητου της συναλλαγής. Προαιρετικά μπορεί να εφαρμόσει και συμπίεση δεδομένων. Τυπικά τρέχει από μια TCP/IP σύνδεση.

  2. Το πρωτόκολλο πιστοποίησης χρήστη SSH (SSH User Authentication protocol) πιστοποιεί την ταυτότητα του πελάτη (client) ως προς τον διακομιστή (server). Τρέχει πάνω από το επίπεδο μεταφοράς.

  3. Το πρωτόκολλο σύνδεσης SSH (SSH Connection Protocol) πολυπλέκει το κρυπτογραφημένο φυσικό κανάλι σε αρκετά λογικά κανάλια και τρέχει πάνω από το User Authentication πρωτόκολλο.


Δημόσια και ιδιωτικά κλειδιά στο SSH

Κάθε πελάτης (client) και εξυπηρετητής (server) πρέπει να έχουν στην κατοχή τους ένα ζευγάρι ιδιωτικού - δημόσιου κλειδιού έτσι ώστε να μπορεί να είναι εφικτή η επαλήθευση των ταυτοτήτων τους μεταξύ του. Επιτρέπεται να έχει είτε ο πελάτης (client) είτε ο διακομιστής (server) περισσότερα από ένα ζευγάρια κλειδιών, όταν βέβαια χρησιμοποιούνται με διαφορετικούς αλγορίθμους. Επίσης η από κοινού χρήση ζεύγους κλειδιών από πολλούς διακομιστές (servers) δεν απαγορεύεται. Για να μπορέσει ο πελάτης (client) να επαληθεύσει με εύκολο τρόπο την ταυτότητα ενός διακομιστή (server) είναι απαραίτητο να γνωρίζει το δημόσιο κλειδί που αντιστοιχεί στον διακομιστή (server) που επιθυμεί να πραγματοποιήσει συνδιαλλαγή πληροφοριών. Υπάρχουν δύο διαφορετικά μοντέλα που εξασφαλίζουν την προϋπόθεση αυτή:


  1. Στο πρώτο μοντέλο ο πελάτης έχει αποθηκευμένα σε μια τοπική βάση δεδομένων τα ονόματα των servers και τα δημόσια κλειδιά που συσχετίζονται με αυτούς. Αυτή η μέθοδος δεν απαιτεί μια κεντρική διαχείριση κλειδιών από τρίτους το μειονέκτημα είναι η διαχείριση και συντήρηση της βάσης δεδομένων.


  2. Στο δεύτερο μοντέλο εμπλέκεται μια έμπιστη αρχή πιστοποίησης (Certification Authority - CA) όπου πιστοποιεί τα δημόσια κλειδιά των servers και αν είναι έμπιστοι ή όχι. Το πρόγραμμα του πελάτη γνωρίζει μόνο το δημόσιο κλειδί της αρχής πιστοποίησης και μπορεί να επιβεβαιώσει την εγκυρότητα των κλειδιών που έχουν πιστοποιηθεί από αυτήν. Ο πελάτης δεν χρειάζεται να έχει μια βάση δεδομένων καθότι χρειάζεται να αποθηκεύσει μόνο ένα κλειδί αλλα το μειονέκτημα είναι ότι η πιστοποίηση κάθε κλειδιού είναι χρονοβόρα και περίπλοκη διαδικασία.

Πρωτόκολλο επιπέδου μεταφοράς SSH

Το πρωτόκολλο επιπέδου μεταφοράς του SSH όπως αναφέραμε και προηγουμένως παρέχει ισχυρή κρυπτογράφηση, πιστοποίηση του εξυπηρετητή (server) και ακεραιότητα των δεδομένων. Σε αυτό το επίπεδο λαμβάνει χώρα η διαπραγμάτευση των αλγορίθμων ανταλλαγής κλειδιών, συμμετρικής κρυπτογράφησης, ασύμμετρης κρυπτογράφησης, hash, ο κώδικας αυθεντικοποίησης μηνύματος (Message Authentication Code - MAC). Η πιστοποίηση ταυτότητας σε αυτό το επίπεδο αναφέρεται μόνο σε πιστοποίηση υπολογιστικών συστημάτων και όχι χρηστών. Το πρωτόκολλο αυθεντικοποίησης χρήστη (User Authentication Protocol - UAP) αναλαμβάνει την επιβεβαίωση της ταυτότητας των χρηστών. Έχει σχεδιαστεί για να είναι απλό, ευέλικτο, να επιτρέπει την διαπραγμάτευση παραμέτρων και να χρησιμοποιεί έναν ελάχιστο αριθμό απαραιτήτων μηνυμάτων για την εγκαθίδρυση σύνδεσης. Για στα περισσότερα περιβάλλοντα έχει υπολογιστεί ότι ένας αριθμός δύο ανταλλαγών (round-trips) είναι αρκετός για πλήρη επικοινωνία όλων των απαραίτητων πληροφοριών. Η χειρότερη περίπτωση είναι τρία round - trips.



Ανταλλαγή πακέτων στο πρωτόκολλο
επιπέδου μεταφοράς SSH

Εγκατάσταση σύνδεσης στο πρωτόκολλο επιπέδου μεταφοράς SSH


  • Την διαδικασία ξεκινά ο πελάτης (client), ενώ ο διακομιστής (server) χρησιμοποιεί την θύρα 22 για να ανταποκρίνεται στις επερχόμενες κλείσεις για σύνδεση.


  • Όταν επιτευχθεί η σύνδεση μεταξύ των δύο οντοτήτων, στην συνέχεια πρέπει να στείλουν μια ακολουθία χαρακτήρων που έχουν την μορφή:



  • SSH-protoversion-softwareversion-comments



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


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





Σχηματισμός πακέτου στο πρωτόκολλο επιπέδου μεταφοράς SSH

  • Μέγεθος Πακέτου (pktl): Το μήκος πακέτου σε bytes.

  • Μήκος Padding (pdl): Το μήκος των επιπλέον bits που προστέθηκαν

  • Ωφέλιμο φορτίο (payload): Αποτελεί τις χρήσιμες πληροφορίες ενός πακέτου.

  • Κώδικας Αυθεντικοποίησης Μηνύματος - MAC: Αυτό το πεδίο περιέχει την τιμή MAC η οποία υπολογίζεται σε ολόκληρο το πακέτο συν έναν αριθμό ακολουθίας όπου είναι μήκους 32 bit. Στο πρώτο πακέτο η τιμή που θα πάρει ο αριθμός ακολουθίας θα είναι 0 και στα υπόλοιπα πακέτα ο αριθμός θα είναι κατά αύξουσα σειρά (π.χ. 2ο πακέτο τιμή 1, 3ο πακέτο τιμή 2 κλπ). Ο αριθμός ακολουθίας δεν συμπεριλαμβάνεται στα πακέτα απαντητικά πακέτα.

Όταν ο αλγόριθμος κρυπτογράφηση τεθεί σε λειτουργία τότε ολόκληρο το πακέτο (χωρίς το πεδίο MAC) κρυπτογραφείται όταν βέβαια υπολογιστεί και η τιμή MAC. Tο πακέτο επιπέδου μεταφοράς SSH αποτελείται από τα εξής βήμα. Αρχικά ο πελάτης (client)στέλνει ένα πακέτο το οποίο περιέχει μια αναγνωριστική συμβολοσειρά:


SSH-protoversion-softwareversion SP comments CR LF

Όπου SP, CR και LF είναι κενοί χαρακτήρες, μεταφορά μετ 'επιστροφής και αλλαγής γραμμής, αντίστοιχα. Ένα παράδειγμα μιας έγκυρης συμβολοσειράς είναι το SSH-2.0-billsSSH_3.6.3q3. O διακομιστής (server) απαντά με μια δική του αναγνωριστική συμβολοσειρά. Αυτές οι συμβολοσειρές χρησιμοποιούνται και στον αλγόριθμο Diffie-Helman στην εναλλαγή κλειδιών.


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



Cipher Περιγραφή
3des-cbc* Three-key Triple Digital Encryption Standard (3DES) in Cipher-Block-Chaining (CBC) mode
blowfish-cbc Blowfish in CBC mode
twofish256-cbc Twofish in CBC mode with a 256-bit key
twofish192-cbc Twofish with a 192-bit key
twofish128-cbc Twofish with a 128-bit key
aes256-cbc Advanced Encryption Standard (AES) in CBC mode with a 256-bit key
aes192-cbc AES with a 192-bit key
aes128-cbc** AES with a 192-bit key
Serpent256-cbc Serpent in CBC mode with a 256-bit key
Serpent192-cbc Serpent with a 192-bit key
Serpent192-cbc Serpent with a 192-bit key
Serpent128-cbc Serpent with a 128-bit key
arcfour RC4 with a 128-bit key
cast128-cbc CAST-128 in CBC mode
hmac-sha1* HMAC-SHA1; Digest length = Key length = 20
hmac-sha1-96** First 96 bits of HMAC-SHA1; Digest length = 12; Key length = 20
hmac-md5 HMAC-SHA1; Digest length = Key length = 16
hmac-md5-96 First 96 bits of HMAC-SHA1; Digest length = 12; Key length = 16
none* No compression
zlib Defined in RFCs 1950 and 1951

* = Απαιτείται
** = Προτείνεται

SSH αλγόριθμοι κρυπτογράφησης



Το επόμενο βήμα είναι η ανταλλαγή κλειδιών. Επιτρέπονται κι άλλες εναλλακτικές μέθοδοι ανταλλαγής κλειδιών αλλά εδώ θα αναφέρουμε μόνο τις δύο εκδοχές του Diffie-Helman. Οι δύο αυτές εκδόσεις περιγράφονται στο RFC 2409 και απαιτούν μόνο ένα πακέτο σε κάθε κατεύθυνση. Εμπλέκονται τα παρακάτω βήματα στην ανταλλαγή κλειδιών. Στο παράδειγμα μας έχουμε τις παρακάτω οντότητες:

  • Όπου C είναι ο πελάτης (client),

  • Όπου S είναι ο διακομιστής (server),

  • Όπου p μια μεγάλη αρχική θυρίδα,

  • Όπου g είναι μια γεννήτρια (generator) για κάθε υπο-γκρούπ GF(p)

  • Όπου q η σειρά ενός υπο-γκρούπ

  • Όπου V_S είναι μια αναγνωριστική συμβολοσειρά S

  • Όπου V_C είναι μια αναγνωριστική συμβολοσειρά C

  • Όπου Κ_S είναι το δημόσιο κλειδί του S

  • Όπου I_C είναι το C μήνυμα SSH_MSG_KEXINIT

  • Και όπου I_S είναι το S SSH_MSG_KEXINIT μήνυμα το οποίο ανταλλάχτηκε

Οι τιμές p, g και q είναι γνωστές στον client και server ως αποτέλεσμα διαπραγμάτευσης του αλγορίθμου. Η hash συνάρτηση κατακερματισμού κατά την διάρκεια της διαπραγμάτευσης του αλγορίθμου


  1. Ο πελάτης C παράγει έναν τυχαίο αριθμό x (1 < x < q), υπολογίζει e = gx. Στην συνέχεια ο πελάτης C στέλνει το e που υπολόγισε στον διακομιστή (server) S.

  2. Ο διακομιστής S δημιουργεί έναν τυχαίο αριθμό y (0 < y < q) και υπολογίζει το f = gy mod p κι αφού λάβει το e από τον πελάτη C θα υπολογίσει το k = ey mod p, H = hash (V_C || V_S || I_C || V_S || K_S || e || f || K ), και υπογράφει το H με το ιδιωτικό του κλειδί. Ο εξυπηρετητής S στέλνει (K_S || f || s ) στον πελάτη C.

  3. Ο πελάτης C πιστοποιεί ότι το δημόσιο κλειδί του S server (K_S) είναι όντως δικό του (για παράδειγμα, χρησιμοποιώντας πιστοποιητικά ή βάσεις δεδομένων). Ο πελάτης C μπορεί επίσης να αποδεχτεί το κλειδί είναι όντως του S χωρίς να προβεί σε διαδικασίες πιστοποίησης, αυτό βέβαια καθιστά το πρωτόκολλο ιδιαίτερα ευαίσθητο σε ενεργητικές επιθέσεις. Στην συνέχεια ο πελάτης C υπολογίζει το Κ = fy mod p, H = hash (V_C || V_S || I_C || V_S || K_S || e || f || K ) και πιστοποιεί την υπογραφή του εξυπηρετητή S στον H.

Ως αποτέλεσμα αυτών των βημάτων, οι δύο μεριές μπορούν σε αυτό το σημείο να μοιραστούν ένα γενικό κλειδί (master key) Κ. Επιπροσθέτως ο διακομιστής (server) έχει επικυρωθεί στον πελάτη (client) καθότι ο πρώτος χρησιμοποίησε το δικό του ιδιωτικό κλειδί για να υπογράψει το ήμισυ της Diffie-Helman ανταλλαγής. Τέλος η τιμή κατακερματισμού H χρησιμεύει ως αναγνωριστικό συνόδου για αυτή τη σύνδεση. Όταν υπολογιστεί, η αναγνωριστική σύνοδος δεν αλλάζει, ακόμη κι αν η ανταλλαγή κλειδιού ξανά πραγματοποιηθεί γι’ αυτήν την σύνδεση.

Το τελικό βήμα είναι η υπηρεσία αιτήματος. Ο πελάτης (client) στέλνει ένα πακέτο SSH_MSG_SERVICE_REQUEST για να ζητήσει είτε πιστοποίηση χρήστη είτε το πρωτόκολλο σύνδεσης. Μετέπειτα από την εν λόγω αίτησή, όλα τα δεδομένα που ανταλλάσσονται ως ωφέλιμο φορτίο ενός πακέτου πρωτόκολλο επιπέδου μεταφοράς SSH θωρακισμένο με επαρκή κρυπτογράφηση.

Τα κλειδιά που χρησιμοποιούνται για κρυπτογράφηση δημιουργούνται από τα ανταλλασσόμενα μυστικά κλειδιά K, την τιμή συναρτήσεως κατακερματισμού από την ανταλλαγή των H κλειδιών, και το αναγνωριστικό συνόδου, τα οποία είναι ίσα με το H εκτός αν υπάρχει μια επακόλουθη ανταλλαγή κλειδιών μετά την αρχική ανταλλαγή κλειδιών. Οι τιμές υπολογίζονται ως εξής:

  • Initial IV client to server: HASH(K || H || "A" || session_id)

  • Initial IV server to client: HASH(K || H || "B" || session_id)

  • Encryption key client to server: HASH(K || H || "C" || session_id)

  • Encryption key server to client: HASH(K || H || "D" || session_id)

  • Integrity key client to server: HASH(K || H || "E" || session_id)

  • Integrity key server to client: HASH(K || H || "F" || session_id)

Όπου HASH() είναι η συνάρτηση κατακερματισμού που καθορίζεται κατά την διαπραγμάτευση του αλγορίθμου


SSH User Authentication protocol

Το πρωτόκολλο αυθεντικοποίησης χρήστη του SSH παρέχει όλα τα μέσα έτσι ώστε ο πελάτης (client) να έχει την δυνατότητα να μπορεί να πιστοποιήσει την ταυτότητα ενός διακομιστή (server). Υπάρχουν τρείς τύποι μηνυμάτων που χρησιμοποιούνται στο πρωτόκολλο αυθεντικοποίησης χρήστη και έχουν την εξής δομή:


Όπου username είναι η εξουσιοδοτημένη ταυτότητα ενός πελάτη (client) δηλαδή το όνομα χρήστη - hostname, το service name ή όνομα υπηρεσίας είναι ο μηχανισμός κατά τον οποίο ένας πελάτης (client) στέλνει μια αίτηση πρόσβασης (τυπικά το SSH πρωτόκολλο σύνδεσης) και το όνομα μεθόδου (method name) όπου είναι μια μέθοδος πιστοποίησης που χρησιμοποιείται για τις αιτήσεις πρόσβασης. Το πρώτο byte έχει μια τιμή η οποία είναι η 50 και ερμηνεύεται ως SSH_MSG_USERAUTH_REQUEST.

Εάν ο διακομιστής (server) απορρίψει την αίτηση αυθεντικοποίησης είτε δεχτεί μια αίτηση που απαιτεί μια ή περισσότερες μεθόδους αυθεντικοποίησης, τότε στέλνει ένα μήνυμα που έχει την παρακάτω δομή:


Όπου name-list ή όνομα λίστας είναι μια λίστα με μεθόδους οι οποίοι μπορούν να συνεχίζουν να παράγουν τον διάλογο. Εάν ο διακομιστής (server) αποδεχτεί την διαδικασία αυθεντικοποίησης, στέλνει ένα sigle-byte μήνυμα, SSH_MSG_USERAUTH_SUCCESS (52).


Η ανταλλαγή μηνυμάτων έχει ως εξής:


  • Ο πελάτης (client) στέλνει αρχικά ένα SSH_MSG_USERAUTH_REQUEST μήνυμα.

  • Στην συνέχεια o διακομιστής κάνει έλεγχο για να καθορίσει αν το όνομα χρήστη (username) είναι έγκυρο. Σε περίπτωση που δεν είναι τότε επιστρέφει ένα μήνυμα SSH_MSG_USERAUTH_FAILURE και με partial success value ως false. Αν το όνομα χρήστη (username) είναι έγκυρο τότε ο διακομιστής συνεχίζει στο 3ο βήμα.

  • Ο διακομιστής (server) επιστρέφει ένα SSH_MSG_USERAUTH_FAILURE μήνυμα με μια λίστα από μια ή περισσότερες μεθόδους αυθεντικοποίησης (authentication methods) που μπορούν να χρησιμοποιηθούν.

  • Ο πελάτης (client) επιλέγει μια απο τις αποδεκτές μεθόδους αυθεντικποίησης και στέλνει ένα μήνυμα SSH_MSG_USERAUTH_REQUEST. Επίσης συμπληρώνει στο πεδίο μεθόδου την μέθοδο αυθεντικοποίησης που επέλεξε. Σε αυτό το σημείο, μπορεί να υπάρξει μια ακολουθία ανταλλαγών για την εκτέλεση της μεθόδου.

  • Εάν η διαδικασία αυθεντικοποίησης είναι επιτυχής και απαιτούνται περισσότερες μέθοδοι αυθεντικοποίησης τότε ο διακομιστής (server) προχωράει στο 3ο βήμα, χρησιμοποιώντας το partial success value ως false.


Όταν όλες οι μέθοδοι πιστοποίησης έχουν επιτευχθεί, ο διακομιστής (server) στέλνει ένα SSH_MSG_USERAUTH_SUCCESS μήνυμα, και το πρωτόκολλο αυθεντικοποίησης έχει τερματιστεί. Ο διακομιστής (server) μπορεί να χρειαστεί μια ή περισσότερες από τις παρακάτω μεθόδους πιστοποίησης:


  1. δημόσιο κλειδί (public key): Οι λεπτομέρειες αυτής της μεθόδου εξαρτώνται απο τον αλγόριθμο δημόσιου κλειδιού που έχει επιλεχθεί. Για παράδειγμα, ο πελάτης (client) στέλνει ένα μήνυμα στον διακομιστή (server) που περιέχει το δημόσιο κλειδί του πελάτη, το οποίο μήνυμα έχει υπογραφτεί με το ιδιωτικό κλειδί του πελάτη. Όταν ο διακομιστής (server) παραλάβει αυτό το μήνυμα, ελέγχει εάν το παρεχόμενο κλειδί είναι αποδεκτό για αυθεντικοποίηση και αν είναι όντως, τότε ελέγχει εάν η υπογραφή είναι σωστή.

  2. Κωδικός (password): Ο πελάτης στέλνει ένα μήνυμα που περιέχει ένα απλό κείμενο κωδικού (plaintext password) όπου αυτό είναι προστατευμένο από το πρωτόκολλο επίπεδου μεταφοράς.

  3. hostbased: Η διαδικασία αυθεντικοποίησης εφαρμόζεται στον host πελάτη (host client) παρά στον ίδιο τον πελάτη. Έτσι, ένας host που υποστηρίζει πολλαπλούς πελάτης (clients) θα παρέχει πιστοποίηση για όλους αυτούς. Η δομή αυτής της μεθόδου βάζει τον πελάτη στην διαδικασία να στείλει μια υπογραφή που αυτή δημιουργείται με το ιδιωτικό κλειδί του host πελάτη (host client). Με αυτόν τον τρόπο ο διακομιστής SSH (SSH Server) αντί να πιστοποιεί την ταυτότητα κάθε χρήστη, πιστοποιεί μόνο την ταυτότητα του host πελάτη και θεωρεί με αυτόν τον τρόπο ότι ο κάθε χρήστης έχει πιστοποιηθεί.

Πρωτόκολλο σύνδεσης SSH (SSH Connection Protocol)

Το πρωτόκολλο σύνδεσης SSH (SSH Connection Protocol) τρέχει πάνω από το πρωτόκολλο επιπέδου μεταφοράς SSH και υποθέτει ότι υπάρχει ήδη μια ασφαλής πιστοποιημένη σύνδεση σε χρήση. Η ασφαλής πιστοποίηση της σύνδεσης αναφέρεται ως tunnel (σήραγγες), και χρησιμοποιείται απ' το πρωτόκολλο σύνδεσης για να πολυπλέκει έναν αριθμό από λογικά κανάλια. Στο RFC 4254 αναφέρεται ότι το πρωτόκολλο σύνδεσης SSH τρέχει πάνω απο το πρωτόκολλο επιπέδου μεταφοράς και πιστοποίησης χρήστη SSH ενώ στο RFC 4251 (αρχιτεκτονική του SSH πρωτοκόλλου) αναφέρεται ότι τρέχει πάνω από το πρωτόκολλο αυθεντικοποίησης χρήστη. Στην πραγματικότητα το πρωτόκολλο σύνδεσης τρέχει πάνω από το πρωτόκολλο επιπέδου μεταφοράς, αλλά υποθέτει ότι το πρωτόκολλο αυθεντικοποίησης χρήστη έχει ήδη επικαλεστεί.

Όλες οι συνδέσεις που χρησιμοποιούν το SSH όπως στα τερματικές συνεδρίες (terminal sessions), υποστηρίζουν την χρήση ξεχωριστών καναλιών. Και οι δύο μεριές μπορούν να ανοίξουν ένα κανάλι. Για κάθε κανάλι, αντιστοιχείται σε κάθε μεριά ένα μοναδικός αριθμός καναλιού, ο οποίος δεν χρειάζεται να είναι ο ίδιος και στις δύο μεριές. Στα κανάλια υπάρχει έλεγχος ροής (flow control) καθότι χρησιμοποιείται μηχανισμός παραθύρου (window mechanism).

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





Παράδειγμα ανταλλαγής
μηνυμάτων στο πρωτόκολλο
σύνδεσης του SSH
  • Όπου uint32 σημαίνει ότι είναι κάποιος μεταβλητός ακέραιος αριθμός που δεν έχει πρόσημο (unsigned integer) μήκους 32-bit. Ο τύπος καναλιού εντοπίζει την εφαρμογή γι αυτό το κανάλι όπως περιγράφεται διαδοχικά. Το κανάλι αποστολέας είναι ένα τοπικό κανάλι αριθμών.

  • Το αρχικό μέγεθος παραθύρου (window size) περιγράφει πόσα bytes μπορούν να σταλθούν στον αποστολέα χωρίς να ρυθμίζει το παράθυρου Το μέγιστο μέγεθος πακέτων περιγράφει το μέγιστο μέγεθος ενός πακέτου δεδομένων το οποίο μπορεί να σταλθεί στον αποστολέα. Για παράδειγμα, κάποιος μπορεί να επιθυμεί πακέτα μικρότερου μεγέθους για διαδραστικές συνδέσεις πάνω σε μια αργή γραμμή έτσι ώστε να έχει καλύτερο αποτέλεσμα.

  • Εάν η απομακρυσμένη μεριά έχει την δυνατότητα να ανοίξει ένα κανάλι, επιστρέφει ένα μήνυμα, SSH_MSG_CHANNEL_OPEN_CONFIRMATION το οποίο περιέχει τον αριθμό καναλιού αποστολέα, τον αριθμό καναλιού παραλήπτη, το μήκος του παραθύρου και το μέγεθος πακέτου για μια εισερχόμενη κίνηση.

  • Διαφορετικά η απομακρυσμένη μεριά επιστρέφει ένα μήνυμα SSH_MSG_CHANNEL_OPEN_FAILURE με έναν κωδικό που υποδεικνύει τον λόγο της αποτυχίας.

  • Έπειτα το κανάλι είναι ανοικτό, η διακίνηση δεδομένων πραγματοποιείται χρησιμοποιώντας SSH_MSG_CHANNEL_DATA μηνύματα, τα οποία περιλαμβάνουν τον αριθμό καναλιού του παραλήπτη και ένα block δεδομένων.

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

  • Η εικόνα δεξιά παρέχει ένα παράδειγμα ενός πρωτοκόλλου ανταλλαγής σύνδεσης (Connection Protocol Exchange).


Υπάρχουν τέσσερις τύποι καναλιών που αναγνωρίζονται στο πρωτόκολλο σύνδεσης SSH και είναι τα εξής:


  1. Σύνοδος (session): Είναι η απομακρυσμένη εκτέλεση ενός προγράμματος. Το πρόγραμμα αυτό μπορεί να είναι ένα shell, μια εφαρμογή που να υποστηρίζει υπηρεσίες μεταφοράς μηνύματος ή ηλεκτρονικού ταχυδρομείου (e-mail), μια εντολή συστήματος ή κάποιο ενσωματωμένο σύστημα. Όταν ένα κανάλι συνόδου ανοίξει, διαδοχικά αιτήματα χρησιμοποιούνται για να εκκινήσουν απομακρυσμένα το εκάστοτε πρόγραμμα.

  2. x11: Αυτός ο τύπος καναλιού αναφέρεται και ως X Window System. Αποτελείται από ένα λογισμικό και ένα δικτυακό πρωτόκολλο το οποίο παρέχει GUI για δικτυακούς υπολογιστές. Το X παρέχει την δυνατότητα εκτέλεσης εφαρμογών σε έναν διακομιστή αλλά παράλληλα αυτές να εμφανίζονται σε έναν απλό υπολογιστή.

  3. forwarded-tcpip: Αυτός ο τύπος καναλιού παρέχει μια απομακρυσμένη τοπική θύρα προώθησης

  4. direct-tcpip: Αυτός ο τύπος καναλιού παρέχει μια μη απομακρυσμένη τοπική θύρα προώθησης



Ανταλλαγή δεδομένων με χρήση
SSH tunnel


Μια από τις πιο χρήσιμες υπηρεσίες του SSH είναι οι θύρες προώθησης. Οι θύρες προώθησης παρέχουν την δυνατότητα να μετατρέπουν οποιαδήποτε μη ασφαλής σύνδεση TCP σε ασφαλή SSH σύνδεση, επίσης αναφέρετε κι ως SSH tunneling. Μια θύρα είναι ένα αναγνωριστικό του χρήστη σε μια TCP σύνδεση, συνεπώς οποιαδήποτε εφαρμογή που τρέχει πάνω στο TCP έχει μια TCP θύρα επικοινωνίας.

Μια εισερχόμενη TCP σύνδεση μεταβιβάζεται στην κατάλληλη εφαρμογή με βάση την θύρα επικοινωνίας που χρησιμοποιεί αυτή. Μια εφαρμογή μπορεί να έχει περισσότερες από μια θύρες επικοινωνίας. Ένα από αυτά τα πρωτόκολλα επικοινωνίας που χρησιμοποιεί δύο θύρες επικοινωνίας είναι το FTP.Στην εικόνα δεξιά απεικονίζεται η βασική ιδέα για τις θύρες προώθησης. Έχουμε μια εφαρμογή πελάτη η οποία εντοπίζεται με βάση την θύρα προορισμού x και έχουμε έναν διακομιστή που εντοπίζεται από την θύρα επικοινωνίας y.

Σε κάποιο σημείο, η εφαρμογή του πελάτη στέλνει αίτημα σύνδεσης προς τον διακομιστή χρησιμοποιώντας για πρωτόκολλο μεταφοράς το TCP. Για να επιτευχθεί ασφαλής επικοινωνία έχει ρυθμιστεί το SSH έτσι ώστε το πρωτόκολλο επιπέδου μεταφοράς SSH να εγκαθιδρύσει μια TCP σύνδεση ανάμεσα στον SSH πελάτη και στον SSH εξυπηρετητή με τις TCP θύρες a και b αντίστοιχα. Με αυτόν τον τρόπο έχει δημιουργηθεί ένα ασφαλές SSH tunnel το οποίο τρέχει πάνω σε μια TCP σύνδεση.

Η TCP κίνηση που κατευθύνεται στην θύρα x του πελάτη ανακατευθύνεται στην τοπική οντότητα του SSH και κατευθύνεται από ένα tunnel όπου η απομακρυσμένη οντότητα SSH κατευθύνει τα δεδομένα στην εφαρμογή του διακομιστή που χρησιμοποιεί την θύρα y. Το ίδιο γίνεται και αντιστρόφως.

Το πρωτόκολλο SSH υποστηρίζει δύο τύπους θυρών προώθησης:


  1. Τοπική προώθηση (local forwarding): Η οποία επιτρέπει στον πελάτη να ρυθμίσει μια εφαρμογή 'hijacker'. Αυτή η εφαρμογή θα αναχαιτίσει μια επιλεγμένη κίνηση επιπέδου εφαρμογής και θα την ανακατευθύνει από μια μη ασφαλή TCP σύνδεση σε ένα ασφαλές SSH tunel. Το SSH είναι ρυθμισμένο έτσι ώστε να 'ακούει' σε επιλεγμένες θύρες. Το SSH παίρνει όλη την κίνηση χρησιμοποιώντας μια επιλεγμένη θύρα και την κατευθύνει προς ένα SSH Tunnel. Από την άλλη μεριά, ο εξυπηρετητής SSH στέλνει όλη την εισερχόμενη κίνηση στην θύρα προορισμού που υπαγορεύεται στην εφαρμογή του πελάτη.


  2. Απομακρυσμένη προώθηση (remote forwarding): Η οποία δίνει την δυνατότητα στον SSH πελάτη να ενεργήσει για λογαριασμό του SSH διακομιστή. Ο πελάτης δέχεται κάποια κίνηση TCP έχοντας μια δεδομένη θύρα προορισμού, την τοποθετεί σε αυτήν. Στην συνέχεια αυτή προωθείται προς τον προορισμό που επιλέγει ο χρήστης.


Τοπική προώθηση (local forwarding) στο πρωτόκολλο σύνδεσης SSH (SSH Connection Protocol)

Το ακόλουθο παράδειγμα μας βοηθάει να αποσαφηνίσουμε πως η τοπική θύρα προώθησης λειτουργεί. Υποθέστε ότι έχει έναν πελάτη ηλεκτρονικού ταχυδρομείου (e-mail client) στο desktop σας και θέλετε να τον θέσετε σε χρήση για να λάβετε e-mail από τον εξυπηρετητή ηλεκτρονικού ταχυδρομείου (e-mail server) σας χρησιμοποιώντας το πρωτόκολλο POP. Η θύρα που χρησιμοποιεί το POP3 είναι η 110. Μπορούμε να ασφαλίσουμε αυτήν την σύνδεση με τον εξής τρόπο:


  1. Ο SSH πελάτης εγκαθιδρύει μια σύνδεση με τον απομακρυσμένο SSH διακομιστή

  2. Επιλέγει μια θύρα που δεν χρησιμοποιείται ας πούμε την 9999, και ρυθμίζει το πρωτόκολλο SSH έτσι ώστε να δέχεται κίνηση από την θύρα αυτή προς την θύρα 110 του διακομιστή.

  3. Ο πελάτης δέχεται οποιαδήποτε bits που στέλνονται στην τοπική θύρα 9999 και τα στέλνει στον διακομιστή μέσα από μια κρυπτογραφημένη SSH σύνοδο. Ο SSH διακομιστής αποκρυπτογραφεί τα εισερχόμενα bits και στέλνει το plaintext στην θύρα 110.

  4. Στην άλλη μεριά, ο SSH εξυπηρετητής δέχεται οποιαδήποτε bits που έχει λάβει απο την θύρα 110 και τα στέλνει στην SSH σύνοδο προς τον SSH πελάτη τα οποία με την σειρά του αποκρυπτογραφεί και τα στέλνει στην διεργασία που έχει την θύρα 9999.

Απομακρυσμένη προώθηση (remote forwarding) στο πρωτόκολλο σύνδεσης SSH (SSH Connection Protocol)

Το ακόλουθο παράδειγμα μας βοηθάει να αποσαφηνίσουμε πως λειτουργεί η μέθοδος της απομακρυσμένης προώθησης (remote forwarding). Υποθέστε ότι επιθυμείτε να αποκτήσετε πρόσβαση σε έναν διακομιστή (server) που βρίσκετε στην δουλειά από τον υπολογιστή που διαθέτετε στο σπίτι σας. Επειδή ο διακομιστής αυτός είναι πίσω από ένα τείχος προστασίας (firewall), δεν θα δεχτεί μια SSH αίτηση από τον προσωπικό σας υπολογιστή. Παρόλα αυτά στον χώρο εργασίας μπορείτε να ρυθμίσετε ένα SSH tunnel χρησιμοποιώντας απομακρυσμένη προώθηση.

  1. Από τον υπολογιστή που βρίσκεται στον χώρο εργασίας, εγκαθιδρύετε μια SSH σύνδεση προς τον υπολογιστή που βρίσκετε στο σπίτι σας.

  2. Ρυθμίζετε τον SSH διακομιστή έτσι ώστε να ακούει σε μια τοπική θύρα, ας πούμε την 22 και για να παραδώσει δεδομένα προς μια άλλη SSH σύνδεση απευθύνεται σε μια απομακρυσμένη θύρα, ας πούμε την 2222.

  3. Σε αυτό το σημείο μπορείτε στον υπολογιστή που βρίσκετε στο σπίτι σας να ρυθμίζετε το SSH έτσι ώστε να δέχεται κίνηση από την θύρα 2222.

  4. Με αυτόν τον τρόπο έχετε ένα SSH tunnel το οποίο μπορείτε να το χρησιμοποιήσετε για απομακρυσμένη πρόσβαση με τον διακομιστή που βρίσκετε στον χώρο εργασίας.




Συμπέρασμα


Το πρωτόκολλο SSH είναι μια από τις πιο συνήθεις εφαρμογές κρυπτογράφησης. Παρέχει μέγιστη ευελιξία και ευστροφία για μια μεγάλη ποικιλία εργασιών, συμπεριλαμβανομένων της απομακρυσμένης διαχείρισης, μεταφοράς αρχείου, web development, και penetration testing



Τελευταία ενημέρωση: 17/10/2016






Follow us

 ☰