Tunel se podiže, QGIS se povezuje, a prijava umire s pogreškom certifikata koja navodi 127.0.0.1 umjesto hosta baze podataka. Sljedeći primamljiv potez je popustiti sslmode, što utišava provjeru i odbacuje jamstvo identiteta koje ste uopće htjeli. Stvarni je problem što se lokalni port i ime poslužitelja čuvaju u istom polju. Unos libpq usluge ih razdvaja, pa socket ide na proslijeđeni port dok TLS i dalje provjerava ime otisnuto na certifikatu.

Na što klijent misli da se povezuje

Uz sslmode=verify-full libpq uspoređuje certifikat koji poslužitelj predstavlja s imenom hosta kojem se tražilo pristup. Kad je to ime loopback adresa, usporedba ne uspijeva iako je certifikat valjan za stvarni host baze podataka. SSH prosljeđivanje mijenja koji socket nosi bajtove, a ne identitet koji klijent treba očekivati. Kad se te dvije ideje razdvoje, pogreška prestaje izgledati kao kvar TLS-a.

Prosljeđivanje nije ni autorizacija. PostgreSQL i dalje primjenjuje svoja pravila na vezu koju uspostavlja SSH poslužitelj, pa držite transportni sloj i sloj baze podataka odvojenima prije nego što bilo što promijenite.

Vežite prosljeđivanje samo na loopback

Osluškivač treba postojati na QGIS stroju i nigdje drugdje. Izričito navođenje 127.0.0.1 drži ga podalje od drugih sučelja, dok izostavljena adresa vezivanja može izložiti port ovisno o postavkama pristupnika SSH klijenta.

ssh -N -L 127.0.0.1:15432:127.0.0.1:5432 [email protected]

Odredište nakon druge dvotočke razrješava se sa strane SSH poslužitelja, pa ovaj primjer pretpostavlja da PostgreSQL stoji na istom hostu kao sshd; bazi na drugom stroju trebaju ta adresa i njezine dozvole. Pokrenite sesiju s -N da se ne otvara ljuska, ne dirajte provjeru ključa hosta i potvrdite da se osluškivač pojavljuje prije nego okrivite QGIS. Ako je port već zauzet, prosljeđivanje pada pri pokretanju, a ne pri upitu.

Stavite ime i socket u jedan unos usluge

Datoteka usluge omogućuje istoj vezi da nosi ime za provjeru i drugo odredište socketa. Spremite unos tamo gdje libpq traži usluge ili usmjerite PGSERVICEFILE na njega.

[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

Ovdje host zadržava identitet koji se koristi za provjere certifikata, dok hostaddr šalje pakete na proslijeđeni loopback port, i oboje je potrebno da bi ovaj raspored radio. gssencmode=disable važan je u buildovima koji bi inače prvo pregovarali GSSAPI enkripciju, jer taj put zanemaruje upravo postavljene TLS opcije. Pozovite se na uslugu po imenu iz QGIS dijaloga za PostgreSQL vezu i dostavite lozinku kroz uobičajeni upit, a ne unutar dijeljene datoteke. Imena i putanje iznad su zamjenske vrijednosti; zamijenite ih svojim odobrenim vrijednostima.

Što PostgreSQL još provjerava nakon tunela

Poslužitelj vidi vezu s SSH hosta, u ovom rasporedu loopback, i redom je uparuje s pravilima autentifikacije po hostu. Vaša uloga u bazi i dalje se mora autentificirati, a SSH prijava sama po sebi ne daje identitet u bazi. Provjerite što poslužitelj smatra, a ne što je klijent pretpostavio.

psql "service=gis-via-ssh" -c "select inet_server_addr(), current_user"

Zatvorite sesiju prosljeđivanja kad posao završi; lokalni unos tada prestaje raditi i ništa se drugo ne mijenja. Jedna putanja do baze nije VPN za cijeli GIS klijent, a tretiranje kao VPN-a vodi do pogrešne dijagnoze sljedeće veze.

Povezani članci