Η φιλική πλευρά του SSH [1]




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

Πριν από μερικούς μήνες αναφερθήκαμε στις θεωρητικές αδυναμίες που παρουσιάζουν ορισμένοι αλγόριθμοι, οι οποίοι εμπλέκονται στη δημιουργία των συνδέσεων SSH (Ασφαλέστερο OpenSSH, εδώ και τώρα, τεύχος 40). Ξεκαθαρίσαμε βέβαια ότι πρόκειται για αδυναμίες που δεν πρέπει να μας προκαλούν ιδιαίτερη ανησυχία, αφού για την ώρα τουλάχιστον δεν υπάρχει κάποια γνωστή μέθοδος εκμετάλλευσής τους. Η παρουσίαση του θέματος είχε κυρίως προληπτικό χαρακτήρα και αφορούσε σε μια σειρά ρυθμίσεων που εξασφαλίζουν ότι οι συνδέσεις μας θα είναι όσο το δυνατόν πιο ασφαλείς στο κοντινό (ακριβέστερα: προβλέψιμο) μέλλον. Καλά όλα αυτά, θα πείτε, αλλά η δημιουργία και ο χειρισμός των συνδέσεων SSH δεν είναι πάντοτε εύκολη ή, τέλος πάντων, βολική εργασία. Μήπως θα μπορούσαμε να κάνουμε κάτι γι’ αυτό το άμεσο πρόβλημα του σήμερα; Πώς θα μπορούσαμε να στήσουμε τη μία ή την άλλη σύνδεση, χωρίς κόπο; Με ποιους τρόπους θα μπορούσαμε να αξιοποιήσουμε μια υπάρχουσα σύνδεση;

Παρόμοια ερωτήματα απασχολούν κι εμάς. Έχουμε βλέπετε καμπόσα συστήματα που τρέχουν Linux, ορισμένα φυσικά και περισσότερα εικονικά, ενώ συντηρούμε και (τουλάχιστον) δύο VPSes. Έτσι, πολύ συχνά βρισκόμαστε στη γραμμή εντολών κάποιου συστήματος, προσπαθώντας να πάρουμε τις πιο πρόσφατες ενημερώσεις, να στήσουμε μια υπηρεσία ή εφαρμογή, να τροποποιήσουμε τις ρυθμίσεις κάποιας υπηρεσίας και πάει λέγοντας. Σ’ όλες αυτές τις εργασίες οι συνδέσεις SSH αποδεικνύονται εξαιρετικά χρήσιμες, αφού διευκολύνουν τη “μετάβαση” από το ένα σύστημα στο άλλο, τη μεταφορά αρχείων, την πραγματοποίηση δοκιμών κ.ο.κ. Επομένως, αν μας προβληματίζει κάτι σε σχέση με τη χρήση του SSH και μάλιστα σε καθημερινή βάση, αυτό αφορά στην ευκολία με την οποία κάνουμε τις δουλειές μας και όχι στο ενδεχόμενο να μας παρακολουθεί κάποιος πράκτορας. Σ’ αυτό το άρθρο, λοιπόν, σας παρουσιάζουμε τους τρόπους με τους οποίους αξιοποιούμε *εμείς* τις συνδέσεις SSH. Θα ξεκινήσουμε από απλές ρυθμίσεις που διευκολύνουν την καθημερινή χρήση και θα φτάσουμε σε προχωρημένα κόλπα, για πιο εξεζητημένα και ενδιαφέροντα σενάρια χρήσης. Θέλουμε να πιστεύουμε ότι αυτά τα εφόδια θα σας λύσουν τα χέρια σε πολλές περιστάσεις, ενώ θα σας ενθαρρύνουν να πειραματιστείτε και να ανακαλύψετε ακόμα πιο ευρηματικές χρήσεις για τις συνδέσεις SSH.

Ταχύτητα και ευκολία
Αν και υποσχεθήκαμε να μην καταπιαστούμε με την ασφάλεια, είναι αδύνατο να μην πούμε ούτε μια κουβέντα. Η παρουσίασή μας άλλωστε θα ξεκινήσει με μια μέθοδο που απλοποιεί την εγκαθίδρυση συνδέσεων, ενώ ταυτόχρονα ενισχύει και την ασφάλεια του εκάστοτε SSH server. Πρόκειται για μια διαδικασία δύο απλών βημάτων, που αν την εφαρμόσουμε για κάθε μηχάνημα προς το οποίο συνδεόμαστε, η χρήση του ssh από τη γραμμή εντολών θα γίνει ευκολότερη και ταχύτερη από ποτέ.

