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.