Тунел се подиже, QGIS се повезује, а пријава умире са грешком сертификата која наводи 127.0.0.1 уместо хоста базе података. Следећи примамљив потез је попустити sslmode, што утишава проверу и одбацује гаранцију идентитета коју сте уопште хтели. Прави проблем је што се локални порт и име сервера чувају у истом пољу. Унос libpq услуге их раздваја, па сокет иде на прослеђени порт док TLS и даље проверава име отиснуто на сертификату.

На шта клијент мисли да се повезује

Уз sslmode=verify-full libpq пореди сертификат који сервер представља са именом хоста коме се тражио приступ. Кад је то име loopback адреса, поређење не успева иако је сертификат валидан за стварни хост базе података. SSH прослеђивање мења који сокет носи бајтове, а не идентитет који клијент треба да очекује. Кад се те две идеје раздвоје, грешка престаје да изгледа као квар 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 опције. Позовите се на услугу по имену из QGIS дијалога за PostgreSQL везу и доставите лозинку кроз уобичајени упит, а не унутар дељене датотеке. Имена и путање изнад су заменске вредности; замените их својим одобреним вредностима.

Шта PostgreSQL још проверава након тунела

Сервер види везу са SSH хоста, у овом распореду loopback, и редом је упарује са правилима аутентификације по хосту. Ваша улога у бази и даље мора да се аутентификује, а SSH пријава сама по себи не даје идентитет у бази. Проверите шта сервер сматра, а не шта је клијент претпоставио.

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

Затворите сесију прослеђивања кад посао заврши; локални унос тада престаје да ради и ништа се друго не мења. Једна путања до базе није VPN за цео GIS клијент, а третирање као VPN-а води до погрешне дијагнозе следеће везе.

Повезани чланци