Các đặc quyền cần thiết để thực thi chức năng kích hoạt trong PostgreSQL 8.4 là gì?


11

Các đặc quyền cần thiết để thực thi chức năng kích hoạt trong PostgreSQL 8.4 là gì?

Có vẻ như các đặc quyền được đặt thành vai trò không quan trọng để thực thi chức năng kích hoạt. Tôi nghĩ rằng một ngày nào đó tôi đã thấy rằng các đặc quyền cần thiết để thực thi chức năng kích hoạt là đặc quyền EXECUTE nhưng đối với chủ sở hữu của bảng, không phải là vai trò thực tế thực hiện hành động kích hoạt trình kích hoạt gọi hàm kích hoạt.

Tôi không thể tìm thấy phần tài liệu giải thích điểm đó, có giúp được gì không?

Câu trả lời:


10

Các chức năng kích hoạt hoạt động giống như các chức năng khác khi có liên quan đến các đặc quyền. Với một ngoại lệ nhỏ:

Để tạo một kích hoạt trên một bảng, người dùng phải có TRIGGER đặc quyền trên bảng. Người dùng cũng phải có EXECUTEđặc quyền về chức năng kích hoạt.

CẬP NHẬT Sau khi phản hồi trong các ý kiến ​​tôi đã làm một số nghiên cứu. Có một mục TODO mở trong Wiki Postgres:

Thắt chặt kiểm tra quyền kích hoạt

Liên kết với chủ đề này trên tin tặc Postgres . Hiện tại, các EXECUTEđặc quyền trên một chức năng kích hoạt chỉ được kiểm tra tại thời điểm tạo kích hoạt , nhưng không phải trong thời gian chạy. Vì vậy, việc thu hồi EXECUTE trên chức năng kích hoạt không có tác dụng đối với trình kích hoạt một khi được tạo. Quan sát của bạn có vẻ đúng.

Điều này không cấp bất kỳ đặc quyền bổ sung để thao túng các đối tượng. Nếu vai trò gọi thiếu các đặc quyền cần thiết để thực thi (các phần của) thân hàm, ngoại lệ thông thường được nêu ra. Để mở đường, bạn có thể tạo một người dùng đặc quyền OWNERcủa hàm và sử dụng

SECURITY DEFINER

mệnh đề, như được ghi trong tài liệu hướng dẫn ở đây . Nó làm cho chức năng được chạy với sự cho phép của chủ sở hữu thay vì invoker (mặc định).

Nếu chủ sở hữu là siêu người dùng, bạn cần hết sức cẩn thận, người bạn cấp EXECUTEđặc quyền và chức năng có thể làm gì để tránh lạm dụng. Bạn có thể muốn

REVOKE ALL ON FUNCTION foo() FROM public;

để bắt đầu và sử dụng SET search_pathcho chức năng.
Hãy chắc chắn đọc chương về Chức năng viết một cách SECURITY DEFINERan toàn .

Tìm một ví dụ mã trong câu trả lời liên quan này trên SO.


Không, tôi không muốn a SECURITY DEFINER, tôi muốn a SECURITY INVOKER. Nhưng dường như (đối với chức năng kích hoạt, không phải cho chức năng thông thường) rằng bằng cách sử dụng tùy chọn mặc định ( SECURITY INVOKER), nó không hoạt động như vậy.

1
@EtienneRouxel: các hàm kích hoạt là các hàm giống như các hàm khác khi có liên quan đến các đặc quyền. Điều gì khiến bạn nghĩ khác?
Erwin Brandstetter

@EtienneRouxel: Tôi đã thêm một mẫu trích dẫn trong tài liệu hướng dẫn để ghi lại một ngoại lệ nhỏ.
Erwin Brandstetter

1
Kiểm tra: Tôi đã tạo một hàm kích hoạt đơn giản làm tăng a NOTICE. Tôi loại bỏ các ALLđặc quyền từ PUBLICvà từ chủ sở hữu của chức năng. Sau đó, nếu tôi sử dụng chủ sở hữu hoặc bất kỳ vai trò nào khác không có bất kỳ đặc quyền nào đối với chức năng đó, tôi sẽ gặp lỗi do thiếu đặc quyền nhưng mọi thứ đều chạy thành công.

2
@EtienneRouxel: Thú vị. Tôi cũng đã thử nghiệm. Bạn không thể tạo trình kích hoạt nếu bạn không có đặc quyền thực thi cho chức năng kích hoạt. Nhưng bạn vẫn có thể thu hồi đặc quyền thực thi đó sau khi tạo trình kích hoạt và trình kích hoạt sẽ không ngừng hoạt động. Tôi đã làm một số nghiên cứu. Thêm liên kết vào câu hỏi ...
Erwin Brandstetter 23/07/13
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.