Το πρώτο που πρέπει να κάνουμε είναι να απενεργοποιήσουμε τη χρήση των συνθηματικών και να επιβάλλουμε την ταυτοποίηση των χρηστών (user authentication) με κλειδιά κρυπτογράφησης. Με αυτόν τον τρόπο, οι SSH servers στους οποίους συνδεόμαστε δεν θα περιμένουν κάποιο συνθηματικό και ως εκ τούτου, θα είναι αδύνατο να υποστούν επιθέσεις brute force. Επιπρόσθετα, οι συνδέσεις μας θα πραγματοποιούνται χωρίς να απαιτείται η πληκτρολόγηση κάποιου συνθηματικού και χωρίς κάποια άλλη (αισθητή) καθυστέρηση. Επιγραμματικά, η διαδικασία για να ενεργοποιήσουμε αυτόν τον τρόπο σύνδεσης έχει ως εξής:
Δημιουργούμε ένα ζεύγος δημόσιου-ιδιωτικού κλειδιού, στο μηχάνημα από το οποίο πραγματοποιούμε τις συνδέσεις.
Εγκαθιστούμε το δημόσιο κλειδί στους επιθυμητούς λογαριασμούς χρήστη, των μηχανημάτων στα οποία συνδεόμαστε (SSH servers).
Ρυθμίζουμε κατάλληλα τους SSH server, ώστε να μην περιμένουν συνθηματικό και να αξιοποιούν το δημόσιο κλειδί.

Η παραπάνω διαδικασία δεν παρουσιάζει ιδιαίτερη δυσκολία, αλλά χρειάζεται προσοχή. Παρ’ όλα αυτά, καθώς πρόκειται για θέμα που έχουμε καλύψει πολλές φορές στο παρελθόν, δεν θα σας κουράσουμε επαναλαμβάνοντας τις λεπτομέρειες (Ασφαλέστερο OpenSSH, εδώ και τώρα και Απομακρυσμένα ασφαλή logins, χωρίς password, τεύχη 040και 042 αντίστοιχα).

Το δεύτερο βήμα για να πραγματοποιούμε συνδέσεις SSH με τη μέγιστη δυνατή άνεση, είναι να δημιουργήσουμε τα κατάλληλα SSH aliases στον υπολογιστή-πελάτη (υποθέτουμε ότι δουλεύετε από κάποιο Unix-like OS, όπως, π.χ., είναι οι διανομές Linux, τα BSD flavors ή το OS X). Πρόκειται για αυθαίρετα επιλεγμένες λέξεις στις οποίες έχουμε αντιστοιχίσει ένα σύνολο ρυθμίσεων. Για παράδειγμα, σε ένα SSH alias μπορούμε να αντιστοιχίσουμε τη διεύθυνση ενός server και το όνομα χρήστη με το οποίο πραγματοποιούμε συνδέσεις προς τον συγκεκριμένο server. Τα SSH aliases ορίζονται μέσα στο σχετικό αρχείο ρυθμίσεων του λογαριασμού μας (~/.ssh/config) ή στο αρχείο ρυθμίσεων της υπηρεσίας του SSH (/etc/ssh/ssh_config). Προφανώς, στην πρώτη περίπτωση τα SSH aliases ισχύουν μόνο για το λογαριασμό μας, ενώ στη δεύτερη έχουν καθολική ισχύ. Πάντως για να αποφεύγουμε πιθανά μπερδέματα με άλλους χρήστες και για να είμαστε σίγουροι ότι τα aliases που έχουμε ορίσει δεν θα χαθούν εξαιτίας κάποιας αναβάθμισης του συστήματος, είναι προτιμότερο να τα τοποθετούμε στο αρχείο ρυθμίσεων του λογαριασμού μας (δηλαδή στο ~/.ssh/config).



Ο τρόπος δημιουργίας και χρήσης των SSH alias, όπως και η ευκολία που προσφέρουν, μπορεί να φανεί με τη βοήθεια ενός παραδείγματος. Ας υποθέσουμε ότι ο χρήστης spiral συνηθίζει να συνδέεται στο μηχάνημα deltahacker.gr, το οποίο δέχεται συνδέσεις SSH στη θύρα 45123. Ας υποθέσουμε, επίσης, ότι ο spiral συνδέεται στο εν λόγω μηχάνημα ως pvar. Για την πραγματοποίηση αυτής της σύνδεσης, κανονικά θα πρέπει να δώσει κάτι τέτοιο:


