Người dùng đã tạo có thể truy cập tất cả các cơ sở dữ liệu trong PostgreSQL mà không cần bất kỳ khoản tài trợ nào


44

Tôi phải thiếu một cái gì đó liên quan đến việc thiết lập PostgreSQL. Những gì tôi muốn làm là tạo nhiều cơ sở dữ liệu và người dùng tách biệt với nhau để một người dùng cụ thể chỉ có quyền truy cập vào cơ sở dữ liệu mà tôi chỉ định. Tuy nhiên, từ những gì tôi có thể xác định, bất kỳ người dùng nào được tạo đều có quyền truy cập vào tất cả các cơ sở dữ liệu mà không có bất kỳ khoản trợ cấp cụ thể nào được đưa ra.

Đây là những gì tôi làm trên Ubuntu Server 12.04:

  1. apt-get cài đặt postgresql
  2. sudo -u postgres creatuser -DRSP mike1 (Chỉ định mật khẩu cho người dùng mới)
  3. sudo -u postgres createdb data1
  4. psql -h localhost -U mike1 data1 (Chỉ định mật khẩu cho người dùng mike1 để đăng nhập)

Có vẻ như người dùng mới "mike1" không gặp vấn đề gì khi kết nối với cơ sở dữ liệu "data1" và tạo bảng, v.v. Và điều này không chạy bất kỳ lệnh GRANT nào cả (và chủ sở hữu của "data1" là "postgres" vì tôi không chỉ định chủ sở hữu ở bước 3). Đây thực sự là cách nó được cho là để làm việc?

Điều tôi muốn làm là cấp cho mike1 quyền truy cập đầy đủ vào data1 và sau đó lặp lại điều này cho nhiều người dùng và cơ sở dữ liệu hơn, đảm bảo rằng người dùng chỉ có quyền truy cập vào một (hoặc có thể một vài) cơ sở dữ liệu mà tôi chọn.


1
Hãy nhớ rằng ngay cả khi người dùng bị giới hạn trong một cơ sở dữ liệu, họ vẫn có thể truy vấn các bảng toàn cầu, điều này sẽ cho phép họ xem danh sách tên cơ sở dữ liệu và danh sách người dùng.
kgrittn

Câu trả lời:


47

Ở cấp độ SQL, mọi người dùng thực sự có thể kết nối với cơ sở dữ liệu mới được tạo, cho đến khi lệnh SQL sau được ban hành:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Sau khi hoàn thành, mỗi người dùng hoặc vai trò có thể kết nối phải được cấp một cách rõ ràng đặc quyền kết nối:

GRANT connect ON DATABASE database_name TO rolename;

Chỉnh sửa: Trong một kịch bản nhiều người thuê, không chỉ có connectđặc quyền sẽ bị xóa. Đối với các mẹo nhiều người thuê và các thực tiễn tốt nhất, bạn có thể muốn đọc trên wiki công cộng postgresql: Lưu trữ cơ sở dữ liệu được chia sẻquyền quản lý trong PostgreQuery .


Mặc định nên có cách khác. Tôi muốn tạo một người dùng với mật khẩu được tạo ngẫu nhiên và cấp cho nó quyền truy cập vào một DB duy nhất, biết rằng postgrescó thể truy cập tất cả các cơ sở dữ liệu.
TheRealChx101

24

PUBLIC có quyền truy cập vào cơ sở dữ liệu theo mặc định, nhưng nó không thể truy cập dữ liệu. Bạn có thể SỬA CHỮA CÔNG CỘNG:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Nếu bạn muốn cài đặt này cho tất cả các cơ sở dữ liệu trong tương lai, hãy thu hồi CONNECT trên cơ sở dữ liệu template1 (cơ sở dữ liệu mẫu mặc định để tạo cơ sở dữ liệu mới):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

