Postgresql cho phép mở rộng mà không cần siêu người dùng


11

Tôi có một máy chủ PostgreQuery 9.5, trên đó tôi có các tập lệnh tạo vai trò và cơ sở dữ liệu cho người dùng tự động. Trong các cơ sở dữ liệu này, sẽ rất hữu ích khi kích hoạt các tiện ích mở rộng cụ thể (ví dụ: pgcrypto), nhưng theo tôi hiểu thì nó phải là một siêu người dùng để chạy CREATE EXTENSION. Có cách nào để kích hoạt các tiện ích mở rộng như vậy mà không cần đăng nhập thủ công bằng tài khoản superuser không?


4
Bạn đã thử thêm chúng vào template1và sau đó tạo từng cơ sở dữ liệu người dùng từ template1như thế CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1nào chưa?
Kassandry

1
@Kassandry không nghĩ về điều đó, nhưng là một suy nghĩ tốt. Lý tưởng nhất là tôi muốn chủ sở hữu có thể thêm tiện ích mở rộng nếu họ muốn, nhưng đây vẫn là một khả năng chấp nhận được.
beldaz

Câu trả lời:


10

Từ các tài liệu trên Phần mở rộng,

superuser (boolean) Nếu tham số này là đúng (là mặc định), chỉ siêu nhân mới có thể tạo tiện ích mở rộng hoặc cập nhật lên phiên bản mới. Nếu nó được đặt thành false, chỉ cần các đặc quyền cần thiết để thực thi các lệnh trong tập lệnh cài đặt hoặc cập nhật là bắt buộc.

Giá trị không được đặt pgcrypto.control, vì vậy nó mặc định là true, yêu cầu SuperUser.

Điều này có nghĩa là bạn không thể CREATE EXTENSIONlà chủ sở hữu của cơ sở dữ liệu, mặc dù những gì các tài liệu về TẠO RA TUYỆT VỜI khiến bạn tin tưởng.

Tôi đã cố gắng thiết lập nó false, và không có niềm vui. C là một ngôn ngữ không đáng tin cậy và bạn sẽ nhận được

LRI: quyền bị từ chối cho ngôn ngữ c

Từ các tài liệu trên pg_lingu

Chỉ siêu nhân mới có thể tạo chức năng trong các ngôn ngữ không tin cậy.

... Tất nhiên bạn có thể ctin tưởng UPDATE pg_language set lanpltrusted = true where lanname = 'c';như một siêu người dùng. Sau đó CREATE EXTENSION pgcryptosẽ hoạt động tốt như một người không siêu. Nhưng, điều đó nghe có vẻ là một ý tưởng tồi nếu bạn phải lo lắng về việc người dùng của mình tải nguồn lên thư mục tiện ích mở rộng và sau đó cài đặt nó vào cơ sở dữ liệu. Điều đó có nghĩa là, tôi sẽ không đi xa đến thế. Tôi sẽ tìm một cách khác để lột da con mèo này.


Cảm ơn Evan, đó là một câu trả lời thấu đáo như tôi có thể yêu cầu. Có lẽ tôi sẽ chọn đề xuất lột da của @ Kassandry để giải quyết vấn đề này. Tôi cũng đã nghĩ đến việc gói TẠO KIỂM TRA trong một thủ tục được lưu trữ, nhưng không thể tìm thấy một tuyến đường để làm cho công việc này trong cùng một cơ sở dữ liệu mà không có sự xác thực của dblink.
beldaz

Vậy thì vấn đề là gì khi không có bất kỳ lựa chọn nào trong pg_dumpviệc ngăn chặn nó từ bỏ các tuyên bố liên quan đến các phần mở rộng? Tôi hiện phải sử dụng các công cụ xử lý văn bản bên ngoài để loại bỏ các câu lệnh đó khỏi SQL được kết xuất bởi pg_dump.
Claudix

@Evan Carroll: có thể đặt superuser thành false thông qua psql cli không? Tôi có một ví dụ trên amazon aws rds và không có quyền truy cập vào pgcrypto.control.
ribamar

2
@ribamar không bởi vì điều đó có nghĩa là bất kỳ ai được kết nối với cơ sở dữ liệu đều có thể thực hiện thực thi mã tùy ý theo nghĩa đen như là người quản lý bưu điện db. đó sẽ là một ý tưởng khủng khiếp
Evan Carroll

không phải ai, siêu người dùng. Tôi hiểu rằng theo cách này, bạn phân biệt siêu hệ điều hành với siêu người dùng dbms, mặc dù nếu tôi đưa ra quyết định như vậy, tôi sẽ trao quyền cho công cụ và nếu thực sự cần tạo thêm một người dùng mạnh hơn nữa, tôi sẽ thực hiện nó bên trong công cụ.
ribamar
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.