ssh pvar@deltahacker.gr –p 45123


Αν ο spiral έχει δημιουργήσει ένα ζεύγος κλειδιών κι έχει εγκαταστήσει το δημόσιο κλειδί στον λογαριασμό του pvar στο deltahacker.gr, η σύνδεση θα πραγματοποιηθεί αμέσως και χωρίς καμία περαιτέρω καθυστέρηση. Όμως αυτή η διαδικασία μπορεί να απλοποιηθεί ακόμα περισσότερο, αρκεί ο spiral να ανοίξει το αρχείο ~/.ssh/config και να προσθέσει τα ακόλουθα:


Host delta
HostName deltahacker.gr
Port 45123
User pvar


Με αυτόν τον τρόπο δημιουργείται ένα SSH alias (η λέξη “delta”) που παραπέμπει στο deltahacker.gr, στο λογαριασμό του pvar και στη θύρα 45123. Μετά από αυτή τη μικρή προσθήκη στο αρχείο ρυθμίσεων, ο spiral θα μπορεί να συνδέεται εκτελώντας αυτό:


ssh delta


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



Εκτέλεση προγραμμάτων
Συχνά πυκνά προκύπτει η ανάγκη να τρέξουμε ένα ή περισσότερα προγράμματα σε κάποιο απομακρυσμένο μηχάνημα και είτε να παρακολουθήσουμε την έξοδό τους στην οθόνη, είτε να την αποθηκεύσουμε σε κάποιο αρχείο. Για παράδειγμα, μπορεί να θέλουμε να τρέξουμε το top σε κάποιο μικρό VPS, για να δούμε ποιο πρόγραμμα το επιβαρύνει περισσότερο. Όταν θέλουμε να κάνουμε μια τέτοια δουλειά στα “πεταχτά”, δεν είναι υποχρεωτικό να μεταφερθούμε στη γραμμή εντολών του ξένου συστήματος. Μπορούμε να κάνουμε τη δουλειά μας γρήγορα, χωρίς να εγκαταλείψουμε το δικό μας σύστημα. Συνεχίζοντας το παράδειγμα με το χρήστη spiral, αν αποφάσιζε να ρίξει μια ματιά στις ρυθμίσεις του nginx στο deltahacker.gr, θα μπορούσε να δώσει κάτι τέτοιο:


ssh delta cat /etc/nginx/sites-enabled/deltahacker


Το συγκεκριμένο κολπάκι είναι γνωστό σε αρκετούς. Υπάρχουν όμως κάποιες λεπτομέρειες γύρω από τη χρήση του, που δεν είναι το ίδιο διαδεδομένες.

Υπάρχει μια κατηγορία προγραμμάτων που εμφανίζουν χαρακτήρες σε “αυθαίρετες” θέσεις της οθόνης και όχι υποχρεωτικά σε διαδοχικές. Τέτοια προγράμματα είναι όσα σχεδιάζουν στην κονσόλα ένα περιβάλλον χαρακτήρων ή έστω μερικά στοιχεία ενός περιβάλλοντος, όπως, π.χ., είναι οι μπάρες προόδου, οι μπάρες κύλισης κ.ο.κ. Μερικά γνωστά προγράμματα της κατηγορίας είναι το top, το wget, το screen και όλοι οι text editors. Αρκετά από αυτά τα εργαλεία είναι αδύνατο να εκτελεστούν με τον τρόπο που δείξαμε παραπάνω, ενώ κάποια άλλα εκτελούνται, αλλά το περιβάλλον τους εμφανίζεται “σπασμένο”. Για παράδειγμα, αν ο χρήστης spiral εκτελέσει το ακόλουθο:


ssh delta top


θα δει ένα μήνυμα λάθους και η εκτέλεση του top θα αποτύχει. Αντίθετα, αν δώσει κάτι τέτοιο:


ssh delta wget www.some-server.org/some-file.tar.bz


ο server του deltahacker θα αρχίσει να κατεβάζει κανονικά το αρχείο some-file.tar.bz, όμως η μπάρα προόδου του wget θα φαίνεται να μη λειτουργεί.

