Etüd a Row Level Security megvalósításáról a PostgreSQL-ben

Kiegészítésként Üzleti logika megvalósítása PostgreSQL tárolt függvények szintjén és főként a részletes válaszhoz Gyorsan emlékezzünk vissza, hogyan működik a moduláris aritmetika. Az óra már egy ismert koncepció. Az órák használata megjegyzés.

A teoretikus rész kiválóan van leírva a dokumentációban Postgres Pro — Sorvédelmi irányelvek. Az alábbiakban egy kis gyakorlati megvalósítást tárgyalunk konkrét üzleti feladat — a törölt adatok elrejtése. Az etüd a megvalósításra vonatkozik Szerepkörmodell RLS használatával külön bevezetésre kerül.

Etüd a Row Level Security megvalósításáról a PostgreSQL-ben

A cikkben nincs semmi új, nincs rejtett jelentés és titkos tudás. Csak egy vázlat a teoretikus ötlet gyakorlati megvalósításáról. Ha érdekes — olvasd el. Ha nem érdekes — ne pazarold az idődet.

Lépjünk át a kitűzött feladatra: írjunk egy XDP mechanizmust SYN cookie-kkal.

Anélkül, hogy mélyen belemerülnénk a témába, az alábbi módon körvonalazható a feladat: van egy táblázat, amely egy üzleti entitást valósít meg. A táblázat sorai törölhetőek, de fizikailag nem szabad őket törölni, el kell rejteni őket.

Mert mondták — „Semmit ne törölj, csak nevezd át. Az internet mindent megőriz.”

Mellékesen, lehetőleg ne írjuk át a már meglévő tárolt funkciókat, amelyek ezzel az entitással működnek.

A koncepció megvalósításához a táblázatnak van egy attribútuma is_deleted. Ezután minden egyszerű — úgy kell megvalósítani, hogy az ügyfél csak azokat a sorokat láthassa, amelyek esetében az attribútum is_deleted hamis. Ehhez használjuk a mechanizmust Row Level Security.

Megvalósítás

Létrehozunk egy külön szerepkört és sémát

CREATE ROLE repos;
CREATE SCHEMA repos;

Létrehozzuk a cél táblázatot

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

Engedélyezzük Row Level Security

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;

Szolgáltató funkció — egy sor törlése a táblázatban

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;

Üzleti funkció — dokumentum törlése

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

Eredmények

Az ügyfél törli a dokumentumot

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

A törlés után az ügyfél nem látja a dokumentumot

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

De az adatbázisban a dokumentum nem törlődik, csak az attribútum változik is_del

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

Amit a feladat kiírása megkövetelt.

Result

Ha a téma érdekes, a következő tanulmányban bemutathatjuk a szerepmodelek megvalósítását az adatokhoz való hozzáférés elosztására a Row Level Security, azaz a sor szintű biztonság alkalmazásával.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster