Đường hầm dựng lên, QGIS kết nối, và đăng nhập chết với lỗi chứng chỉ nêu 127.0.0.1 thay vì máy chủ cơ sở dữ liệu. Bước tiếp theo đầy cám dỗ là nới lỏng sslmode, điều này làm im lặng việc kiểm tra và ném bỏ bảo đảm danh tính mà bạn thực sự muốn. Vấn đề thật sự là cổng cục bộ và tên máy chủ được lưu trong cùng một trường. Một mục dịch vụ libpq tách chúng ra, nên socket đi tới cổng đã chuyển tiếp trong khi TLS vẫn xác minh tên in trên chứng chỉ.

Máy khách tưởng mình đang kết nối tới đâu

Với sslmode=verify-full, libpq so sánh chứng chỉ máy chủ trình ra với tên máy chủ được yêu cầu. Khi tên đó là địa chỉ loopback, việc so sánh thất bại dù chứng chỉ hợp lệ cho máy chủ cơ sở dữ liệu thật. Chuyển tiếp SSH thay đổi socket nào mang byte, không phải danh tính mà máy khách nên chờ đợi. Khi tách hai ý này ra, lỗi không còn trông như sự cố TLS.

Chuyển tiếp cũng không phải sự cấp quyền. PostgreSQL vẫn áp dụng các quy tắc riêng của nó cho kết nối do máy chủ SSH tạo ra, nên hãy giữ tầng truyền tải và tầng cơ sở dữ liệu tách biệt trước khi thay đổi bất cứ điều gì.

Chỉ gắn chuyển tiếp với loopback

Trình lắng nghe chỉ nên tồn tại trên máy QGIS và không nơi nào khác. Việc nêu rõ 127.0.0.1 giữ nó tách khỏi các giao diện khác, còn địa chỉ liên kết bị bỏ qua có thể để lộ cổng ra ngoài tùy theo cài đặt cổng vào của máy khách SSH.

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

Đích sau dấu hai chấm thứ hai được phân giải từ phía máy chủ SSH, nên ví dụ này giả định PostgreSQL nằm trên cùng máy chủ với sshd; cơ sở dữ liệu trên máy khác cần địa chỉ đó và các quyền của nó. Chạy phiên với -N để không có shell nào mở ra, đừng động vào việc xác minh khóa máy chủ và xác nhận trình lắng nghe xuất hiện trước khi đổ lỗi cho QGIS. Nếu cổng đã được dùng, chuyển tiếp thất bại lúc khởi động chứ không phải lúc truy vấn.

Đặt tên và socket vào một mục dịch vụ

Tệp dịch vụ cho phép cùng một kết nối mang tên xác minh và một đích socket khác. Lưu mục ở nơi libpq tìm dịch vụ, hoặc trỏ PGSERVICEFILE tới đó.

[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

Ở đây host giữ danh tính dùng cho việc kiểm tra chứng chỉ trong khi hostaddr gửi gói tới cổng loopback đã chuyển tiếp, và cả hai đều cần thiết để cách bố trí này hoạt động. gssencmode=disable quan trọng trên các bản dựng mà nếu không sẽ thương lượng mã hóa GSSAPI trước, vì đường đó bỏ qua cài đặt TLS vừa thiết lập. Hãy tham chiếu dịch vụ theo tên từ hộp thoại kết nối PostgreSQL của QGIS và cung cấp mật khẩu qua lời nhắc thông thường, không phải trong một tệp chia sẻ. Các tên và đường dẫn trên là chỗ giữ chỗ; hãy thay bằng giá trị đã được phê duyệt của bạn.

PostgreSQL còn kiểm tra gì sau đường hầm

Máy chủ thấy một kết nối từ máy chủ SSH, trong cách bố trí này là loopback, và đối chiếu lần lượt với các quy tắc xác thực dựa trên máy chủ. Vai trò cơ sở dữ liệu của bạn vẫn phải xác thực, và đăng nhập SSH tự nó không cấp danh tính cơ sở dữ liệu nào. Hãy kiểm chứng điều máy chủ tin, không phải điều máy khách giả định.

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

Đóng phiên chuyển tiếp khi công việc xong; mục cục bộ sau đó ngừng hoạt động và không gì khác thay đổi. Một đường tới cơ sở dữ liệu không phải là VPN cho toàn bộ máy khách GIS, và coi nó như VPN chính là cách kết nối tiếp theo bị chẩn đoán sai.

Bài viết liên quan