Nghiên cứu triển khai Bảo mật cấp hàng trong PostgreSQL

Là một sự bổ sung cho Nghiên cứu triển khai logic nghiệp vụ ở cấp độ hàm lưu trữ PostgreSQL и chủ yếu để có câu trả lời chi tiết trên chú thích.

Phần lý thuyết được mô tả rõ ràng trong tài liệu PostgreSQL - Chính sách bảo vệ hàng. Dưới đây là một triển khai thực tế của một nhỏ nhiệm vụ kinh doanh cụ thể - ẩn dữ liệu đã xóa. Phác thảo dành riêng cho việc thực hiện Mô hình hóa vai trò bằng RLS trình bày riêng biệt.

Nghiên cứu triển khai Bảo mật cấp hàng trong PostgreSQL

Bài viết không có gì mới, không có ẩn ý hay kiến ​​thức bí mật. Chỉ là một bản phác thảo về việc thực hiện thực tế một ý tưởng lý thuyết. Nếu ai quan tâm thì đọc nhé. Nếu bạn không quan tâm, đừng lãng phí thời gian của bạn.

Báo cáo sự cố

Không đi sâu vào lĩnh vực chủ đề, một cách ngắn gọn, vấn đề có thể được hình thành như sau: Có một bảng thực hiện một thực thể kinh doanh nhất định. Các hàng trong bảng có thể bị xóa nhưng các hàng không thể bị xóa về mặt vật lý; chúng phải được ẩn đi.

Vì người ta nói: “Đừng xóa bất cứ thứ gì, chỉ cần đổi tên nó. Internet lưu trữ MỌI THỨ"

Trong quá trình thực hiện, bạn không nên viết lại các hàm được lưu trữ hiện có hoạt động với thực thể này.

Để thực hiện khái niệm này, bảng có thuộc tính bị xóa. Sau đó, mọi thứ đều đơn giản - bạn cần đảm bảo rằng khách hàng chỉ có thể nhìn thấy các dòng trong đó thuộc tính bị xóa SAI Cơ chế được sử dụng để làm gì? Bảo mật cấp hàng.

Thực hiện

Tạo một vai trò và lược đồ riêng biệt

CREATE ROLE repos;
CREATE SCHEMA repos;

Tạo bảng mục tiêu

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

Chúng tôi gồm có Bảo mật cấp hàng

ALTER TABLE repos.file  ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted  ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;

Chức năng dịch vụ - xóa một hàng trong bảng

CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE 
WHERE id = curr_id ; 
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Chức năng kinh doanh — xóa một tài liệu

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Những phát hiện

Khách hàng xóa tài liệu

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

Sau khi xóa, khách hàng không thấy tài liệu

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

Nhưng trong cơ sở dữ liệu tài liệu không bị xóa, chỉ thay đổi thuộc tính is_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

Đó là những gì được yêu cầu trong báo cáo vấn đề.

Tổng

Nếu chủ đề thú vị, trong nghiên cứu tiếp theo, bạn có thể đưa ra ví dụ về cách triển khai mô hình dựa trên vai trò để phân tách quyền truy cập dữ liệu bằng cách sử dụng Bảo mật cấp hàng.

Nguồn: www.habr.com

Thêm một lời nhận xét