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

Đặc quyền và bảo mật của PostgreSQL - Khóa giản đồ công khai

Giới thiệu

Trong bài viết trước, chúng tôi đã giới thiệu những kiến ​​thức cơ bản về cách hiểu lược đồ PostgreSQL, cơ chế tạo và xóa cũng như xem xét một số trường hợp sử dụng. Bài viết này sẽ mở rộng những điều cơ bản đó và khám phá việc quản lý các đặc quyền liên quan đến các lược đồ.

Thêm quá tải thuật ngữ

Nhưng có một vấn đề sơ bộ cần được làm rõ. Nhớ lại rằng trong phần trước, chúng ta đã đề cập đến một điểm có thể nhầm lẫn liên quan đến việc nạp chồng thuật ngữ “lược đồ”. Ý nghĩa chuyên biệt của thuật ngữ đó trong ngữ cảnh của cơ sở dữ liệu PostgreSQL khác với cách nó thường được sử dụng trong các hệ quản trị cơ sở dữ liệu quan hệ. Chúng tôi có một thuật ngữ tương tự khác có thể có cho chủ đề hiện tại liên quan đến từ “công khai”.

Khi tạo cơ sở dữ liệu ban đầu, cơ sở dữ liệu Postgresql mới được tạo bao gồm một lược đồ được xác định trước có tên là “công khai”. Đây là một lược đồ giống như bất kỳ lược đồ nào khác, nhưng từ tương tự cũng được sử dụng làm từ khóa biểu thị “tất cả người dùng” trong các ngữ cảnh mà nếu không thì một tên vai trò thực tế có thể được sử dụng, chẳng hạn như ... chờ nó ... quản lý đặc quyền lược đồ . Ý nghĩa và hai cách sử dụng riêng biệt sẽ được làm rõ trong các ví dụ dưới đây.

Đặc quyền của lược đồ truy vấn

Trước khi thực hiện điều này cụ thể với mã ví dụ để cấp và thu hồi các đặc quyền lược đồ, chúng ta cần xem lại cách kiểm tra các đặc quyền lược đồ. Sử dụng giao diện dòng lệnh psql, chúng tôi liệt kê các lược đồ và các đặc quyền liên quan với lệnh \ dn +. Đối với cơ sở dữ liệu sa samplingb mới được tạo, chúng tôi thấy mục nhập này dành cho lược đồ công khai:

sampledb=# \dn+ 
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description      
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         |
(1 row)

Hai cột đầu tiên và cột thứ tư khá đơn giản:như đã đề cập trước đây hiển thị lược đồ được tạo mặc định có tên là “công khai”, được mô tả là “lược đồ công khai chuẩn” và được sở hữu bởi vai trò “postgres”. (Quyền sở hữu lược đồ, trừ khi được chỉ định khác, được đặt thành vai trò tạo ra lược đồ.) Cột thứ ba liệt kê các đặc quyền truy cập được quan tâm ở đây. Định dạng của thông tin đặc quyền cung cấp ba mục:người được cấp đặc quyền, đặc quyền và người cấp đặc quyền ở định dạng “người được cấp =đặc quyền / người cấp”, ở bên trái dấu bình đẳng là vai trò nhận (các) đặc quyền, ngay bên phải của dấu bình đẳng là một nhóm các chữ cái chỉ định (các) đặc quyền cụ thể và cuối cùng theo sau dấu gạch chéo vai trò được cấp cho (các) đặc quyền. Có thể có nhiều đặc điểm thông tin đặc quyền như vậy, được liệt kê phân tách bằng dấu cộng vì các đặc quyền là phụ gia.

Đối với lược đồ, có hai đặc quyền có thể được cấp riêng biệt:U cho “USAGE” và C cho “CREATE”. Đầu tiên là cần thiết cho một vai trò để có khả năng tra cứu các đối tượng cơ sở dữ liệu như bảng và dạng xem có trong lược đồ; đặc quyền thứ hai cho phép một vai trò để tạo các đối tượng cơ sở dữ liệu trong lược đồ. Có các chữ cái khác cho các đặc quyền khác liên quan đến các loại đối tượng cơ sở dữ liệu khác nhau, nhưng đối với các lược đồ, chỉ U và C. áp dụng.

Do đó, để giải thích danh sách đặc quyền ở trên, đặc tả đầu tiên cho chúng ta biết rằng người dùng postgres đã được cấp bản cập nhật và tự tạo đặc quyền trên lược đồ công khai.

Lưu ý rằng đối với thông số kỹ thuật thứ hai ở trên, một chuỗi trống xuất hiện ở bên trái của dấu bằng. Đây là cách các đặc quyền được cấp cho tất cả người dùng, bằng từ khóa CÔNG KHAI đã đề cập trước đó, được biểu thị.