Για να μπορούν να σχηματίζουν το περιβάλλον τους και να λειτουργούν κανονικά, τα προγράμματα της κατηγορίας που περιγράφουμε πρέπει να εκτελούνται μέσα σε κάποιο τερματικό — πραγματικό (tty) ή εικονικό (pty). Οι συνδέσεις SSH, όταν μεταφερόμαστε στη γραμμή εντολών του απομακρυσμένου συστήματος, δημιουργούν ένα εικονικό τερματικό. Αν εκτελέσουμε το πρόγραμμα who, θα πληροφορηθούμε ότι βρισκόμαστε μέσα σε κάποιο pts (pseudo terminal slave: αποτελεί τμήμα/εξάρτημα ενός εικονικού τερματικού pty, διαβάστε περισσότερα πληκτρολογώντας man pty). Ωστόσο, όταν χρησιμοποιούμε το ssh για την εκτέλεση ενός προγράμματος *χωρίς* να μεταφερθούμε στη γραμμή εντολών του απομακρυσμένου συστήματος, δεν δημιουργείται κανενός είδους τερματικό. Όπως υποψιάζεστε, για να μπορούμε να εκτελούμε οποιοδήποτε πρόγραμμα με το ssh και χωρίς να αντιμετωπίζουμε προβλήματα, αρκεί να επιβάλλουμε τη δημιουργία ενός εικονικού τερματικού. Κάτι τέτοιο γίνεται με τη χρήση της παραμέτρου –t. Αν ο χρήστης spiral πληκτρολογήσει


ssh –t delta top


Το πρόγραμμα top θα εκτελεστεί κανονικά. Παρεμπιπτόντως, η δημιουργία τερματικού θα μπορούσε να αυτοματοποιηθεί, με την κατάλληλη επέκταση στον ορισμό του SSH alias:


Host delta
HostName deltahacker.gr
Port 45123
User pvar
RequestTTY yes






Μια ακόμα ενδιαφέρουσα λεπτομέρεια σχετίζεται με τους τελεστές ανακατεύθυνσης. Ας υποθέσουμε ότι ο χρήστης spiral θέλει να αντιγράψει τις ρυθμίσεις του SSH server σε ένα αρχείο για λόγους backup. Έστω ότι εκτελεί το εξής:


ssh delta cat /etc/ssh/sshd_config > ~/.ssh/server-config


Μπορείτε να φανταστείτε τι θα συμβεί; Οι ρυθμίσεις του SSH server του *απομακρυσμένου* συστήματος θα αποθηκευτούν στο αρχείο ~/.ssh/server-config του *τοπικού* συστήματος. Ο τελεστής ανακατεύθυνσης θα πάρει οτιδήποτε “έρχεται” από τα αριστερά του (ssh delta cat…) και θα το ρίξει στο αρχείο ~/.ssh/server-config. Αν το καλοσκεφτείτε, αυτή η συμπεριφορά είναι απόλυτα λογική και σε ορισμένες περιπτώσεις θα μπορούσε να είναι και επιθυμητή. Σκεφτείτε όμως το ενδεχόμενο να υπήρχε ήδη το αρχείο ~/.ssh/server-config στο τοπικό σύστημα. Σε αυτή την περίπτωση, ο spiral θα κατέστρεφε το τοπικό backup και μάλιστα χωρίς να το αντιληφθεί. Για να εκτελεστούν τα πάντα στο απομακρυσμένο σύστημα, ο spiral θα έπρεπε να περικλείσει την “εντολή” σε εισαγωγικά:


ssh delta "cat /etc/ssh/sshd_config > ~/.ssh/server-config"


Με αυτόν τον τρόπο, τόσο η εκτέλεση του cat όσο και η δημιουργία του αρχείου εξαιτίας του τελεστή ανακατεύθυνσης, θα πραγματοποιηθούν στον server του deltahacker. Όπως βλέπετε, όταν συνδυάζουμε τους τελεστές ανακατεύθυνσης με το ssh, πρέπει να επιλέγουμε προσεκτικά το αν θα χρησιμοποιήσουμε εισαγωγικά ή όχι. Περιττό να πούμε ότι την ίδια προσοχή πρέπει να επιδεικνύουμε και στην περίπτωση που χρησιμοποιούμε τον τελεστή διασωλήνωσης (|) ή το χαρακτήρα διαχωρισμού εντολών (;). Χωρίς εισαγωγικά, το τμήμα της “εντολής” που βρίσκεται μετά τον ειδικό χαρακτήρα, εκτελείται τοπικά.



