Τούνελ SSH για QGIS και PostGIS: κρατήστε το όνομα του διακομιστή για TLS
Μια προώθηση SSH δίνει στο QGIS μια τοπική θύρα, αλλά η βάση δεδομένων χρειάζεται ακόμη το πραγματικό της όνομα για TLS. Χρησιμοποιήστε μια υπηρεσία libpq με hostaddr και ακροατή loopback.
Το τούνελ σηκώνεται, το QGIS συνδέεται και η σύνδεση πεθαίνει με σφάλμα πιστοποιητικού που αναφέρει 127.0.0.1 αντί για τον κεντρικό υπολογιστή της βάσης δεδομένων. Το δελεαστικό επόμενο βήμα είναι να χαλαρώσετε το sslmode, που σιωπά τον έλεγχο και πετά την εγγύηση ταυτότητας που θέλατε εξαρχής. Το πραγματικό πρόβλημα είναι ότι η τοπική θύρα και το όνομα του διακομιστή αποθηκεύονται στο ίδιο πεδίο. Μια καταχώριση υπηρεσίας libpq τα χωρίζει, ώστε ο υποδοχέας να πηγαίνει στην προωθημένη θύρα ενώ το TLS εξακολουθεί να επαληθεύει το όνομα που είναι τυπωμένο στο πιστοποιητικό.
Με τι νομίζει ο πελάτης ότι συνδέεται
Με sslmode=verify-full, το libpq συγκρίνει το πιστοποιητικό που παρουσιάζει ο διακομιστής με το όνομα κεντρικού υπολογιστή που ζητήθηκε. Όταν αυτό το όνομα είναι διεύθυνση loopback, η σύγκριση αποτυγχάνει ακόμη και αν το πιστοποιητικό είναι έγκυρο για τον πραγματικό κεντρικό υπολογιστή της βάσης δεδομένων. Η προώθηση SSH αλλάζει ποιος υποδοχέας μεταφέρει τα byte, όχι την ταυτότητα που πρέπει να περιμένει ο πελάτης. Μόλις χωριστούν αυτές οι δύο ιδέες, το σφάλμα παύει να μοιάζει με βλάβη του TLS.
Μια προώθηση δεν είναι εξουσιοδότηση. Το PostgreSQL εξακολουθεί να εφαρμόζει τους δικούς του κανόνες στη σύνδεση που κάνει ο διακομιστής SSH, οπότε κρατήστε το επίπεδο μεταφοράς και το επίπεδο βάσης δεδομένων ξεχωριστά πριν αλλάξετε οτιδήποτε.
Δέστε την προώθηση μόνο στο loopback
Ο ακροατής πρέπει να υπάρχει στο μηχάνημα του QGIS και πουθενά αλλού. Η ρητή αναφορά του 127.0.0.1 τον κρατά μακριά από τις άλλες διεπαφές, ενώ μια διεύθυνση δέσμευσης που παραλείπεται μπορεί να εκθέσει τη θύρα ανάλογα με τις ρυθμίσεις πύλης του πελάτη SSH.
ssh -N -L 127.0.0.1:15432:127.0.0.1:5432 [email protected]Ο προορισμός μετά τη δεύτερη άνω τελεία επιλύεται από την πλευρά του διακομιστή SSH, οπότε αυτό το παράδειγμα υποθέτει ότι το PostgreSQL βρίσκεται στον ίδιο κεντρικό υπολογιστή με το sshd· μια βάση δεδομένων σε άλλο μηχάνημα χρειάζεται εκείνη τη διεύθυνση και τα δικαιώματά της. Εκτελέστε τη συνεδρία με -N ώστε να μην ανοίγει κέλυφος, αφήστε την επαλήθευση κλειδιού κεντρικού υπολογιστή όπως είναι και επιβεβαιώστε ότι ο ακροατής εμφανίζεται πριν κατηγορήσετε το QGIS. Αν η θύρα χρησιμοποιείται ήδη, η προώθηση αποτυγχάνει στην εκκίνηση και όχι τη στιγμή του ερωτήματος.
Βάλτε το όνομα και τον υποδοχέα σε μία καταχώριση υπηρεσίας
Ένα αρχείο υπηρεσίας επιτρέπει στην ίδια σύνδεση να μεταφέρει ένα όνομα επαλήθευσης και διαφορετικό προορισμό υποδοχέα. Αποθηκεύστε την καταχώριση εκεί όπου το libpq αναζητά υπηρεσίες ή στρέψτε το PGSERVICEFILE προς αυτήν.
[gis-via-ssh]
host=db.geo.example
hostaddr=127.0.0.1
port=15432
dbname=gisdb
user=gis_reader
sslmode=verify-full
gssencmode=disable
sslrootcert=/path/to/approved-root.crtΕδώ το host διατηρεί την ταυτότητα που χρησιμοποιείται για τους ελέγχους πιστοποιητικού, ενώ το hostaddr στέλνει πακέτα στην προωθημένη θύρα loopback, και τα δύο χρειάζονται για να δουλέψει αυτή η διάταξη. gssencmode=disable έχει σημασία σε εκδόσεις που αλλιώς θα διαπραγματεύονταν πρώτα κρυπτογράφηση GSSAPI, επειδή αυτή η διαδρομή αγνοεί τις ρυθμίσεις TLS που μόλις ορίστηκαν. Αναφερθείτε στην υπηρεσία ονομαστικά από τον διάλογο σύνδεσης PostgreSQL του QGIS και δώστε τον κωδικό πρόσβασης μέσω της συνήθους προτροπής, όχι μέσα σε κοινόχρηστο αρχείο. Τα ονόματα και οι διαδρομές παραπάνω είναι υποδείγματα· αντικαταστήστε τα με τις δικές σας εγκεκριμένες τιμές.
Τι ελέγχει ακόμη το PostgreSQL μετά το τούνελ
Ο διακομιστής βλέπει μια σύνδεση από τον κεντρικό υπολογιστή SSH, loopback σε αυτή τη διάταξη, και τη συγκρίνει με τη σειρά με τους κανόνες ταυτοποίησης βάσει κεντρικού υπολογιστή. Ο ρόλος σας στη βάση δεδομένων πρέπει ακόμη να ταυτοποιηθεί, και η σύνδεση SSH δεν παρέχει από μόνη της ταυτότητα βάσης δεδομένων. Επαληθεύστε τι πιστεύει ο διακομιστής και όχι τι υπέθεσε ο πελάτης.
psql "service=gis-via-ssh" -c "select inet_server_addr(), current_user"Κλείστε τη συνεδρία προώθησης όταν τελειώσει η εργασία· η τοπική καταχώριση τότε σταματά να λειτουργεί και τίποτε άλλο δεν αλλάζει. Μία διαδρομή προς τη βάση δεδομένων δεν είναι VPN για ολόκληρο τον πελάτη GIS, και το να τη μεταχειρίζεστε ως τέτοια είναι ο τρόπος με τον οποίο η επόμενη σύνδεση διαγιγνώσκεται λάθος.