Đặc điểm kỹ thuật thứ hai này về việc cấp quyền sử dụng và tạo đặc quyền trên lược đồ công khai cho tất cả người dùng được một số người xem là có thể trái với các nguyên tắc bảo mật chung, thực tiễn tốt nhất, trong đó người ta có thể thích bắt đầu với quyền truy cập bị hạn chế theo mặc định, yêu cầu quản trị viên cơ sở dữ liệu phải cấp rõ ràng phù hợp và các đặc quyền truy cập cần thiết tối thiểu. Các đặc quyền tự do này trên lược đồ công khai được định cấu hình có chủ đích trong hệ thống như một sự thuận tiện và để tương thích kế thừa.

Cũng lưu ý rằng ngoại trừ cài đặt đặc quyền cho phép, điều đặc biệt duy nhất khác về lược đồ công khai là nó cũng được liệt kê trong search_path, như chúng ta đã thảo luận trong bài viết trước. Điều này tương tự để thuận tiện:Cấu hình search_path và các đặc quyền tự do kết hợp với nhau dẫn đến một cơ sở dữ liệu mới có thể sử dụng được như thể không có khái niệm như lược đồ.

Bối cảnh lịch sử trên lược đồ công khai

Mối quan tâm về khả năng tương thích này bắt nguồn từ khoảng mười lăm năm trước (trước PostgreSQLversion 7.3, xem ghi chú phát hành phiên bản 7.3) khi tính năng lược đồ không phải là một phần của PostgreSQL. Cấu hình của lược đồ công khai với các đặc quyền tự do và sự hiện diện của đường dẫn tìm kiếm khi các lược đồ được giới thiệu trong phiên bản 7.3 đã cho phép khả năng tương thích của các ứng dụng cũ hơn, không nhận biết được lược đồ, hoạt động không bị sửa đổi với tính năng cơ sở dữ liệu được nâng cấp.

Mặt khác, không có gì đặc biệt khác về lược đồ công khai:một số DBA xóa nó nếu trường hợp sử dụng của họ không có yêu cầu đối với nó; những người khác khóa nó lại bằng cách thu hồi các đặc quyền mặc định.

Cho tôi xem mã - Thu hồi đặc quyền

Hãy làm một số mã để minh họa và mở rộng những gì chúng ta đã thảo luận cho đến nay.

Các đặc quyền của lược đồ được quản lý bằng các lệnh GRANT và REVOKE để thêm và rút các đặc quyền tương ứng. Chúng tôi sẽ thử một số ví dụ cụ thể để khóa giản đồ công khai, nhưng cú pháp chung là:

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

Vì vậy, như một ví dụ về khóa ban đầu, hãy xóa đặc quyền tạo khỏi lược đồ công khai. Lưu ý rằng trong các ví dụ này, từ viết thường "public" đề cập đến lược đồ và có thể được thay thế bằng bất kỳ tên lược đồ hợp lệ nào khác có thể tồn tại trong cơ sở dữ liệu. Chữ hoa “PUBLIC” là từ khóa đặc biệt ngụ ý “tất cả người dùng” và thay vào đó có thể được thay thế bằng tên vai trò cụ thể hoặc danh sách tên vai trò được phân tách bằng dấu phẩy để kiểm soát truy cập chi tiết hơn.

sampledb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =U/postgres          | 
(1 row)

Sự khác biệt duy nhất trong danh sách đặc quyền lược đồ này so với đặc quyền đầu tiên là không có chữ “C” trong đặc tả đặc quyền thứ hai, việc xác minh rằng lệnh của chúng tôi có hiệu lực hay không:người dùng không phải là người dùng postgres không còn có thể tạo bảng, chế độ xem hoặc các đối tượng khác trong lược đồ công khai.

Lưu ý rằng lệnh ở trên thu hồi các đặc quyền từ lược đồ công khai là biện pháp giảm nhẹ được khuyến nghị cho lỗ hổng được xuất bản gần đây, CVE-2018-1058, phát sinh từ cài đặt đặc quyền mặc định trên lược đồ công khai.

Một mức khóa thấp hơn nữa có thể dẫn đến việc từ chối hoàn toàn quyền truy cập tra cứu vào lược đồ bằng cách xóa đặc quyền sử dụng:

sampledb=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres | standard public schema
(1 row)

Vì tất cả các đặc quyền lược đồ có sẵn cho người dùng không phải là chủ sở hữu đã bị thu hồi, nên toàn bộ thông số đặc quyền thứ hai sẽ biến mất trong danh sách ở trên.

