Làm cách nào để quản lý QUYỀN RIÊNG TƯ CHO NGƯỜI DÙNG trên cơ sở dữ liệu so với SCHema?


48

Tôi muốn di chuyển một ứng dụng điều khiển cơ sở dữ liệu khá đơn giản, nội bộ, từ SQLite3 sang PostgreQuery 9.3 và thắt chặt các quyền trong DB khi tôi đi.

Ứng dụng hiện bao gồm một lệnh để cập nhật dữ liệu; và một để truy vấn nó. Đương nhiên, tôi cũng cần duy trì cơ sở dữ liệu theo những cách khác (tạo bảng mới, dạng xem, trình kích hoạt, v.v.).

Mặc dù ứng dụng này sẽ là ứng dụng duy nhất được lưu trữ trên máy chủ lúc đầu, tôi muốn sử dụng giả định rằng nó có thể được lưu trữ trên máy chủ với các cơ sở dữ liệu khác trong tương lai, thay vì phải tranh giành sau này nếu điều đó trở nên cần thiết trong tương lai.

Tôi nghĩ rằng đây sẽ là một tập hợp các yêu cầu khá phổ biến, nhưng tôi gặp khó khăn khi tìm một hướng dẫn đơn giản giải thích cách thiết lập cơ sở dữ liệu mới trong PostgreQuery, với loại phân tách người dùng / đặc quyền này. Các tài liệu tham khảo tiếp tục về các nhóm, người dùng, vai trò, cơ sở dữ liệu, lược đồ và tên miền; nhưng tôi thấy chúng khó hiểu

Đây là những gì tôi đã thử cho đến nay (từ bên trong psqllà 'postgres'):

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr   WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';

GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;

Nhưng tôi không nhận được ngữ nghĩa dự định. Tôi muốn cấu hình nó để chỉ các bảng hostdb_admincó thể tạo (và thả và thay đổi); các hostdb_mgrthể đọc, chèn, cập nhật và xóa trên tất cả các bảng theo mặc định; và hostdb_usrchỉ có thể đọc tất cả các bảng (và khung nhìn).

Khi tôi thử điều này, tôi thấy rằng tôi có thể tạo các bảng trong hostdbbất kỳ người dùng nào trong số này; nhưng, đối với mỗi người dùng, tôi chỉ có thể đọc hoặc sửa đổi các bảng được tạo bởi người dùng đó - trừ khi tôi sử dụng một bảng tường minh GRANT.

Tôi đoán rằng có một cái gì đó bị thiếu giữa CREATE DATABASECREATE SCHEMA, một cái gì đó để áp dụng SCHEMAcho DATABASE?

(Khi mọi thứ trở nên nâng cao hơn, tôi cũng sẽ có câu hỏi để áp dụng các hạn chế tương tự đối với TRIGGERS, các thủ tục được lưu trữ VIEWSvà có lẽ các đối tượng khác).

Tôi có thể tìm thấy một hướng dẫn phong phú, hướng dẫn hoặc loạt video về điều này?


2
Tôi nghĩ (ít nhất là một phần) vấn đề của bạn nằm ở publicgiả hành. Có thể coi đó là một vai trò mà mọi vai trò khác (người dùng, nhóm - tất cả đều giống nhau) là thành viên của. Cố gắng loại bỏ các đặc quyền từ nó bằng, ví dụ , REVOKE CREATE ON SCHEMA hostdb FROM public. Thu hồi quyền ở cấp cơ sở dữ liệu, như bạn đã làm, chỉ vô hiệu hóa một số quyền cấp cơ sở dữ liệu, không ảnh hưởng đến lược đồ hoặc bảng.
dezso

@dezso: Có thể có một quan niệm sai lầm về các đặc quyền mặc định cho các lược đồ. Chỉ có lược đồ mặc định publicxảy ra đồng đi kèm với đặc quyền cho PUBLIC. Ngoài ra, không có đặc quyền mặc định cho các lược đồ mới. Vì vậy, điều này không ảnh hưởng đến trường hợp sử dụng được chứng minh. Xem chương trong câu trả lời của tôi.
Erwin Brandstetter

Câu trả lời:


86

Tôi có thể tìm thấy một hướng dẫn phong phú, hướng dẫn hoặc loạt video về điều này?

Bạn sẽ tìm thấy mọi thứ trong hướng dẫn. Liên kết dưới đây.
Cấp, vấn đề không tầm thường và đôi khi khó hiểu. Đây là một công thức cho trường hợp sử dụng:

Công thức

Tôi muốn cấu hình nó để chỉ các bảng hostdb_admincó thể tạo (và thả và thay đổi);
các hostdb_mgrthể đọc, chèn, cập nhật và xóa trên tất cả các bảng theo mặc định;
hostdb_usrchỉ có thể đọc tất cả các bảng (và khung nhìn).

