黃杰生 羅鵬 韓早強(qiáng)
摘 要:虛擬專用數(shù)據(jù)庫(kù)(VPD)是Oracle推出的細(xì)粒度數(shù)據(jù)訪問(wèn)權(quán)限控制技術(shù),可在數(shù)據(jù)庫(kù)端一次性實(shí)現(xiàn)數(shù)據(jù)安全配置,無(wú)需在各應(yīng)用系統(tǒng)中分別實(shí)現(xiàn)權(quán)限配置與訪問(wèn)控制,可有效降低系統(tǒng)開(kāi)發(fā)部署成本,提高開(kāi)發(fā)效率與數(shù)據(jù)安全性。本文介紹了VPD技術(shù)原理,并給出如何利用VPD技術(shù)進(jìn)行數(shù)據(jù)訪問(wèn)權(quán)限動(dòng)態(tài)控制的應(yīng)用實(shí)例。
關(guān)鍵詞:虛擬專用數(shù)據(jù)庫(kù);VPD;訪問(wèn)控制;權(quán)限配置
權(quán)限配置與訪問(wèn)控制是每個(gè)應(yīng)用系統(tǒng)的核心功能,關(guān)系到數(shù)據(jù)的安全和完整,如果配置控制失當(dāng),會(huì)造成數(shù)據(jù)泄漏和丟失。
目前常規(guī)做法是由應(yīng)用系統(tǒng)在業(yè)務(wù)代碼層面實(shí)現(xiàn)權(quán)限配置與訪問(wèn)控制功能,但這種做法需要人工實(shí)現(xiàn)大量編碼與配置工作,可擴(kuò)展性差,每當(dāng)規(guī)則發(fā)生變化時(shí)都要修改代碼或配置并重新進(jìn)行測(cè)試,出錯(cuò)幾率高,效率低下。特別是多個(gè)應(yīng)用系統(tǒng)使用同一個(gè)業(yè)務(wù)數(shù)據(jù)庫(kù)并且遵循相同的訪問(wèn)控制規(guī)則時(shí),更會(huì)大幅增加開(kāi)發(fā)部署成本。
因此,我們需要引入一種配置便捷、擴(kuò)展靈活、能夠支持細(xì)粒度訪問(wèn)控制的安全策略技術(shù)。Oracle虛擬專用數(shù)據(jù)庫(kù)(VPD)提供了一種很好的解決方案。
1 VPD工作原理
在數(shù)據(jù)庫(kù)中將數(shù)據(jù)表或視圖與一個(gè)或多個(gè)安全策略綁定后,就可以建立VPD。當(dāng)客戶端對(duì)數(shù)據(jù)庫(kù)中已綁定安全策略的表或視圖進(jìn)行訪問(wèn)時(shí),將觸發(fā)調(diào)用一個(gè)實(shí)現(xiàn)具體安全策略的函數(shù),該策略函數(shù)將返回一個(gè)“謂詞”(即用于過(guò)濾數(shù)據(jù)的WHERE條件子句)。數(shù)據(jù)庫(kù)將此謂詞自動(dòng)附加到客戶端所發(fā)出的原始SQL 語(yǔ)句后,從而對(duì)用戶的數(shù)據(jù)訪問(wèn)權(quán)限實(shí)現(xiàn)動(dòng)態(tài)控制。
開(kāi)發(fā)人員可以編寫更為復(fù)雜的存儲(chǔ)過(guò)程,將SQL謂詞附加至每個(gè)SQL語(yǔ)句,在行級(jí)別的粒度控制數(shù)據(jù)訪問(wèn)權(quán)限。例如,如果Student_1(屬于Class 1)輸入 SELECT * FROM STUDENTS語(yǔ)句,則可以使用 VPD 自動(dòng)添加 WHERE CLASS=1的子句,這樣便可以通過(guò)對(duì)原始查詢語(yǔ)句進(jìn)行自動(dòng)修改來(lái)控制對(duì)某些行的數(shù)據(jù)訪問(wèn)。
由于是在數(shù)據(jù)庫(kù)層面實(shí)施安全策略,因此客戶端無(wú)論以何種方式(如通過(guò)程序代碼、報(bào)表生成工具或其他數(shù)據(jù)庫(kù)客戶端工具)訪問(wèn)數(shù)據(jù),VPD都能確保強(qiáng)制實(shí)施一致的訪問(wèn)控制安全策略。使用 VPD,銀行系統(tǒng)可以確保客戶只能訪問(wèn)自己的帳戶信息,通信運(yùn)營(yíng)商可以安全地隔離客戶記錄,組織結(jié)構(gòu)復(fù)雜的應(yīng)用系統(tǒng)可以支持復(fù)雜的人員數(shù)據(jù)訪問(wèn)規(guī)則。
除了基礎(chǔ)的靜態(tài)安全策略(即策略函數(shù)所生成的SQL謂詞固定不變,如前所述的WHERE CLASS=1),還可結(jié)合數(shù)據(jù)庫(kù)的應(yīng)用程序上下文功能,實(shí)現(xiàn)動(dòng)態(tài)安全策略。即使用數(shù)據(jù)庫(kù)的create context指令,創(chuàng)建應(yīng)用程序上下文區(qū)域,每個(gè)客戶端登錄數(shù)據(jù)庫(kù)并創(chuàng)建會(huì)話后,可以在上下文區(qū)域內(nèi)自定義每個(gè)會(huì)話獨(dú)有的屬性,同一個(gè)策略函數(shù)可利用這些屬性進(jìn)行動(dòng)態(tài)拼接,為不同的會(huì)話生成不同的SQL謂詞,從而實(shí)現(xiàn)更靈活的訪問(wèn)權(quán)限控制。
VPD安全策略配置主要由DBMS_RLS過(guò)程包中的存儲(chǔ)過(guò)程實(shí)現(xiàn),主要過(guò)程分類與作用如下:
1)個(gè)體安全策略管理:ADD_POLICY、DROP_POLICY、ENABLE_POLICY、REFRESH_POLICY等過(guò)程;
2)分組安全策略管理:CREATE_POLICY_GROUP、DELETE_POLICY
_GROUP、ADD_GROUPED_POLICY、DROP_GROUPED_POLICY等過(guò)程;
3)應(yīng)用程序上下文管理:ADD_POLICY_CONTEXT、DROP_POLICY
_CONTEXT等過(guò)程。
2 基于上下文相關(guān)的VPD實(shí)現(xiàn)
以下步驟給出如何實(shí)現(xiàn)基于上下文相關(guān)的VPD實(shí)例。
2.1 創(chuàng)建VPD策略管理員并授權(quán)
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 創(chuàng)建基于會(huì)話的應(yīng)用程序上下文(以VPD_ADMIN用戶登錄)
CREATE OR REPLACE CONTEXT vpd_ctx USING vpd_ctx_pkg;
以上語(yǔ)句創(chuàng)建了名為vpd_ctx的應(yīng)用程序上下文,在會(huì)話期間為用戶建立自定義屬性的程序包為vpd_ctx_pkg。在登錄觸發(fā)器中可調(diào)用包中的過(guò)程設(shè)置自定義屬性,例如以下語(yǔ)句:
//創(chuàng)建登錄觸發(fā)器
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過(guò)程核心代碼
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);
因?yàn)樯舷挛腶pp_ctx只綁定到app_ctx_pkg,因此其他過(guò)程不能改變會(huì)話屬性,可以確保在連接到數(shù)據(jù)庫(kù)后任何其他進(jìn)程都不能改變安全的應(yīng)用程序上下文。
2.3 創(chuàng)建策略函數(shù)
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;
以上策略函數(shù)根據(jù)應(yīng)用程序上下文中的屬性動(dòng)態(tài)生成SQL謂詞,只獲取與當(dāng)前登錄用戶相關(guān)的數(shù)據(jù)。
2.4 綁定安全策略
使用vpd_admin用戶登錄并執(zhí)行DBMS_RLS.ADD_POLICY過(guò)程,將策略函數(shù)與指定的數(shù)據(jù)表進(jìn)行綁定,使安全策略生效,代碼如下:
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 效果測(cè)試
分別以u(píng)ser1和user2用戶登錄,執(zhí)行相同的查詢語(yǔ)句select * from custs_tab,每個(gè)用戶將只能看到自己的客戶資料。
3 結(jié)語(yǔ)
虛擬專用數(shù)據(jù)庫(kù)(VPD)技術(shù)提供了角色和視圖模式無(wú)法提供的行級(jí)訪問(wèn)控制,數(shù)據(jù)與系統(tǒng)托管公司可以在同一數(shù)據(jù)庫(kù)中維護(hù)多個(gè)公司的數(shù)據(jù),但只允許各公司查看自身數(shù)據(jù)。VPD可大幅降低應(yīng)用程序的開(kāi)發(fā)部署成本,可以在數(shù)據(jù)庫(kù)端一次實(shí)現(xiàn)安全性,而無(wú)需在訪問(wèn)數(shù)據(jù)的各個(gè)應(yīng)用系統(tǒng)中分別實(shí)現(xiàn)權(quán)限配置和訪問(wèn)控制。另外,由于VPD在數(shù)據(jù)庫(kù)中實(shí)施安全策略,所以不管以何種客戶端方式訪問(wèn)數(shù)據(jù),都不能繞過(guò)安全環(huán)節(jié),安全性更高。
虛擬專用數(shù)據(jù)庫(kù)是一項(xiàng)重要的技術(shù),同時(shí)也是基礎(chǔ)設(shè)施資源虛擬化的一種成功應(yīng)用,許多Oracle應(yīng)用程序本身也是使用 VPD實(shí)現(xiàn)數(shù)據(jù)分隔的(如Oracle SalesOnline.com、Oracle Portal等)。VPD使企業(yè)能夠以較低的成本、較高的效率構(gòu)建業(yè)務(wù)系統(tǒng),具有十分廣闊的應(yīng)用空間,值得企業(yè)應(yīng)用開(kāi)發(fā)人員學(xué)習(xí)和使用。
參考文獻(xiàn):
[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.
作者簡(jiǎn)介:
黃杰生,現(xiàn)就職于廣州奧格智能科技有限公司,從事軟件開(kāi)發(fā)工作;
羅鵬,現(xiàn)就職于廣州奧格智能科技有限公司,從事軟件開(kāi)發(fā)工作;
韓早強(qiáng),現(xiàn)就職于廣州奧格智能科技有限公司,從事軟件開(kāi)發(fā)工作。