Tôi hiểu rồi. Bây giờ nó có ý nghĩa hơn. Tôi đoán tôi không nên đến đây với tư cách là người mới sử dụng PostgreSQL và tranh cãi rằng có lẽ PUBLIC không nên có đặc quyền CONNECT trên template1 như một mặc định :) Nhưng bây giờ tôi cũng thấy rằng dữ liệu không bao giờ gặp nguy hiểm. Cảm ơn!
bắt chước

1
Bạn được chào đón nhiều hơn với tư cách là người mới, cũng để cài đặt tranh chấp. Mọi người đều có thể học hỏi từ đó!
Frank Heikens

1
Trên thực tế, đặc quyền CONNECT đó không được truyền từ mẫu sang cơ sở dữ liệu mới nên việc thu hồi nó trên template1 không có tác dụng được đề cập.
Daniel Vérité

2
@ DanielVérité tôi thấy. Vì vậy, tôi đoán giải pháp là luôn luôn nhớ và thực hiện REVOKE CONNECT khi tạo cơ sở dữ liệu mới. Đây có thực sự là cách nó thường được thực hiện bởi các quản trị viên PostgreSQL hay tôi không nên quan tâm đến điều đó vì dữ liệu không thể truy cập được? Tuy nhiên, tôi nghĩ rằng một danh sách các bảng có thể cung cấp thông tin không cần thiết cho các cuộc tấn công trong tương lai, nếu chỉ giữa những người dùng đã được ủy quyền trong môi trường nhiều người thuê. Ngoài ra: chỉ cần nhận ra rằng công chúng cũng có thể tạo các bảng của riêng mình trong bất kỳ cơ sở dữ liệu nào chưa được REVOKE CONNECT. Cảm thấy một chút kỳ lạ để có một mặc định, tôi phải nói.
bắt chước

1
Đúng. Tôi đang thêm các liên kết liên quan đến câu trả lời của tôi, bạn có thể muốn đọc thêm một vài tài liệu về điều đó.
Daniel Vérité

4

Bên cạnh việc thu hồi các đặc quyền kết nối từ PUBLIC theo mặc định và cấp cho chúng theo mong muốn cụ thể, cấp độ khác mà bạn có thể kiểm soát quyền truy cập là thông qua tệp pg_hba.conf.

Bạn có thể tìm thấy nơi tệp được lưu trữ với:

SHOW hba_file;

Nếu bạn chọn sử dụng cơ chế này, có những bình luận được nhúng có thể đủ để bạn bắt đầu. Các tài liệu ở đây:

http://www.postgresql.org/docs/civerse/interactive/auth-pg-hba-conf.html


Cảm ơn! Tôi đã xem tệp pg_hba.conf nhưng tôi có ấn tượng rằng nó chỉ chi phối cách người dùng xác thực khi kết nối với cơ sở dữ liệu chứ không phải những đặc quyền mà người dùng có trong cùng cơ sở dữ liệu đó.
bắt chước

1
Người dùng chỉ có thể kết nối với cơ sở dữ liệu khi được pg_hba.conf cho phép. Điều đó bao gồm không chỉ sự kết hợp giữa người dùng và cơ sở dữ liệu, mà cả máy chủ mà họ đang kết nối và phương thức xác thực được phép. Nếu bạn không cần mức độ chi tiết của kiểm soát, GRANT/ REVOKEkỹ thuật được thảo luận trong các câu trả lời khác có thể dễ dàng hơn. Đối với một điều, bạn chỉ cần một kết nối cơ sở dữ liệu siêu người dùng cho điều đó, thay vì cần đăng nhập hệ điều hành có thể chỉnh sửa tệp.
kgrittn

0

Tôi đã xem qua chủ đề này để tìm cách ngăn người dùng thậm chí liệt kê các tên cơ sở dữ liệu khác. Các REVOKE CONNECTkhông ngăn chặn điều này.

Theo câu trả lời cho câu hỏi SO này, không có cách nào (khuyến nghị) để đạt được nó.

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.