為了保證企業(yè)數(shù)據(jù)的安全和隱私,Oracle引入了VPD(Virtual Private Database)的概念。VPD是基于數(shù)據(jù)庫的訪問控制技術(shù),它通過在SQL查詢中自動(dòng)應(yīng)用安全策略,對(duì)表中的行進(jìn)行過濾,從而保障數(shù)據(jù)訪問的合理性和規(guī)范性。以下將從VPD的原理、實(shí)現(xiàn)方法以及應(yīng)用場(chǎng)景三個(gè)方面來解析它的應(yīng)用。
VPD的最基本原理是在對(duì)表的讀取、更新、刪除操作前,需要通過SQL Rewrite將安全策略注入到執(zhí)行計(jì)劃中。它可以通過視圖、行級(jí)觸發(fā)器、函數(shù)和API等形式進(jìn)行實(shí)現(xiàn)。
視圖形式的VPD可以通過在SQL查詢時(shí)啟用動(dòng)態(tài)視圖來實(shí)現(xiàn)。例如,下面定義了一個(gè)視圖,只允許用戶在查詢時(shí)看到status為'open'的行:
CREATE OR REPLACE VIEW emp_vpd_view AS SELECT * FROM emp WHERE status = 'open';
當(dāng)用戶執(zhí)行以下查詢時(shí),只會(huì)看到status為'open'的行
SELECT * FROM emp_vpd_view;
觸發(fā)器形式的VPD基于觸發(fā)器對(duì)表的操作進(jìn)行攔截和檢查,實(shí)現(xiàn)對(duì)行的訪問控制。例如,下面的觸發(fā)器可以限制user1用戶只能查詢與自己相關(guān)的部門信息:
CREATE OR REPLACE TRIGGER emp_vpd_trigger BEFORE SELECT ON emp FOR EACH ROW BEGIN IF USER = 'user1' THEN SELECT deptno INTO :new.deptno FROM emp WHERE deptno = :new.deptno; END IF; END;
函數(shù)形式的VPD通過將過濾邏輯封裝到一個(gè)函數(shù)中,然后調(diào)用該函數(shù)來進(jìn)行行級(jí)訪問控制。例如,下面的函數(shù)根據(jù)用戶所屬部門來對(duì)數(shù)據(jù)進(jìn)行過濾:
CREATE OR REPLACE FUNCTION emp_vpd_fn ( schema_name IN VARCHAR2, object_name IN VARCHAR2 ) RETURN VARCHAR2 IS v_deptno VARCHAR2 (10); BEGIN SELECT deptno INTO v_deptno FROM emp WHERE userdept = USER; RETURN 'deptno = ' || v_deptno; END;
調(diào)用該函數(shù)時(shí),會(huì)根據(jù)當(dāng)前用戶所屬部門返回對(duì)應(yīng)的篩選條件:
SELECT * FROM emp WHERE SYS_CONTEXT ('USERENV', 'SESSION_USERDEPT') = emp_vpd_fn ('emp', 'emp');
API形式的VPD主要是創(chuàng)建安全策略包(Security Policy Package),實(shí)現(xiàn)訪問控制功能。例如,下面的代碼使用DBMS_RLS包創(chuàng)建策略包來控制用戶的訪問權(quán)限:
BEGIN DBMS_RLS.ADD_POLICY ( 'emp', 'emp_policy', 'user_policy', 'emp', 'empno', 'USER = USER', 'SELECT', TRUE ); END;
除了以上幾種實(shí)現(xiàn)方式之外,還可以通過VPD實(shí)現(xiàn)數(shù)據(jù)脫敏、數(shù)據(jù)加密、數(shù)據(jù)掩碼等數(shù)據(jù)安全控制技術(shù)。例如,下面的代碼通過Row-Level Security控制僅允許管理員和上級(jí)領(lǐng)導(dǎo)查看員工的薪資信息:
BEGIN DBMS_RLS.ADD_POLICY('hr','employees','emp_rls_policy','hr','emp_id','SYS_CONTEXT(''APP_CONTEXT'', ''EMPLOYEE_POSITION'') = ''MANAGER'' OR SYS_CONTEXT(''APP_CONTEXT'',''EMPLOYEE_POSITION'') = ''CEO''','SELECT'); END;
總的來說,VPD提供了一種靈活、可擴(kuò)展的數(shù)據(jù)訪問控制方式,能夠有效的保護(hù)企業(yè)的數(shù)據(jù)安全和隱私。在實(shí)際應(yīng)用中,可以根據(jù)不同的場(chǎng)景和需求進(jìn)行實(shí)現(xiàn),從而達(dá)到最佳的數(shù)據(jù)訪問控制效果。