Ασφαλής περιήγηση
Όπως υποσχεθήκαμε, αυτή τη φορά δεν θα ασχοληθούμε με την ασφάλεια των συνδέσεων SSH. Αντίθετα, ξεκινώντας από αυτή θα μάθουμε να την εκμεταλλευόμαστε για την προστασία του web browsing! Αν πιστεύετε ότι μια τέτοια κίνηση θα αποτελούσε υπερβολή, σας συνιστούμε να το ξανασκεφτείτε. Φανταστείτε την περίπτωση κατά την οποία έχετε συνδεθεί με το laptop σε κάποιο πιθανά επικίνδυνο δίκτυο WiFi και θέλετε να διατηρήσετε ασφαλή τα δεδομένα που στέλνετε και λαμβάνετε από τον browser. Μήπως θεωρείτε ότι τα δίκτυα WiFi στα οποία συνδέεστε δεν κρύβουν κανέναν κίνδυνο; Αν και στο περιοδικό έχουμε παρουσιάσει πολλά θέματα που δείχνουν το ακριβώς αντίθετο, αν επιμένετε ξεχάστε τα περί ασφάλειας ή όχι των ασύρματων συνδέσεως και φανταστείτε το ακόλουθο σενάριο. Υποθέστε ότι βρισκόσαστε πίσω από ένα εξαιρετικά αυστηρό firewall, το οποίο απαγορεύει την πρόσβαση σε ορισμένες ιστοσελίδες. Μην τρέχει ο νους σας στο κινεζικό Great Firewall, αφού ένα αυστηρό firewall θα μπορούσε να βρίσκεται και στο εταιρικό δίκτυο κάποιου Δημόσιου Οργανισμού ή της δουλειάς σας. Νομίζουμε ότι σε μία τέτοια περίπτωση θα επιθυμούσατε διακαώς (έστω κι από πείσμα) να ξεπεράσετε τους περιορισμούς του firewall. Αν εξακολουθείτε να πιστεύετε ότι γινόμαστε παρανοϊκοί, σκεφτείτε την απλούστερη περίπτωση όπου θέλετε να συνδεθείτε σε μια υπηρεσία streaming σαν αυτή του Netflix ή του LastFM. Ως γνωστόν, τέτοιες υπηρεσίες προσφέρονται μόνο για τους κατοίκους των ΗΠΑ και ορισμένων χωρών της Ευρώπης. Ε, λοιπόν, αξιοποιώντας μια σύνδεση SSH, μπορούμε να ξεγελάσουμε οποιαδήποτε υπηρεσία του είδους και να εμφανιστούμε ως βέροι Νεοϋορκέζοι, γνήσιοι Ισλανδοί ή δεν ξέρω κι εγώ τι άλλο.

Το OpenSSH, η υλοποίηση του SSH που χρησιμοποιούμε πρακτικά όλοι, έχει τη δυνατότητα να δημιουργεί ένα ιδιαίτερο είδος συνδέσεων, που ονομάζονται SSH tunnels. Αυτές οι συνδέσεις είναι πλήρως κρυπτογραφημένες –όπως άλλωστε όλες οι συνδέσεις SSH–, ενώ παρέχουν και μια πρόσθετη δυνατότητα: Λειτουργούν ως σήραγγες, μέσα από τις οποίες μπορούν να διοχετευτούν άλλες συνδέσεις, οποιουδήποτε πρωτοκόλλου. Για να πετύχουμε όσα περιγράψαμε παραπάνω, αρκεί να διοχετεύσουμε τις συνδέσεις που δημιουργεί ο browser μέσα από ένα SSH tunnel. Μη νομίζετε ότι κάτι τέτοιο απαιτεί πολλά και περίπλοκα βήματα. Πρόκειται για μία από τις σπάνιες περιπτώσεις, που η υλοποίηση είναι εξίσου απλή με την περιγραφή :) Αρκεί να δώσουμε κάτι τέτοιο:


ssh -fNTD 1234 username@some-server.org


