Studie o implementaci zabezpečení na úrovni řádků v PostgreSQL

Jako doplněk k Studie o implementaci business logiky na úrovni PostgreSQL uložených funkcí и hlavně za podrobnou odpověď na komentář.

Teoretická část je dobře popsána v dokumentaci PostgreSQL - Zásady ochrany řádků. Níže je praktická implementace malého konkrétní obchodní úkol – skrytí smazaných dat. Náčrt věnovaný implementaci Modelování rolí pomocí RLS prezentovány samostatně.

Studie o implementaci zabezpečení na úrovni řádků v PostgreSQL

V článku není nic nového, není tam žádný skrytý význam ani tajná znalost. Jen náčrt o praktické realizaci teoretické myšlenky. Pokud to někoho zajímá, přečtěte si to. Pokud nemáte zájem, neztrácejte čas.

Formulace problému

Aniž bychom se hluboce ponořili do předmětné oblasti, stručně lze problém formulovat takto: Existuje tabulka, která implementuje určitý podnikatelský subjekt. Řádky v tabulce lze smazat, ale řádky nelze smazat fyzicky, musí být skryté.

Neboť se říká: „Nic nemažte, jen to přejmenujte. Internet ukládá VŠECHNO"

Po cestě je vhodné nepřepisovat stávající uložené funkce, které s touto entitou pracují.

Pro implementaci tohoto konceptu má tabulka atribut is_deleted. Pak je vše jednoduché - musíte se ujistit, že klient vidí pouze řádky, ve kterých je atribut is_deleted Nepravdivé K čemu slouží mechanismus? Zabezpečení na úrovni řádku.

uskutečnění

Vytvořte samostatnou roli a schéma

CREATE ROLE repos;
CREATE SCHEMA repos;

Vytvořte cílovou tabulku

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

Zapněte Zabezpečení na úrovni řádků

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 ;

Servisní funkce — smazání řádku v tabulce

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;

Obchodní funkce — smazání dokumentu

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

výsledky

Klient odstraní dokument

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

Po smazání klient dokument nevidí

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

Ale v databázi se dokument nesmaže, pouze se změní atribut is_del

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

Což bylo požadováno v prohlášení o problému.

Celkový

Pokud je téma zajímavé, v další studii můžete ukázat příklad implementace modelu založeného na rolích pro oddělení přístupu k datům pomocí zabezpečení na úrovni řádků.

Zdroj: www.habr.com

Přidat komentář