Tunel se podiže, QGIS se povezuje, a prijava umire s greš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 garanciju identiteta koju ste uopće htjeli. Stvarni problem je što se lokalni port i ime servera čuvaju u istom polju. Unos libpq servisa ih razdvaja, pa socket ide na proslijeđeni port dok TLS i dalje provjerava ime otisnuto na certifikatu.

Na šta klijent misli da se povezuje

Uz sslmode=verify-full libpq poredi certifikat koji server predstavlja s imenom hosta kojem se tražilo pristup. Kada je to ime loopback adresa, poređenje 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. Kada se te dvije ideje razdvoje, greška prestaje izgledati kao kvar TLS-a.

Prosljeđivanje također nije autorizacija. PostgreSQL i dalje primjenjuje svoja pravila na vezu koju uspostavlja SSH server, pa držite transportni sloj i sloj baze podataka odvojenim prije nego što bilo šta promijenite.

Vežite prosljeđivanje samo na loopback

Osluškivač treba postojati na QGIS mašini i nigdje drugdje. Izričito navođenje 127.0.0.1 drži ga podalje od drugih interfejsa, 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 servera, pa ovaj primjer pretpostavlja da PostgreSQL stoji na istom hostu kao sshd; bazi na drugoj mašini trebaju ta adresa i njena dopuštenja. 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 servisa

Datoteka servisa omogućuje istoj vezi da nosi ime za provjeru i drugo odredište socketa. Sačuvajte unos tamo gdje libpq traži servise 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 je važan u buildovima koji bi inače prvo pregovarali GSSAPI enkripciju, jer taj put ignorira upravo postavljene TLS opcije. Pozovite se na servis 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.

Šta PostgreSQL još provjerava nakon tunela

Server 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 šta server smatra, a ne šta je klijent pretpostavio.

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

Zatvorite sesiju prosljeđivanja kada 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