Kết nối với cơ sở dữ liệu bên ngoài với pgAdmin III


7

Tôi đang cố gắng kết nối với cơ sở dữ liệu bên ngoài từ pgAdmin III (được cài đặt trên cả hai máy). Khách hàng phàn nàn:

Truy cập cơ sở dữ liệu bị từ chối

Máy chủ không cấp quyền truy cập vào cơ sở dữ liệu: máy chủ báo cáo

FATAL: no pg_hba.conf entry for host "192.168.108.161",
                                user "postgres",
                            database "postgres",
                                 SSL off 

Để truy cập cơ sở dữ liệu trên máy chủ PostgreQuery, trước tiên bạn phải cấp quyền truy cập chính cho máy chủ cho máy khách của bạn (Xác thực dựa trên máy chủ). PostgreSQL sẽ kiểm tra pg_hba.conftệp nếu một mẫu phù hợp với địa chỉ khách hàng / tên người dùng / cơ sở dữ liệu của bạn có mặt và được bật trước khi bất kỳ SQL GRANTdanh sách kiểm soát truy cập nào được đánh giá.

Các cài đặt ban đầu trong pg_hba.conf khá hạn chế, để tránh các lỗ hổng bảo mật không mong muốn gây ra bởi các cài đặt hệ thống không được xem xét nhưng bắt buộc. Bạn có thể muốn thêm một cái gì đó như

host all all 192.168.0.0/24 md5 

Ví dụ này cấp quyền truy cập mật khẩu được mã hóa MD5 cho tất cả các cơ sở dữ liệu cho tất cả người dùng trên mạng riêng 192.168.0.0/24. Bạn có thể sử dụng pg_hba.conftrình chỉnh sửa được tích hợp trong pgAdmin III để chỉnh sửa pg_hba.conftệp cấu hình.

Sau khi thay đổi pg_hba.conf, bạn cần kích hoạt cấu hình máy chủ tải lại bằng cách sử dụng pg_ctlhoặc bằng cách dừng và khởi động lại quy trình máy chủ.

Trường hợp máy chủ tuyên bố rõ ràng rằng tất cả các kết nối từ mạng nội bộ được chấp nhận.

pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
host    all             all             192.168.0.0/24          md5

Tôi đã khởi động lại bưu điện để các thay đổi có hiệu lực và đã đi xa đến mức khởi động lại toàn bộ máy. Điều gì khác có thể đi sai ở đây?

Câu trả lời:


7

Đường thẳng này:

 lưu trữ tất cả 192.168.0.0/24 md5

sẽ cho phép thông qua các kết nối từ các IP phù hợp với 192.168.0.Xnơi Xbất kỳ byte.

Địa chỉ IP của thông báo lỗi của bạn là 192.168.108.161, nó không phù hợp với mẫu này vì 108không phải 0.

Để kích hoạt các địa chỉ như 192.168.X.Y, bạn cần /16thay vì /2416 bit đầu tiên được cố định.

Như thế này:

 lưu trữ tất cả 192.168.0.0/16 md5

Đừng quên tải lại Postgresql. Từ các tài liệu chính thức, sử dụng pg_ctl reload. Nếu điều đó không hiệu quả, thì có nhiều cách khác để làm điều đó được liệt kê trong câu hỏi này .


Tôi sẽ thử điều này ngay khi tôi nhận được trong ngày hôm nay! Tôi không biết /bao nhiêu bit đã được sửa --- điều này có ý nghĩa hơn bây giờ rất nhiều!
Sean Allred

Đây là vấn đề, cảm ơn vì đã chỉ ra nó! Bây giờ, nếu tôi muốn chỉ định một địa chỉ IP chính xác , tôi sẽ sử dụng 192.168.108.161/32hay đơn giản 192.168.108.161?
Sean Allred

1
Điều này nên được 192.168.108.161/32. Ngoài ra, hãy dành thời gian để đọc phần đầu của pg_hba.conftệp về cột ADDRESS, tất cả đều được giải thích.
Daniel Vérité

2

Hai điều tôi suy nghĩ.

  1. Đầu tiên là đảm bảo máy chủ đang lắng nghe trên giao diện mạng. Theo mặc định, nó chỉ nghe trên máy chủ lưu trữ cục bộ. Chỉnh sửa postgresql.conftập tin của bạn và thay đổi:

    listen_addresses = 'localhost'

    Để trông như thế này thay vào đó:

    listen_addresses = '*'
  2. Nếu bạn đang kết nối từ xa thì postgresngười dùng của bạn cần mật khẩu. Theo mặc định, không có mật khẩu được liên kết với tài khoản đó nên chỉ có thông tin đăng nhập dựa trên niềm tin cục bộ mới hoạt động. Để đăng nhập mật khẩu từ xa (ví dụ: md5trong pg_hba.conf`) để làm việc, hãy thêm mật khẩu hoặc tạo người dùng mới bằng mật khẩu.

Ngoài ra, thay vì sử dụng hosttrong pg_hba.confxem xét sử dụng hostsslđể yêu cầu kết nối từ xa sử dụng SSL. Nếu không, thông tin đăng nhập tên người dùng / mật khẩu được gửi qua dây trong văn bản thuần túy.


1) Tôi quên đề cập rằng tôi đã chỉnh sửa listen_addressesnhư vậy, nhưng nó cũng sẽ hữu ích cho người dùng trong tương lai để thấy điều đó. 2) Khi ở trên máy chủ, tôi có thể mở pgAdmin và sau đó kết nối với cơ sở dữ liệu. Nó nhắc tôi nhập mật khẩu, tôi đặt một mật khẩu (công ty chúng tôi có mật khẩu tiêu chuẩn mà chúng tôi sử dụng để kiểm tra) và nó kết nối. Nó sẽ không thất bại tương tự nếu postgresngười dùng không có mật khẩu?
Sean Allred

Hãy thử kết nối từ dòng lệnh thông qua psqlvà xem nó báo lỗi gì. Nó phải đủ dài để tìm ra nguyên nhân. Nếu nó nói FATAL: password authentication failed for userthì đó có lẽ là một mật khẩu không khớp. Nếu nó nói could not connect to server: Connection refusedthì đó có thể là một vấn đề mạng / cổng. CIDR bạn đã chỉ định có 192.168.0.0/24đúng không? Có nên như vậy 192.168.1.0/24( 1thay vì 0cho byte thứ ba)?
sehrope

psql --host=192.168.108.160 --port=5433 --user=postgres postgreskhông thành công với cùng một lỗi (và không có khả năng khiến nó dài dòng hơn): "FATAL: không có mục pg_hba.conf cho máy chủ ..."
Sean Allred

Tôi vừa kiểm tra máy chủ và nó thực sự nói điều gì đó rất thú vị (xem xét vấn đề này không xuất hiện bằng pgAdmin): i.stack.imgur.com/g9aLK.png
Sean Allred

Vâng một điểm nữa cho psqlsau đó. Làm thế nào mà pgAdmin kết nối cục bộ sau đó? Tôi đoán bạn phải kết nối với một cơ sở dữ liệu khác. Mặt khác, tôi không thể thấy kết nối cục bộ sẽ hoạt động như thế nào nếu máy chủ không khởi động.
sehrope
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.