PostgreSQLでの行レベルのセキュリティ実装調査

補足としてPostgreSQLのストアド関数のレベルでのビジネスロジックの実装上のエチュード主に詳細な回答のためコメント



この理論は、PostgreSQLのドキュメント-行セキュリティポリシーで詳しく説明されています以下は、削除されたデータを非表示にする、小さな特定のビジネスタスクの実際的な実装ですRLSを使用しロールモデルの実装に関する研究は、個別に提示されます。



この記事は新しいものではなく、隠された意味や秘密の知識はありません。理論的アイデアの実際の実装についての単なるスケッチ。興味のある方は、読み進めてください。興味のない人-あなたの時間を無駄にしないでください。


問題の定式化



主題分野に深く踏み込むことなく、簡単に言えば、タスクは次のように定式化できます。特定の事業体を実装するテーブルがあります。テーブル内の行は削除できますが、行を物理的に削除することはできません。行を非表示にする必要があります。



「何も削除せず、名前を変更するだけです。インターネットはすべてを保存します "



途中で、このエンティティで動作する既存の保存された関数を書き直さないことをお勧めします。



この概念を実装するために、テーブルにはis_deleted属性があります次に、すべてが単純です。クライアントがis_deleted属性falseである行のみを表示できるようにする必要があります。行レベルのセキュリティメカニズムが使用されているもの



実装



別の役割とスキーマを作成する



CREATE ROLE repos;
CREATE SCHEMA repos;


ターゲットテーブルを作成します



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


行レベルのセキュリティを オンにする



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 ;


サービス機能-テーブルの行を削除する



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;


ビジネス機能-ドキュメントの削除



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


結果



クライアントがドキュメントを削除する



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


削除後、クライアントにはドキュメントが表示されません



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


ただし、ドキュメントはデータベースから削除されておらず、is_del属性のみが変更ています。



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


これは、問題の定式化に必要なものです。



結果



トピックが興味深い場合は、次のエチュードで、行レベルのセキュリティを使用してデータアクセスを共有するための役割ベースのモデルを実装する例を示すことができます。



All Articles