Tutkimus rivitason suojauksen toteuttamisesta PostgreSQL:ssä

Täydennyksenä Tutkimus liiketoimintalogiikan toteuttamisesta PostgreSQL-tallennettujen funktioiden tasolla и lähinnä yksityiskohtaista vastausta varten päälle kommentti.

Teoreettinen osa on kuvattu hyvin dokumentaatiossa PostgreSQL - Rivien suojauskäytännöt. Alla on käytännön toteutus pieni erityinen liiketoimintatehtävä - poistettujen tietojen piilottaminen. Toteutukseen omistettu luonnos Roolimallinnus RLS:n avulla esitetään erikseen.

Tutkimus rivitason suojauksen toteuttamisesta PostgreSQL:ssä

Artikkelissa ei ole mitään uutta, ei ole piilotettua merkitystä tai salaista tietoa. Vain luonnos teoreettisen idean käytännön toteutuksesta. Jos jotakuta kiinnostaa niin lukekaa. Jos et ole kiinnostunut, älä tuhlaa aikaasi.

Ongelma

Sukeltamatta syvällisesti aihealueeseen, lyhyesti, ongelma voidaan muotoilla seuraavasti: On taulukko, joka toteuttaa tietyn liiketoimintakokonaisuuden. Taulukon rivejä voi poistaa, mutta rivejä ei voi fyysisesti poistaa, vaan ne on piilotettava.

Sillä sanotaan: "Älä poista mitään, vain nimeä se uudelleen. Internet tallentaa KAIKEN"

Matkan varrella on suositeltavaa olla kirjoittamatta uudelleen olemassa olevia tallennettuja toimintoja, jotka toimivat tämän entiteetin kanssa.

Tämän konseptin toteuttamiseksi taulukossa on määrite is_deleted. Sitten kaikki on yksinkertaista - sinun on varmistettava, että asiakas näkee vain ne rivit, joissa määrite is_deleted väärä Mihin mekanismia käytetään? Rivitason suojaus.

Реализация

Luo erillinen rooli ja malli

CREATE ROLE repos;
CREATE SCHEMA repos;

Luo kohdetaulukko

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

Sisällytämme Rivitason turvallisuus

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 ;

Palvelutoiminto — rivin poistaminen taulukosta

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;

Liiketoimintaa - asiakirjan poistaminen

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

Tulokset

Asiakas poistaa asiakirjan

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

Poiston jälkeen asiakas ei näe asiakirjaa

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

Mutta tietokannassa asiakirjaa ei poisteta, vain määrite muuttuu is_del

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

Mikä on se, mitä vaadittiin ongelmailmoituksessa.

Koko

Jos aihe on mielenkiintoinen, voit seuraavassa tutkimuksessa näyttää esimerkin roolipohjaisen mallin toteuttamisesta tietojen käytön erottamiseen rivitason suojauksella.

Lähde: will.com

Lisää kommentti