Με την εκτέλεση του παραπάνω θα δημιουργηθεί μια “σήραγγα SSH”, που θα έχει ως είσοδο τη θύρα 1234 του τοπικού συστήματος και σαν έξοδο το μηχάνημα some-server.org. Αν εξαιρέσουμε το γεγονός ότι η έξοδος του tunnel χαρακτηρίζεται ως Dynamic και δεν είναι προσαρτημένη σε κάποια συγκεκριμένη θύρα, η όλη λειτουργία του tunnel θυμίζει το port forwarding των router. Με τις παραμέτρους που δώσαμε στο ssh, η σύνδεσή μας θα μεταφερθεί αυτόματα στο υπόβαθρο και δεν θα δεσμεύσει την κονσόλα (παράμετρος –f), ούτε θα δημιουργήσει κάποιο εικονικό τερματικό (παράμετρος –T). Η προώθηση των συνδέσεων (forwarding) πραγματοποιείται με την παράμετρο –D, ενώ η παράμετρος –N εξασφαλίζει ότι δεν θα εκτελεστεί καμία εντολή στο απομακρυσμένο σύστημα.

Έχοντας έτοιμο το SSH tunnel, απομένει η κατάλληλη ρύθμιση του browser. Στην περίπτωση του Firefox, αρκεί να επισκεφθούμε τις ρυθμίσεις, να μεταβούμε στην ενότητα Advanced και από εκεί στην καρτέλα Network. Στην ενότητα Connection του παραθύρου που εμφανίζεται, θα πατήσουμε το κουμπί Settings. Με αυτόν τον τρόπο βρίσκουμε τις ρυθμίσεις που αφορούν στη χρήση κάποιου proxy server. Εκεί επιλέγουμε το Manual Proxy configuration και τσεκάρουμε τις επιλογές SOCKS v5 και Remote DNS. Φυσικά, πριν πατήσουμε στο OK πρέπει να συμπληρώσουμε και τα κατάλληλα πεδία, δίπλα στην ετικέτα SOCKS host. Από εκεί προσδιορίζουμε το σημείο εισόδου του tunnel που δημιουργήσαμε προηγουμένως (διεύθυνση localhost και θύρα 1234).



Στην περίπτωση του Chrome, η σχετική ρύθμιση επιτυγχάνεται με τη βοήθεια παραμέτρων που πρέπει να δώσουμε κατά την εκκίνηση του browser. Για την ακρίβεια, πρέπει να τον ξεκινήσουμε κάπως έτσι:


google-chrome --proxy-server="socks5://localhost:1234" --host-resolver-rules="MAP * 0.0.0.0, EXCLUDE localhost" &


Αφού ξεμπερδέψουμε με τις ρυθμίσεις του browser, οι περιπλανήσεις μας στο web θα είναι πλήρως κρυπτογραφημένες και προφυλαγμένες από τα αδιάκριτα μάτια κάθε περίεργου (προσοχή: η προστασία αφορά *μόνο* στις συνδέσεις που δημιουργεί ο browser). Επιπρόσθετα, ακόμα κι αν βρισκόμαστε πίσω από κάποιο εξαιρετικά αυστηρό Firewall, θα μπορούμε να συνδεόμαστε οπουδήποτε. Για την ακρίβεια, θα μπορούμε να συνδεθούμε οπουδήποτε μπορεί να συνδεθεί το μηχάνημα που αποτελεί την έξοδο του tunnel. To αυστηρό firewall που έχουμε μπροστά μας θα βλέπει μόνο μια εξερχόμενη σύνδεση SSH και τίποτα άλλο. Τέλος, για το υπόλοιπο Internet, οι συνδέσεις μας θα μοιάζουν να προέρχονται από τον τόπο κατοικίας του some-server.org (η έξοδος του tunnel). Αυτό σημαίνει ότι αν ο συγκεκριμένος server βρίσκεται στην Αμερική, θα μπορούμε να συνδεθούμε και στο Netflix και στην υπηρεσία streaming του LastFM (εκτός κι αν η IP του server είναι σε κάποια blacklist — αλλά δεν χρειάζεται να είμαστε απαισιόδοξοι).





