Virtual Private Database (VPD) Jaroslav Kotrč
Co je VPD Bezpečnostní politika pro přístup k databázi na úrovni řádků a sloupců. Bezpečnost přímo nad tabulkami. Není způsob, jak to obejít. SQL dotaz upraven přidáním podmínky WHERE Podmínka dynamicky generovaná funkcí implementující bezpečnostní politiku. Transparentní pro uživatele
Výhody použití VPD Bezpečnostní politika založená na databázových objektech. Místo aby si ji každá aplikace musela implementovat sama. Vyšší bezpečnost Uživatel nemůže obejít aplikaci. Jednoduchost Flexibilita Možnost mít jiná omezení pro SELECT, UPDATE, INSERT, Kontrola nad vyhodnocováním bezpečnostních funkcí. Static policies Context-sensitive policies Dynamic policies
VPD a kontext aplikace Kontext aplikace uchovává informace o uživateli. Rychlejší než provádění dotazů. Vhodné zejména pro bezpečnostní politiku založenou na více atributech.
Komponenty VPD Funkce generující WHERE klauzuli Argumenty jsou jméno schématu a jméno objektu Návratová hodnota - WHERE klauzule typu VARCHAR2 Musí generovat korektní WHERE klauzuli Lze vložit C nebo Java volání k přístupu k informacím OS nebo vracet klauzuli ze souboru. Politika přidělující funkci objektům Pro vytvoření je potřeba balíček DBMS_RLS. Manipulace s jednotlivými politikami, skupinami politik a kontextem aplikace. Jsou potřeba práva SYS nebo aspoň EXECUTE.
Vytvoření funkce Příklad pro funkci vracející podmínku na číslo oddělení deptno: CREATE OR REPLACE FUNCTION hide_sal_comm ( v_schema IN VARCHAR2, v_objname IN VARCHAR2) RETURN VARCHAR2 AS con VARCHAR2 (200); BEGIN con := 'deptno=30'; RETURN (con); END hide_sal_comm;
VPD politika Přiřazení politiky k tabulce: BEGIN DBMS_RLS.ADD_POLICY ( object_schema => 'scott', object_name => 'emp', policy_name => 'hide_sal_policy', policy_function => 'hide_sal_comm', sec_relevant_cols => 'sal,comm'); END; statement_types Uživatel s právy držení indexu může vidět všechny řádky, i když na ně nemá právo SELECT. Politika umožní vidět plat jen uživatelům podle omezení funkce.
Chování VPD Zobrazí jen ty řádky, u kterých má uživatel práva přístupu ke všem atributům. Maskování NULL hodnotou. sec_relevant_cols_opt => dbms_rls.all_rows Používá se jen pro SELECT.
VPD Policy Groups Jednotlivé politiky lze seskupit dohromady. DBMS_RLS.ADD_GROUPED_POLICY Použijí se všechny politiky ve skupině. Spojení v dotazu pomocí operátoru AND Vhodné pokud více aplikací sdílí stejné tabulky s různými bezpečnostními politikami. Aplikace si sama vybere, kterou skupinu politik bude používat. DBMS_RLS.ADD_POLICY_CONTEXT Pokud je kontext NULL použijí se všechny skupiny. Validace aplikace Výchozí skupina SYS_DEFAULT Používá se vždy, lze k ní přidat další.
Optimalizace VPD (1) Nastavení typu politiky (parametr policy_type) DYNAMIC Výchozí typ Spouští funkci politiky při každém přístupu Doporučené pro testování STATIC Uloží výstup funkce do SGA Použije uloženou hodnotu pro všechny přístupy. SHARED_STATIC Jako STATIC, ale sdílí se i mezi více databázovými objekty.
Optimalizace VPD (2) CONTEXT_SENSITIVE Spouští funkci při změně lokálního kontextu aplikace, jinak použije uložený výsledek. Vhodné pokud se výsledek funkce nemění v rámci jednoho připojení, ale je odlišný pro různé uživatele. SHARED_CONTEXT_SENSITIVE Jako CONTEXT_SENSITIVE, ale sdílí se i mezi více objekty.
Omezení při užití VPD Nemělo by se používat FOR UPDATE v příkazu SELECT Vnější spojení Flashback Query Aktuální politika se použije pro stará data. Direct path export dat nespouští politiky. Nelze aplikovat politiky na objekty ve schématu SYS. Uživatelé s právem EXEMPT ACCESS POLICY nepodléhají VPD omezením.
Příklady kotrj7am.kotrj7am_vpd Bez politiky kotrj7am.kotrj7am_vpd1 Politika zobrazující jen povolené řádky Funkce s podmínkou username='miller' kotrj7am.kotrj7am_vpd2 Funkce s podmínkou department=1, politika stejná. kotrj7am.kotrj7am_vpd3 Politika s nastaveným citlivým sloupcem na salary Funkce s podmínkou department=1. kotrj7am.kotrj7am_vpd4 Jako předchozí, ale citlivé údaje nastaví na NULL.
Zdroje http://download.oracle.com/docs/cd/e11882_01/networ k.112/e16543/vpd.htm#dbseg007