黃杰生 羅鵬 韓早強
摘 要:虛擬專用數據庫(VPD)是Oracle推出的細粒度數據訪問權限控制技術,可在數據庫端一次性實現數據安全配置,無需在各應用系統中分別實現權限配置與訪問控制,可有效降低系統開發部署成本,提高開發效率與數據安全性。本文介紹了VPD技術原理,并給出如何利用VPD技術進行數據訪問權限動態控制的應用實例。
關鍵詞:虛擬專用數據庫;VPD;訪問控制;權限配置
權限配置與訪問控制是每個應用系統的核心功能,關系到數據的安全和完整,如果配置控制失當,會造成數據泄漏和丟失。
目前常規做法是由應用系統在業務代碼層面實現權限配置與訪問控制功能,但這種做法需要人工實現大量編碼與配置工作,可擴展性差,每當規則發生變化時都要修改代碼或配置并重新進行測試,出錯幾率高,效率低下。特別是多個應用系統使用同一個業務數據庫并且遵循相同的訪問控制規則時,更會大幅增加開發部署成本。
因此,我們需要引入一種配置便捷、擴展靈活、能夠支持細粒度訪問控制的安全策略技術。Oracle虛擬專用數據庫(VPD)提供了一種很好的解決方案。
1 VPD工作原理
在數據庫中將數據表或視圖與一個或多個安全策略綁定后,就可以建立VPD。當客戶端對數據庫中已綁定安全策略的表或視圖進行訪問時,將觸發調用一個實現具體安全策略的函數,該策略函數將返回一個“謂詞”(即用于過濾數據的WHERE條件子句)。數據庫將此謂詞自動附加到客戶端所發出的原始SQL 語句后,從而對用戶的數據訪問權限實現動態控制。
開發人員可以編寫更為復雜的存儲過程,將SQL謂詞附加至每個SQL語句,在行級別的粒度控制數據訪問權限。例如,如果Student_1(屬于Class 1)輸入 SELECT * FROM STUDENTS語句,則可以使用 VPD 自動添加 WHERE CLASS=1的子句,這樣便可以通過對原始查詢語句進行自動修改來控制對某些行的數據訪問。
由于是在數據庫層面實施安全策略,因此客戶端無論以何種方式(如通過程序代碼、報表生成工具或其他數據庫客戶端工具)訪問數據,VPD都能確保強制實施一致的訪問控制安全策略。使用 VPD,銀行系統可以確保客戶只能訪問自己的帳戶信息,通信運營商可以安全地隔離客戶記錄,組織結構復雜的應用系統可以支持復雜的人員數據訪問規則。
除了基礎的靜態安全策略(即策略函數所生成的SQL謂詞固定不變,如前所述的WHERE CLASS=1),還可結合數據庫的應用程序上下文功能,實現動態安全策略。即使用數據庫的create context指令,創建應用程序上下文區域,每個客戶端登錄數據庫并創建會話后,可以在上下文區域內自定義每個會話獨有的屬性,同一個策略函數可利用這些屬性進行動態拼接,為不同的會話生成不同的SQL謂詞,從而實現更靈活的訪問權限控制。
VPD安全策略配置主要由DBMS_RLS過程包中的存儲過程實現,主要過程分類與作用如下:
1)個體安全策略管理:ADD_POLICY、DROP_POLICY、ENABLE_POLICY、REFRESH_POLICY等過程;
2)分組安全策略管理:CREATE_POLICY_GROUP、DELETE_POLICY
_GROUP、ADD_GROUPED_POLICY、DROP_GROUPED_POLICY等過程;
3)應用程序上下文管理:ADD_POLICY_CONTEXT、DROP_POLICY
_CONTEXT等過程。
2 基于上下文相關的VPD實現
以下步驟給出如何實現基于上下文相關的VPD實例。
2.1 創建VPD策略管理員并授權
GRANT CREATE SESSION, CREATE ANY CONTEXT, CREATE PROCEDURE, CREATE TRIGGER, ADMINISTER DATABASE TRIGGER TO vpd_admin;
GRANT EXECUTE ON DBMS_SESSION TO vpd_admin;
GRANT EXECUTE ON DBMS_RLS TO vpd_admin;
2.2 創建基于會話的應用程序上下文(以VPD_ADMIN用戶登錄)
CREATE OR REPLACE CONTEXT vpd_ctx USING vpd_ctx_pkg;
以上語句創建了名為vpd_ctx的應用程序上下文,在會話期間為用戶建立自定義屬性的程序包為vpd_ctx_pkg。在登錄觸發器中可調用包中的過程設置自定義屬性,例如以下語句:
//創建登錄觸發器
CREATE TRIGGER set_app_ctx_trig AFTER LOGON ON DATABASE
BEGIN vpd_admin.app_ctx_pkg.set_custnum;END;
// vpd_admin.app_ctx_pkg.set_custnum過程核心代碼
SELECT cust_no INTO custnum FROM SCOTT.CUSTOMERS WHERE cust_id=SYS_CONTEXT('USERENV', 'SESSION_USER');
DBMS_SESSION.SET_CONTEXT('app_ctx', 'cust_no', custnum);
因為上下文app_ctx只綁定到app_ctx_pkg,因此其他過程不能改變會話屬性,可以確保在連接到數據庫后任何其他進程都不能改變安全的應用程序上下文。
2.3 創建策略函數
CREATE OR REPLACE FUNCTION get_cust_info(schema_p IN VARCHAR2,table_p IN VARCHAR2) RETURN VARCHAR2 AS
cust_info_pred VARCHAR2 (400);
BEGIN cust_info_pred := 'cust_no = SYS_CONTEXT(''app_ctx'', ''cust_no'')'; RETURN cust_info_pred;
END;
以上策略函數根據應用程序上下文中的屬性動態生成SQL謂詞,只獲取與當前登錄用戶相關的數據。
2.4 綁定安全策略
使用vpd_admin用戶登錄并執行DBMS_RLS.ADD_POLICY過程,將策略函數與指定的數據表進行綁定,使安全策略生效,代碼如下:
BEGIN
DBMS_RLS.ADD_POLICY (object_schema => 'customers', object_name => 'custs_tab', policy_name => 'custs_policy',
function_schema => 'vpd_admin', policy_function => 'get_cust_info', statement_types => 'select');
END;
2.5 效果測試
分別以user1和user2用戶登錄,執行相同的查詢語句select * from custs_tab,每個用戶將只能看到自己的客戶資料。
3 結語
虛擬專用數據庫(VPD)技術提供了角色和視圖模式無法提供的行級訪問控制,數據與系統托管公司可以在同一數據庫中維護多個公司的數據,但只允許各公司查看自身數據。VPD可大幅降低應用程序的開發部署成本,可以在數據庫端一次實現安全性,而無需在訪問數據的各個應用系統中分別實現權限配置和訪問控制。另外,由于VPD在數據庫中實施安全策略,所以不管以何種客戶端方式訪問數據,都不能繞過安全環節,安全性更高。
虛擬專用數據庫是一項重要的技術,同時也是基礎設施資源虛擬化的一種成功應用,許多Oracle應用程序本身也是使用 VPD實現數據分隔的(如Oracle SalesOnline.com、Oracle Portal等)。VPD使企業能夠以較低的成本、較高的效率構建業務系統,具有十分廣闊的應用空間,值得企業應用開發人員學習和使用。
參考文獻:
[1] Oracle[] Database Security Guide.
[2] Oracle[] Database Advanced Application Developer's Guide.
[3] Oracle[] Database PL/SQL Language Reference.
[4] Oracle[] Database SQL Language Reference.
作者簡介:
黃杰生,現就職于廣州奧格智能科技有限公司,從事軟件開發工作;
羅鵬,現就職于廣州奧格智能科技有限公司,從事軟件開發工作;
韓早強,現就職于廣州奧格智能科技有限公司,從事軟件開發工作。