Πριν προχωρήσουμε, αξίζει να σταθούμε σε μια ενδιαφέρουσα λεπτομέρεια. Περιγράφοντας τη ρύθμιση του Firefox, αναφέραμε ότι πρέπει να ενεργοποιήσουμε την επιλογή Remote DNS. Με αυτόν τον τρόπο εξασφαλίζουμε την προώθηση των αιτημάτων DNS (από πλευράς browser) μέσα από το SSH tunnel και κατ’ επέκταση την κρυπτογράφησή τους. Αναρωτιέστε γιατί μας ενδιαφέρει κάτι τέτοιο; Η αλήθεια είναι ότι η συγκεκριμένη ρύθμιση έχει σημασία μόνον όταν βρισκόμαστε σε άγνωστα και πιθανώς εχθρικά –ή έστω αυστηρά– τοπικά δίκτυα. Αν δεν προφυλάσσουμε τα αιτήματα DNS, οποιοσδήποτε παρακολουθεί το τοπικό δίκτυο θα μαθαίνει αμέσως με ποιους servers μιλάμε. Μπορεί να μη βλέπει τα δεδομένα που στέλνουμε και λαμβάνουμε –αυτά κρυπτογραφούνται από το SSH tunnel–, αλλά θα ξέρει που πηγαίνουμε και με ποιους μιλάμε. Επιπρόσθετα, θα είναι ενδεχομένως σε θέση να πραγματοποιήσει επιθέσεις DNS και να μας παραπέμψει ύπουλα σε δικούς τους, κακόβουλους servers. Σημειώστε ότι ο Chrome δεν διαθέτει κάποια ρύθμιση, αντίστοιχη με αυτή του Firefox. Ωστόσο, φροντίζει για την αυτόματη προώθηση των αιτημάτων DNS μέσα από το ίδιο “κανάλι” που ταξιδεύουν και τα αιτήματα HTTP. Αν δεν είσαστε σίγουροι για τη συμπεριφορά τους δικού σας browser ή αν απλά θέλετε να ελέγξετε τις ρυθμίσεις σας, αρκεί να παρακολουθήσετε τις συνδέσεις που εξέρχονται από το SSH tunnel. Για παράδειγμα, αν θέλετε να τσεκάρετε ότι όντως προωθούνται τα αιτήματα DNS, μπορείτε να αναζητήσετε συνδέσεις που έχουν στον προορισμό τους τη θύρα 53 (πρόκειται για τη θύρα που χρησιμοποιείται εξ ορισμού από τους DNS servers) του απομακρυσμένου SSH server. Κάτι τέτοιο μπορεί να γίνει ως εξής:


ssh username@some-server.org tcpdump -i eth0 port 53




Το αντίστροφο πρόβλημα
Με το τέχνασμα που εξετάσαμε μπορούμε να αποδράσουμε από ένα περιοριστικό firewall — ή να ξεγλιστρήσουμε από την παρακολούθηση και τις παγίδες κάποιου κακόβουλου χρήστη ή μανιακού διαχειριστή. Σε κάθε περίπτωση, με τη βοήθεια ενός SSH tunnel μπορούμε να *εξέλθουμε* από ένα τοπικό δίκτυο, με ευκολία και ασφάλεια. Τι γίνεται όμως όταν θέλουμε να *εισέλθουμε* σε κάποιο τοπικό δίκτυο; Μη νομίζετε ότι το ρίξαμε ξαφνικά στις επιθέσεις. Μιλάμε για τη σύνδεση σε κάποιο οικείο τοπικό δίκτυο, που για διάφορους τεχνικούς λόγους μπορεί να είναι από δύσκολη έως αδύνατη. Ας υποθέσουμε ότι θέλουμε να συνδεθούμε σε έναν υπολογιστή του οικιακού μας δικτύου, ενώ βρισκόμαστε κάπου έξω. Η πραγματοποίηση αυτής της σύνδεσης είναι αρκετά μπελαλίδικη: Πρέπει να έχουμε ανοίξει κάποιο port στο firewall του οικιακού μας router και να έχουμε πραγματοποιήσει το κατάλληλο port forwarding, προς το μηχάνημα που μας ενδιαφέρει. Επιπρόσθετα, πρέπει να γνωρίζουμε και την τρέχουσα διεύθυνση IP που έχει αντιστοιχιστεί στην οικιακή μας σύνδεση. Το πρόβλημα με αυτή τη λύση δεν είναι μόνο ότι απαιτεί πολλές ρυθμίσεις. Θα τη χαρακτηρίζαμε άκαμπτη, ενώ σε ορισμένες περιπτώσεις είναι και εντελώς άχρηστη, αφού δεν μπορούμε να την εφαρμόσουμε. Για παράδειγμα, σκεφτείτε την περίπτωση που θέλουμε να συνδεθούμε σε κάποιο μηχάνημα της δουλειάς ή της σχολής, από το σπίτι. Κανένας λογικός διαχειριστής δεν θα δεχτεί να αλλάξει τις ρυθμίσεις του firewall της δουλειάς ή της σχολής, μόνο και μόνο για τη δική μας διευκόλυνση. (Εκτός κι αν ο διαχειριστής είμαστε εμείς. Πάντως ακόμη και τότε υπάρχουν πολλοί λόγοι για να μη σκαλίσουμε το firewall.)

