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

Tổng quan về các tiện ích mở rộng đáng tin cậy trong PostgreSQL 13

Trong blog trước đây của tôi, chúng tôi đã khám phá các khả năng mới của sao chép lôgic với bảng phân vùng trong PostgreSQL 13. Không cần phải nói rằng có vô số các tính năng như vậy trong bản phát hành được đề cập sẽ sớm nâng cao trải nghiệm cho DBA và ứng dụng các nhà phát triển như nhau.

Trong khi xem xét PostgreSQL 13, tôi đã quan sát thấy một mục thu hút sự chú ý của tôi:

PostgreSQL 13 giới thiệu khái niệm "tiện ích mở rộng đáng tin cậy", cho phép siêu người dùng chỉ định các tiện ích mở rộng mà người dùng có thể cài đặt trong cơ sở dữ liệu của họ miễn là họ có đặc quyền TẠO.

Hãy cùng Tua lại

Chúng tôi biết rằng PostgreSQL có sức mạnh mở rộng để thêm lông vào mũ của nó mà không làm ảnh hưởng nhiều đến cốt lõi của nó. Nói cách khác, các tiện ích mở rộng nâng cao khả năng chức năng cho Máy chủ PostgreSQL theo cách không xâm phạm.

Trên thực tế, có nhiều tổ chức bên thứ ba đã sử dụng cơ chế tiện ích mở rộng để tạo ra các bộ tính năng tuyệt vời. TimescaleDB là một trong những tiện ích mở rộng như vậy, nó giống như thay đổi tính cách của Máy chủ PostgreSQL để làm cho nó phù hợp hơn với khối lượng công việc IOT.

Chúng ta hãy xem xét những gì đã có trước PostgreSQL 13 và tại sao nó lại là một nỗi đau thực sự. Hãy xem xét một Phiên bản PostgreSQL được lưu trữ có chứa hai vai trò:

  • postgres (siêu người dùng)
  • johnsmith (người dùng bình thường)

Và cơ sở dữ liệu leniesdb.

John Smith muốn thêm phần mở rộng postgres hstore vào leniedb, vì mã ứng dụng của anh ấy dựa vào đó. Hãy cố gắng làm điều đó.

 psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

Lỗi chỉ ra rõ ràng rằng tiện ích mở rộng chỉ có thể được tạo bởi siêu người dùng, tức là postgres. Mặc dù các tiện ích mở rộng như hstore không có bất kỳ mối lo ngại nào về bảo mật trong bối cảnh sử dụng nó, nhưng vẫn chỉ có những người dùng cấp cao mới có thể tạo tiện ích mở rộng này trên cơ sở dữ liệu.

Điều gì sẽ xảy ra nếu cơ sở dữ liệu do johnsmith sở hữu hoặc tạo - chúng ta cũng có thể thử. Trong đoạn mã sau, postgres superuser đang cho phép johnsmith tạo toàn bộ cơ sở dữ liệu mới của riêng anh ấy để chơi xung quanh:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

Ahh! Nó không tạo ra bất kỳ sự khác biệt nào. Mặc dù johnsmith là chủ sở hữu của jsDB, anh ấy vẫn không thể cài đặt các tiện ích mở rộng đơn giản, có liên quan vào cơ sở dữ liệu của mình.

Nhưng đó là tất cả trong máy chủ PostgreSQL 12 (trở xuống); nó sẽ thay đổi với PostgreSQL phiên bản 13. Tại thời điểm viết blog này - PostgreSQL phiên bản 13 đang ở giai đoạn Beta2 và nhóm đã viết thông báo phát hành. Tôi sẽ thử "tiện ích mở rộng đáng tin cậy" với mã nhị phân Beta2.

Đây là PostgreSQL 13

Mong đợi một hành vi khác với khái niệm về tiện ích mở rộng đáng tin cậy (ít nhất là đối với mô-đun đóng góp hoặc tiện ích mở rộng được đóng gói sẵn). Hãy kiểm tra hành vi với PostgreSQL13 để biết các lệnh tương tự như chúng tôi đã thực hiện cho PostgreSQL12.

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must have CREATE privilege on current database to create this extension.

Điều này khá giống nhau, tức là johnsmith vẫn không thể tạo tiện ích mở rộng. Nhưng vẫn có một sự khác biệt nhỏ - GỢI Ý cho thấy rằng đặc quyền CREATE bị thiếu. Bộ lệnh thứ hai của chúng tôi sẽ giải quyết vấn đề đó:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

jsDB=>SELECT extname from pg_extension;

 extname

---------

 plpgsql

 hstore

(2 rows)

Lần này mọi thứ đã thực sự hiệu quả. Superuser có thể cho phép các đặc quyền tương tự trên db postgres bằng cách thực hiện lệnh sau:

postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;

Nhưng tiện ích mở rộng đáng tin cậy còn nhiều thứ hơn thế này, hãy thử tạo một tiện ích mở rộng khác:

jsDB=> create extension file_fdw;

ERROR:  permission denied to create extension "file_fdw"

HINT:  Must be superuser to create this extension.

Sự khác biệt đến từ thực tế là trong khi hstore được đánh dấu là đáng tin cậy, file_fdw KHÔNG được đánh dấu là đáng tin cậy. Nó được đánh dấu ở đâu? Nó nằm trong tệp điều khiển của các tiện ích mở rộng.

$ cd /usr/pgsql-13/share/extension 

$ grep -l trusted hstore.control file_fdw.control;

hstore.control

Trên thực tế, có 24 tiện ích mở rộng đáng tin cậy và 24 tiện ích mở rộng không đáng tin cậy đi kèm với postgreSQL13.

Tóm lại, người quản lý cấp cao có thể từ bỏ quyền kiểm soát đối với các tiện ích mở rộng đáng tin cậy như vậy; và bất kỳ người dùng nào có quyền CREATE trên cơ sở dữ liệu đều có thể bật tiện ích mở rộng đáng tin cậy mà không cần tiếp cận quản trị viên cơ sở dữ liệu của họ.

Kết luận

Phía sau, hành vi được kiểm soát bởi hai tham số trong tệp điều khiển tiện ích mở rộng:

  • superuser, mặc định là true
  • đáng tin cậy, mặc định là false

Một phần mở rộng chỉ có thể được tạo bởi người dùng không phải là siêu người dùng nếu cả hai đều đúng. Trên thực tế, tiện ích mở rộng đáng tin cậy là tập lệnh cài đặt hoặc cập nhật được chạy dưới dạng siêu người dùng bootstrap, không phải với tư cách người dùng đang gọi. Hãy nhớ rằng tiện ích mở rộng có thể được viết bằng ngôn ngữ mà bản thân nó không đáng tin cậy - do đó cần phải có.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trích xuất tháng từ một ngày trong PostgreSQL

  2. Nghiên cứu độ chậm của PostGIS (ấn bản 2019)

  3. Fluent NHibernate và PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:Không hỗ trợ phương pháp đã chỉ định

  4. Khối mã ẩn danh PL / pgSQL

  5. Tham chiếu đến bí danh cột tổng hợp được chọn trong mệnh đề có trong Postgres