SSH tunel QGIS–PostGIS: zachovajte názov servera pre TLS
Presmerovanie SSH dá QGIS miestny port, ale databáza pre TLS stále potrebuje svoj skutočný názov. Použite službu libpq s hostaddr a poslucháčom loopback.
Tunel sa zdvihne, QGIS sa pripojí a prihlásenie zomrie s chybou certifikátu, ktorá uvádza 127.0.0.1 namiesto hostiteľa databázy. Ďalším lákavým krokom je uvoľniť sslmode, čo kontrolu umlčí a zahodí záruku identity, ktorú ste vlastne chceli. Skutočný problém je, že miestny port a názov servera sa ukladajú do rovnakého poľa. Záznam služby libpq ich oddeľuje, takže socket ide na presmerovaný port, kým TLS stále overuje názov vytlačený na certifikáte.
Na čo si klient myslí, že sa pripája
Pri sslmode=verify-full libpq porovnáva certifikát, ktorý server predloží, s názvom hostiteľa, na ktorý sa pýtal. Keď je tým názvom adresa loopback, porovnanie zlyhá, aj keď je certifikát platný pre skutočného hostiteľa databázy. Presmerovanie SSH mení, ktorý socket prenáša bajty, nie identitu, ktorú má klient očakávať. Keď sa tieto dve predstavy oddelia, chyba už nevyzerá ako porucha TLS.
Presmerovanie nie je ani autorizácia. PostgreSQL stále uplatňuje svoje vlastné pravidlá na spojenie, ktoré vytvára SSH server, takže pred akoukoľvek zmenou držte transportnú vrstvu a vrstvu databázy oddelene.
Naviazte presmerovanie len na loopback
Poslucháč má existovať na stroji s QGIS a nikde inde. Výslovné uvedenie 127.0.0.1 ho drží mimo ostatných rozhraní, kým vynechaná adresa pre naviazanie môže port vystaviť podľa nastavení brány SSH klienta.
ssh -N -L 127.0.0.1:15432:127.0.0.1:5432 [email protected]Cieľ za druhou dvojbodkou sa rieši na strane SSH servera, takže tento príklad predpokladá, že PostgreSQL beží na tom istom hostiteľovi ako sshd; databáza na inom stroji potrebuje túto adresu a jej oprávnenia. Spustite reláciu s -N, aby sa neotvoril žiadny shell, nechajte overovanie kľúča hostiteľa na pokoji a pred obviňovaním QGIS overte, že sa poslucháč objavil. Ak je port už obsadený, presmerovanie zlyhá pri spustení, nie pri dopyte.
Dajte názov aj socket do jedného záznamu služby
Súbor služby umožňuje tomu istému spojeniu niesť overovací názov a iný cieľ socketu. Uložte záznam tam, kde libpq hľadá služby, alebo nasmerujte PGSERVICEFILE naň.
[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.crtTu host zachováva identitu používanú na kontroly certifikátu, kým hostaddr posiela pakety na presmerovaný port loopback a obe sú potrebné, aby tento rozvrh fungoval. gssencmode=disable je dôležité pri zostaveniach, ktoré by inak najprv vyjednali šifrovanie GSSAPI, pretože tá cesta ignoruje práve nastavené voľby TLS. Odkazujte na službu menom z dialógu pripojenia PostgreSQL v QGIS a heslo zadajte cez zvyčajnú výzvu, nie v zdieľanom súbore. Názvy a cesty vyššie sú zástupné; nahraďte ich svojimi schválenými hodnotami.
Čo PostgreSQL po tuneli ešte kontroluje
Server vidí pripojenie z hostiteľa SSH, v tomto rozvrhu loopback, a porovnáva ho v poradí s pravidlami overovania podľa hostiteľa. Vaša rola v databáze sa stále musí overiť a prihlásenie cez SSH samo o sebe neudeľuje žiadnu identitu v databáze. Overujte, čo si myslí server, nie čo predpokladal klient.
psql "service=gis-via-ssh" -c "select inet_server_addr(), current_user"Zatvorte reláciu presmerovania, keď je práca hotová; miestny záznam potom prestane fungovať a nič iné sa nezmení. Jedna cesta k databáze nie je VPN pre celého klienta GIS, a práve zaobchádzanie s ňou ako s VPN vedie k nesprávnej diagnóze ďalšieho pripojenia.