Tunnel naik, QGIS terhubung, dan login mati dengan galat sertifikat yang menyebut 127.0.0.1 alih-alih host basis data. Langkah berikutnya yang menggoda adalah melonggarkan sslmode, yang membungkam pemeriksaan dan membuang jaminan identitas yang justru Anda inginkan. Masalah sebenarnya adalah port lokal dan nama server disimpan di bidang yang sama. Entri layanan libpq memisahkan keduanya, sehingga soket menuju port yang diteruskan sementara TLS tetap memverifikasi nama yang tercetak pada sertifikat.

Ke apa klien mengira dirinya terhubung

Dengan sslmode=verify-full, libpq membandingkan sertifikat yang disajikan server dengan nama host yang diminta. Bila nama itu alamat loopback, perbandingan gagal meskipun sertifikat valid untuk host basis data yang sebenarnya. Penerusan SSH mengubah soket mana yang membawa byte, bukan identitas yang seharusnya diharapkan klien. Setelah kedua gagasan itu dipisahkan, galat tidak lagi tampak seperti kerusakan TLS.

Penerusan juga bukan otorisasi. PostgreSQL tetap menerapkan aturannya sendiri pada koneksi yang dibuat server SSH, jadi pisahkan lapisan transport dan lapisan basis data sebelum mengubah apa pun.

Ikat penerusan hanya ke loopback

Pendengar harus ada di mesin QGIS dan tidak di tempat lain. Menyebut 127.0.0.1 secara eksplisit menjauhkannya dari antarmuka lain, sedangkan alamat ikat yang dihilangkan dapat membuka port ke luar tergantung pengaturan gateway klien SSH.

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

Tujuan setelah titik dua kedua diselesaikan dari sisi server SSH, jadi contoh ini mengasumsikan PostgreSQL berada di host yang sama dengan sshd; basis data di mesin lain memerlukan alamat itu dan izinnya. Jalankan sesi dengan -N agar tidak ada shell yang terbuka, biarkan verifikasi kunci host apa adanya, dan pastikan pendengar muncul sebelum menyalahkan QGIS. Jika port sudah dipakai, penerusan gagal saat mulai, bukan saat kueri.

Letakkan nama dan soket dalam satu entri layanan

Berkas layanan memungkinkan koneksi yang sama membawa nama verifikasi dan tujuan soket yang berbeda. Simpan entri di tempat libpq mencari layanan, atau arahkan PGSERVICEFILE ke sana.

[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

Di sini host mempertahankan identitas yang dipakai untuk pemeriksaan sertifikat sementara hostaddr mengirim paket ke port loopback yang diteruskan, dan keduanya diperlukan agar susunan ini bekerja. gssencmode=disable penting pada build yang jika tidak akan menegosiasikan enkripsi GSSAPI lebih dulu, karena jalur itu mengabaikan pengaturan TLS yang baru saja disetel. Rujuk layanan itu dengan namanya dari dialog koneksi PostgreSQL QGIS dan berikan kata sandi melalui prompt biasa, bukan di dalam berkas bersama. Nama dan jalur di atas adalah placeholder; ganti dengan nilai Anda sendiri yang disetujui.

Apa yang masih diperiksa PostgreSQL setelah tunnel

Server melihat koneksi dari host SSH, loopback dalam susunan ini, dan mencocokkannya secara berurutan dengan aturan autentikasi berbasis host. Peran basis data Anda tetap harus diautentikasi, dan login SSH tidak dengan sendirinya memberikan identitas basis data. Verifikasi apa yang diyakini server, bukan apa yang diasumsikan klien.

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

Tutup sesi penerusan saat pekerjaan selesai; entri lokal kemudian berhenti berfungsi dan tidak ada hal lain yang berubah. Satu jalur basis data bukan VPN untuk seluruh klien GIS, dan memperlakukannya sebagai VPN itulah yang membuat koneksi berikutnya salah didiagnosis.

Artikel terkait