Uuring Row Level Security juurutamise kohta PostgreSQL-is

Täiendusena Uuring äriloogika rakendamisest PostgreSQL-i salvestatud funktsioonide tasemel и peamiselt üksikasjaliku vastuse saamiseks edasi kommentaar.

Teoreetiline osa on dokumentatsioonis hästi kirjeldatud PostgreSQL - Reakaitsepoliitikad. Allpool on väikese praktiline rakendamine konkreetne äriülesanne – kustutatud andmete peitmine. Rakendamisele pühendatud eskiis Eeskujundamine RLS-i abil esitatakse eraldi.

Uuring Row Level Security juurutamise kohta PostgreSQL-is

Artiklis pole midagi uut, pole varjatud tähendust ega salateadmisi. Lihtsalt visand teoreetilise idee praktilisest elluviimisest. Kui kedagi huvitab, lugegu. Kui te pole huvitatud, ärge raisake oma aega.

Probleemi avaldus

Süvenemata teemavaldkonda, võib probleemi lühidalt sõnastada järgmiselt: Seal on tabel, mis rakendab teatud äriüksuse. Tabeli ridu saab kustutada, kuid ridu ei saa füüsiliselt kustutada, need peavad olema peidetud.

Sest öeldakse: "Ära kustuta midagi, lihtsalt nimeta see ümber. Internet salvestab KÕIK

Samal ajal ei ole soovitatav olemasolevaid salvestatud funktsioone, mis selle olemiga töötavad, ümber kirjutada.

Selle kontseptsiooni rakendamiseks on tabelis atribuut on_kustutatud. Siis on kõik lihtne - peate veenduma, et klient näeks ainult neid ridu, milles atribuut on on_kustutatud vale Milleks mehhanismi kasutatakse? Reataseme turvalisus.

Реализация

Looge eraldi roll ja skeem

CREATE ROLE repos;
CREATE SCHEMA repos;

Looge sihttabel

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

Me kaasame Rea taseme turvalisus

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 ;

Teenindusfunktsioon — tabelist rea kustutamine

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;

Ärifunktsioon — dokumendi kustutamine

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

Järeldused

Klient kustutab dokumendi

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

Pärast kustutamist klient dokumenti ei näe

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

Kuid andmebaasis dokumenti ei kustutata, vaid muudetakse ainult atribuuti is_del

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

See oli see, mida probleemi avalduses nõuti.

Summaarne

Kui teema on huvitav, saate järgmises uuringus näidata näidet rollipõhise mudeli rakendamisest andmetele juurdepääsu eraldamiseks, kasutades reataseme turvalisust.

Allikas: www.habr.com

Lisa kommentaar