Là siêu người dùng postgres:

CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr   WITH PASSWORD 'youwish2';
CREATE USER schma_usr   WITH PASSWORD 'youwish3';

Nếu bạn muốn có một quản trị mạnh mẽ hơn mà còn có thể quản lý cơ sở dữ liệu và vai trò, thêm thuộc tính vai trò CREATEDBCREATEROLE ở trên.

Cấp mỗi vai trò cho cấp cao hơn tiếp theo, vì vậy tất cả các cấp "kế thừa" ít nhất là tập hợp các đặc quyền từ cấp thấp hơn tiếp theo (xếp tầng):

GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;  -- see notes below!

GRANT CONNECT ON DATABASE hostdb TO schma_usr;  -- others inherit

\connect hostdb  -- psql syntax

Tôi đang đặt tên cho lược đồ schma(không hostdbgây nhầm lẫn). Chọn bất kỳ tên nào. Tùy chọn làm schma_adminchủ sở hữu của lược đồ:

CREATE SCHEMA schma AUTHORIZATION schma_admin;

SET search_path = schma;  -- see notes

ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr   IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr   IN DATABASE hostdb SET search_path = schma;

GRANT USAGE  ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT                           ON TABLES TO schma_usr;  -- only read

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr;  -- + write, TRUNCATE optional

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr;  -- SELECT, UPDATE are optional 

Để and drop and alterxem ghi chú dưới đây.

Khi mọi thứ trở nên tiên tiến hơn, tôi cũng sẽ có câu hỏi để áp dụng các hạn chế tương tự đối với TRIGGERS, các thủ tục được lưu trữ VIEWSvà có lẽ các đối tượng khác.

Lượt xem là đặc biệt. Cho một:

... (nhưng lưu ý rằng ALL TABLESđược coi là bao gồm các khung nhìn và các bảng nước ngoài).

Và để xem cập nhật :

Lưu ý rằng người dùng thực hiện thao tác chèn, cập nhật hoặc xóa trên chế độ xem phải có đặc quyền chèn, cập nhật hoặc xóa tương ứng trên chế độ xem. Ngoài ra, chủ sở hữu của chế độ xem phải có các đặc quyền có liên quan trên các quan hệ cơ sở cơ bản, nhưng người dùng thực hiện cập nhật không cần bất kỳ quyền nào đối với các quan hệ cơ sở cơ bản (xem Mục 38.5 ).

Triggers là đặc biệt, quá. Bạn cần TRIGGERđặc quyền trên bàn và:

Nhưng chúng tôi đã mở rộng quá mức phạm vi của câu hỏi này ...

Ghi chú quan trọng

Quyền sở hữu

Nếu bạn muốn cho phép schma_admin(một mình) thả và thay đổi bảng, hãy tạo vai trò sở hữu tất cả các đối tượng. Tài liệu:

Quyền bỏ một đối tượng, hoặc thay đổi định nghĩa của nó theo bất kỳ cách nào, không được coi là một đặc quyền có thể cấp; nó là vốn có của chủ sở hữu, và không thể được cấp hoặc thu hồi. (Tuy nhiên, hiệu ứng tương tự có thể đạt được bằng cách cấp hoặc thu hồi tư cách thành viên trong vai trò sở hữu đối tượng; xem bên dưới.) Chủ sở hữu cũng có tất cả các tùy chọn cấp cho đối tượng.

ALTER TABLE some_tbl OWNER TO schma_admin;

Hoặc tạo tất cả các đối tượng có vai tròschma_adminbắt đầu, sau đó bạn không cần thiết lập chủ sở hữu một cách rõ ràng. Nó cũng đơn giản hóa các đặc quyền mặc định, mà sau đó bạn chỉ phải đặt cho một vai trò:

Các đối tượng tồn tại từ trước

Các đặc quyền mặc định chỉ áp dụng cho các đối tượng mới được tạo và chỉ cho vai trò cụ thể mà chúng được tạo. Bạn cũng sẽ muốn điều chỉnh quyền cho các đối tượng hiện có :

Điều tương tự cũng áp dụng nếu bạn tạo các đối tượng có vai trò chưa được DEFAULT PRIVILEGESđặt, như siêu người dùng postgres. Quyền sở hữu phân công lại đến schma_adminvà đặc quyền thiết lập bằng tay - hoặc bộ DEFAULT PRIVILEGEScho postgreslà tốt (trong khi kết nối với DB đúng!):

ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ...  -- etc.

Đặc quyền mặc định

Bạn đã thiếu một khía cạnh quan trọng của ALTER DEFAULT PRIVILEGESlệnh. Nó áp dụng cho vai trò hiện tại trừ khi có quy định khác:

Đặc quyền mặc định chỉ áp dụng cho cơ sở dữ liệu hiện tại. Vì vậy, bạn không gây rối với các cơ sở dữ liệu khác trong cụm DB. Tài liệu:

cho tất cả các đối tượng được tạo trong cơ sở dữ liệu hiện tại

Bạn cũng có thể muốn đặt các đặc quyền mặc định cho FUNCTIONSTYPES(không chỉ TABLESSEQUENCES), nhưng những đặc quyền đó có thể không cần thiết.

Đặc quyền mặc định cho PUBLIC

Các đặc quyền mặc định được cấp PUBLIClà thô sơ và được đánh giá quá cao bởi một số người. Tài liệu:

PostgreSQL cấp các đặc quyền mặc định cho một số loại đối tượng PUBLIC. Không có đặc quyền nào được cấp PUBLICtheo mặc định trên các bảng, cột, lược đồ hoặc không gian bảng. Đối với các loại khác, các đặc quyền mặc định được cấp PUBLICnhư sau: CONNECTCREATE TEMP TABLEcho cơ sở dữ liệu; EXECUTEđặc quyền cho các chức năng; và USAGE đặc quyền cho các ngôn ngữ.

Nhấn mạnh đậm của tôi. thông thường, một lệnh ở trên là đủ để bao gồm mọi thứ:

REVOKE ALL ON DATABASE hostdb FROM public;

Đặc biệt, không có đặc quyền mặc định nào được cấp PUBLICcho các lược đồ mới. Có thể nhầm lẫn rằng lược đồ mặc định có tên "công khai" bắt đầu bằng các ALLđặc quyền cho PUBLIC. Đó chỉ là một tính năng tiện lợi để dễ dàng bắt đầu với cơ sở dữ liệu mới được tạo. Nó không ảnh hưởng đến các lược đồ khác theo bất kỳ cách nào. Bạn có thể thu hồi các đặc quyền này trong cơ sở dữ liệu mẫu template1, sau đó tất cả các cơ sở dữ liệu mới được tạo trong cụm này bắt đầu mà không có chúng:

\connect template1
REVOKE ALL ON SCHEMA public FROM public;

Đặc quyền TEMP

Vì chúng tôi đã thu hồi tất cả các đặc quyền hostdbtừ PUBLIC, người dùng thông thường không thể tạo các bảng tạm thời trừ khi chúng tôi cho phép rõ ràng. Bạn có thể hoặc không muốn thêm điều này:

GRANT TEMP ON DATABASE hostdb TO schma_mgr;

search_path

Đừng quên thiết lập search_path. Nếu bạn chỉ có một cơ sở dữ liệu trong cụm, bạn có thể đặt mặc định toàn cục vào postgresql.conf. Khác (nhiều khả năng) đặt nó làm tài sản của cơ sở dữ liệu, hoặc chỉ cho các vai trò liên quan hoặc thậm chí là sự kết hợp của cả hai. Chi tiết:

Bạn có thể muốn đặt nó thành schma, publicnếu bạn cũng sử dụng lược đồ công khai hoặc thậm chí (ít khả năng hơn) $user, schma, public...

Một cách khác là sử dụng lược đồ mặc định "công khai" sẽ hoạt động với các cài đặt mặc định search_pathtrừ khi bạn thay đổi. Hãy nhớ thu hồi các đặc quyền PUBLICtrong trường hợp này.

Liên quan


Tôi đã tìm kiếm cách thêm các quyền riêng tư quản trị mặc định vào siêu người dùng mới được tạo, vì vậy tôi không cần phải cung cấp cho anh ta quyền bổ trợ ngay trên mỗi bảng. Tôi tìm thấy cái này Và thistrông giống như hướng dẫn cho tàu vũ trụ ...
Denis Matafonov

@DenisMatafonov: Superusers có tất cả các đặc quyền tự động. Tôi đề nghị bạn bắt đầu một câu hỏi mới với chi tiết cụ thể về trường hợp của bạn. Bình luận không phải là nơi. Bạn luôn có thể liên kết đến các câu hỏi / câu trả lời liên quan cho ngữ cảnh.
Erwin Brandstetter

Có, siêu nhân có tất cả quyền truy cập, nhưng bạn không thể khái quát các đặc quyền mặc định của họ. Sẽ rất tốt khi đặt các đặc quyền mặc định cho một vai trò trong lược đồ và áp dụng các giá trị mặc định đó cho tất cả các thành viên của vai trò khi chúng tạo các bảng trong lược đồ. Ví dụ: để nói "đảm bảo bất kỳ bảng nào được tạo trong lược đồ này bởi bất kỳ ai trong nhóm kỹ thuật sẽ có thể đọc được bởi bất kỳ ai trong nhóm báo cáo." Nói tóm lại, tôi muốn các thành viên của vai trò tạo bảng kế thừa các đặc quyền mặc định của nó.
tổ hợp
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.