Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Dec 162011
 

Virtual Private Database čili Fine Grained Access Control (FGAC) je funkcionalita, která umožňuje na úrovni databáze definovat filtry pro operace SELECT, INSERT, UPDATE a DELETE. Typickým příkladem, který uvádí Oracle je lékařské aplikace, kdy je možné vrátit lékaři na základě jeho ID pouze záznamy jeho pacientů v případě, že zavolá select * from vsechni_pacienti; Podobně to funguje také s UPDATE a DELETE. Výhodou použití VPD je pochopitelně bezpečnost, která je mnohem lepší než omezení na straně klienta. Další výhodou je jednodušší správa aplikace a možnost lepšího zabezpečení již existujících aplikací. Výhod spousta, nevýhod méně – tedy reálně použitelné.

Pro použití VPD je klíčový balík dbms_rls (ROW LEVEL SECURITY), který možňuje zaregistrování funkcí (nebo i skupin funkcí od 11g2) na tabulky na které je potřeba použití funkcionalitu Fine Grained Access Control. Pomocí balíku dbms_rls se registruje vlastní funkce, která má dva vstupní parametry typu varchar2 (owner a jméno objektu) a jako výstup vrací where podmínku, která omezuje danému uživateli sadu záznamů.

Jak to interně funguje?  Po zavolání select (update, delete) Oracle zavolá VPD funkci a spouštěný select “obalí” do závorek a doplní tam další WHERE a text obdržený právě z VPD funkce.

Virtual Private Database (respektive aplikace RLS politiky) mimochodem nefunguje na SYS uživatele, na což je dobré poukázat pro nás, co na své zkušební databázi jedeme pod SYSem (ano nemá se to, ale když si člověk zkouší updaty systémových tabulek, co mu zbývá). Tedy je nutné se připojit jako nějaký člověk (SYS je bůh).

CREATE USER AZOR IDENTIFED BY AZOR DEFAULT TABLESPACE HAF;
ALTER USER AZOR QUOTA UNLIMITED ON HAF;
GRANT RESOURCE TO AZOR;
GRANT CREATE SESSION TO AZOR;

To by byla nějaká ta teorie a nyní nějaká ukázka:

1) Nejprve založím nějakou tabulku

CREATE TABLE TBL_TEST_VPD AS SELECT ROWNUM colum,username FROM
all_users,
(SELECT 1 FROM dual CONNECT BY LEVEL<100);

Bez VPD obsahuje tabulka 4200 řádků – 42 uživatelů cross join 100 záznamů.

2) Založím funkci přesně dle potřebné specifikace (je to podobné jako s funkcí pro validaci správně silného hesla, pokud je jejiná bezpečnostní politika než kterou má Oracle)

CREATE OR REPLACE FUNCTION fce_vpd_policy (owner IN VARCHAR2, object_name IN VARCHAR2) RETURN
VARCHAR2
IS
BEGIN
RETURN 'username='''|| USER ||'''';
-- zde by to melo byt s CONTEXTU, ale letnost je lenost ;)
END;

Mimochodem je to ta nejminimálnější funkce, jaká má smysl a se kterou to bude fungovat.

3) A přidání policy funkce :

BEGIN
dbms_rls.add_policy(
'AZOR',  -- vlastník tabulky
'TBL_TEST_VPD',-- jméno tabulky
'MOJE_POLICY', -- jméno policy
'AZOR', -- vlastník VPD funkce
'FCE_VPD_POLICY', -- jméno vpd funkce
'SELECT' -- pouze pro select
);
END;

Spuštěno pod SYS uživatelem, dbms_rls jsem novemu uživateli nenagrantoval.

4) A nyní test:

Pod uživatelem AZOR:

SELECT COUNT(*) FROM TBL_TEST_VPD; -- pouze záznamy s username=AZOR, jinak je tam 4200 záznamů
100

Reálně je však spouštěno SELECT COUNT(*) FROM TBL_TEST_VPD WHERE username='AZOR'S tím, že modrou část doplní Oracle z VPD funkce.

Bylo to jen pro select, tedy si muzu vsechny zaznamy prohlednout updatem a zase je rollbacknout (proto by to nemelo byt pouze na select)

UPDATE TBL_TEST_VPD SET username='AZOR'; rollback;
4200 rows updated. rollback completed.

A nyní ještě test pro SYS, pro něj to nefunguje:

SELECT COUNT(*) FROM AZOR.TBL_TEST_VPD;
4200

Pozor: Tabulka s aplikovanou VPD nejde do koše v případě dropu.

 Posted by at 23:36

  One Response to “PL/SQL – Návod – VPD (Virtual Private Database)”

  1. [...] – virtual private database, nějaký krátký článek na blogu tu mám zde. Mimochodem VPD je součástí OCP [...]

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>