Những gì chúng tôi đã làm với hai lệnh riêng biệt có thể được thực hiện ngắn gọn với một lệnh duy nhất chỉ định tất cả các đặc quyền như:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
REVOKE

Ngoài ra, cũng có thể thu hồi các đặc quyền từ chủ sở hữu giản đồ:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;
REVOKE
sampledb=# \dn+
                        List of schemas
  Name  |  Owner   | Access privileges |      Description       
--------+----------+-------------------+------------------------
 public | postgres |                   | standard public schema
(1 row)

nhưng điều đó không thực sự đạt được bất kỳ điều gì thực tế, vì chủ sở hữu giản đồ giữ lại toàn bộ đặc quyền đối với các lược đồ được sở hữu bất kể việc chuyển nhượng rõ ràng chỉ đơn giản là do quyền sở hữu.

Việc gán đặc quyền tự do cho lược đồ công khai là một tạo tác đặc biệt liên quan đến việc tạo cơ sở dữ liệu ban đầu. Các lược đồ được tạo sau đó trong cơ sở dữ liệu hiện có tuân theo phương pháp tốt nhất là bắt đầu mà không có đặc quyền được chỉ định. Ví dụ:kiểm tra các đặc quyền của lược đồ sau khi tạo một lược đồ mới có tên là "riêng tư" cho thấy lược đồ mới không có đặc quyền:

sampledb=# create schema private;
CREATE SCHEMA
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres |                      | 
 public  | postgres |                      | standard public schema
(2 rows)
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Cho tôi xem mã - Cấp đặc quyền

Dạng chung của lệnh thêm đặc quyền là:

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:
  [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

Ví dụ, khi sử dụng lệnh này, chúng ta có thể cho phép tất cả các vai trò tìm kiếm các đối tượng cơ sở dữ liệu trong lược đồ riêng tư bằng cách thêm đặc quyền sử dụng với

sampledb=# GRANT USAGE ON SCHEMA private TO PUBLIC;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres          | 
 public  | postgres |                      | standard public schema
(2 rows)

Lưu ý cách các đặc quyền UC xuất hiện cho chủ sở hữu postgres dưới dạng đặc tả đầu tiên, bây giờ chúng tôi đã chỉ định các đặc quyền khác với mặc định cho lược đồ. Đặc tả thứ hai, =U / postgres, tương ứng với lệnh GRANT mà chúng tôi vừa gọi khi người dùng postgres cấp đặc quyền sử dụng cho tất cả người dùng (trong đó, gọi lại, chuỗi trống bên trái của dấu bằng ngụ ý “tất cả người dùng”).

Ví dụ:một vai trò cụ thể, có tên là “user1”, có thể được cấp cả đặc quyền tạo và sử dụng cho lược đồ riêng tư với:

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres         +| 
         |          | user1=UC/postgres    | 
 public  | postgres |                      | standard public schema
(2 rows)

Chúng tôi vẫn chưa đề cập đến mệnh đề "VỚI LỰA CHỌN CẤP" của biểu mẫu lệnh chung. Đúng như âm thanh của nó, điều khoản này cho phép một vai trò được cấp quyền tự nó cấp đặc quyền đã chỉ định cho những người dùng khác và nó được biểu thị trong danh sách đặc quyền bằng dấu hoa thị được gắn vào đặc quyền cụ thể:

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1 WITH GRANT OPTION;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres         +| 
         |          | user1=U*C*/postgres  | 
 public  | postgres |                      | standard public schema
(2 rows)

Kết luận

Điều này kết thúc chủ đề cho ngày hôm nay. Tuy nhiên, lưu ý cuối cùng, hãy nhớ rằng chúng ta chỉ thảo luận về các đặc quyền truy cập lược đồ. Trong khi đặc quyền USAGE cho phép tra cứu các đối tượng cơ sở dữ liệu trong một lược đồ, để thực sự truy cập các đối tượng cho các hoạt động cụ thể, chẳng hạn như đọc, ghi, thực thi, v.v., vai trò cũng phải có các đặc quyền thích hợp cho các hoạt động đó trên các đối tượng cơ sở dữ liệu cụ thể đó.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách duy trì dữ liệu trong cơ sở dữ liệu postgres dày đặc bằng cách sử dụng khối lượng

  2. Tại sao postgres không tạo cơ sở dữ liệu?

  3. Chức năng cửa sổ và tổng hợp cục bộ hơn

  4. Chạy tệp hàng loạt bằng lệnh psql mà không cần mật khẩu

  5. Oracle sang PostgreSQL - Con trỏ và ltrees