PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL - Người dùng DB chỉ được phép gọi các hàm

Không có "đặc quyền trên SELECT ". Tất cả những gì bạn cần là đặc quyền EXECUTE chức năng. Chức năng có liên quan có thể chạy với BẢO MẬT ĐỊNH NGHĨA được thừa hưởng mọi đặc quyền của chủ sở hữu. Để hạn chế việc leo thang đặc quyền có thể đến mức ưu tiên tối thiểu, hãy đặt một vai trò daemon sở hữu các chức năng liên quan chỉ với các đặc quyền cần thiết - không phải là siêu người dùng!

Công thức

Là siêu người dùng ...

Tạo vai trò không phải superuser myuser .

CREATE ROLE myuser PASSWORD ...;

Tạo vai trò nhóm nhóm tôi và tạo myuser thành viên trong đó.

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

Bạn có thể muốn thêm nhiều người dùng hơn giống như myuser sau.

Không cấp bất kỳ đặc quyền nào tới myuser .
Chỉ cấp những thứ này cho mygroup :

  • CẤP KẾT NỐI TRÊN CƠ SỞ DỮ LIỆU mydb VỚI nhóm của tôi;
  • CẤP PHÉP SỬ DỤNG TRÊN SCHEMA công khai cho nhóm của tôi;
  • CẤP PHÉP THỰC HIỆN CHỨC NĂNG foo () CHO nhóm của tôi;

Xóa tất cả đặc quyền cho public myuser đó không nên có.

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

Có thể có nhiều hơn nữa. Tôi trích dẫn sách hướng dẫn:

Tạo vai trò daemon để sở hữu các chức năng liên quan.

CREATE ROLE mydaemon;

Chỉ cấp các đặc quyền cần thiết để thực thi các chức năng này cho mydaemon , (bao gồm THỰC HIỆN CHỨC NĂNG để cho phép một hàm khác được gọi). Một lần nữa, bạn có thể sử dụng vai trò nhóm để nhóm các đặc quyền và cấp chúng cho mydaemon

GRANT bundle1 TO mydaemon;

Ngoài ra, bạn có thể sử dụng DEFAULT PRIVILEGES để tự động cấp các đặc quyền nhất định cho các đối tượng trong tương lai cho một gói hoặc daemon trực tiếp:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES    TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE  ON SEQUENCES TO bundle1;

Điều này chỉ áp dụng cho vai trò mà nó được thực thi. Theo tài liệu:

Để cũng bao gồm các đối tượng đã có từ trước trong giản đồ (xem bình luận của rob ):

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO bundle1;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO bundle1;

Tạo mydaemon sở hữu các chức năng liên quan. Có thể trông giống như sau:

CREATE OR REPLACE FUNCTION foo()
  ...
SECURITY DEFINER SET search_path = myschema, pg_temp;

ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT  EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT  EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..

### Lưu ý
Do lỗi này trong phiên bản 1.16.1 hiện tại của pgAdmin lệnh cần thiết

REVOKE EXECUTE ON FUNCTION foo() FROM public;

bị thiếu trong tập lệnh DDL được thiết kế ngược. Hãy nhớ thêm nó khi tạo lại.
Lỗi này đã được sửa trong phiên bản hiện tại pgAdmin 1.18.1.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối Django với postgres bằng docker-soạn

  2. plpgsql:gọi một hàm có 2 tham số OUT

  3. Phương pháp hay nhất về xử lý quan hệ giữa các bảng trong Spring Data R2dbc

  4. Kế thừa PostgreSQL với JPA, Hibernate

  5. Làm thế nào để đặt một trường cơ sở dữ liệu nullable thành NULL với kiểu chữ?