Όπως υποψιάζεστε, οι συνδέσεις SSH μπορούν και πάλι να δώσουν τη λύση. Αυτή τη φορά θέλουμε να μπούμε και όχι να βγούμε από κάποιο τοπικό δίκτυο. Επομένως, χρειαζόμαστε το ακριβώς αντίθετο των SSH tunnel: ένα reverse SSH tunnel. Αυτές οι συνδέσεις συμπεριφέρονται και πάλι ως σήραγγες, μόνο που επιτρέπουν την πραγματοποίηση συνδέσεων με την αντίθετη φορά. Με άλλα λόγια, η είσοδός τους βρίσκεται στο απομακρυσμένο σύστημα και η έξοδος στο τοπικό. Για να λύσουμε το πρόβλημα που περιγράψαμε αρχικά, αρκεί να δημιουργήσουμε ένα reverse SSH tunnel από το μηχάνημα του σπιτιού προς κάποιο VPS. Αργότερα, όταν θελήσουμε να συνδεθούμε στο μηχάνημα του σπιτιού, αρκεί να συνδεθούμε στον VPS και να αξιοποιήσουμε το “αντεστραμμένο τούνελ”. Φυσικά, στη θέση του VPS θα μπορούσε να είναι οποιοδήποτε άλλο μηχάνημα είναι εύκολα προσβάσιμο από το Internet. Για παράδειγμα, κάποιος server του δικτύου της δουλειάς ή της σχολής. Το στήσιμο ενός reverse SSH tunnel είναι πανεύκολη υπόθεση. Συνεχίζοντας το προηγούμενο σενάριο, αρκεί να ανοίξουμε τη γραμμή εντολών του οικιακού μηχανήματος και να δώσουμε κάτι τέτοιο:


ssh -fNTR 2222:localhost:22 username@some-server.org


Με αυτόν τον τρόπο δημιουργείται ένα αντεστραμμένο τούνελ, που έχει σαν είσοδο τη θύρα 2222 του μηχανήματος some-server.org και σαν έξοδο τη θύρα 22 του τοπικού συστήματος. Όπως είδαμε και νωρίτερα, οι παράμετροι –f, -T και –N εξασφαλίζουν ότι η συγκεκριμένη σύνδεση θα τοποθετηθεί στο background, δεν θα δημιουργήσει τερματικό και δεν θα εκτελέσει εντολές στο απομακρυσμένο μηχάνημα. Η δημιουργία του reverse SSH tunnel εξασφαλίζεται από την παράμετρο –R. Εφόσον ετοιμάσουμε το τούνελ, δεν χρειάζεται να κάνουμε κάτι άλλο. Όταν θελήσουμε να συνδεθούμε στον υπολογιστή του οικιακού δικτύου από κάπου αλλού, αρκεί να συνδεθούμε στο μηχάνημα some-server.org και να δώσουμε κάτι τέτοιο:


ssh localhost -p 2222


Με την παραπάνω γραμμή επιχειρούμε μια σύνδεση SSΗ προς τη θύρα 2222 του τοπικού συστήματος, που στη συγκεκριμένη περίπτωση είναι ο some-server.org. Ωστόσο, εξαιτίας του reverse SSH tunnel που δημιουργήσαμε νωρίτερα, η συγκεκριμένη σύνδεση θα προωθηθεί στη θύρα 22 του μηχανήματος στο σπίτι.








Ελπίζουμε όλες αυτές οι περιγραφές των συνδέσεων, των αντιστρόφων και των ευθειών, να μην σας προκάλεσαν πονοκέφαλο. Όπως και να ‘χει, μην ξεχνάτε ότι ο υπέρτατος κανόνας της μάθησης ισχύει κι εδώ: Για να αφομοιώσετε όσα παρουσιάσαμε, μαζί με τη θεωρητική μελέτη θα χρειαστεί και η πρακτική εξάσκηση. Αν δεν έχετε το απαιτούμενο πλήθος μηχανημάτων, σας προτείνουμε να δημιουργήσετε μερικά εικονικά συστήματα και να αρχίσετε τις δοκιμές από σήμερα. Σε σχετικό άρθρο του επόμενου τεύχους θα παρουσιάσουμε μερικά πιο προχωρημένα κολπάκια και θα πρέπει να είσαστε έτοιμοι. 

via: https://deltahacker.gr
Σχόλια