徐正雄 李思琳 雷姣惠 李捷波 肖文博
摘要:Oracle數據庫的虛擬專用數據庫VPD(Virtual Private Database)能從數據庫層面對數據庫實現細粒度訪問控制及安全應用策略實現。本文通過Oracle虛擬專用數據庫的實現及應用場景介紹,為數據庫管理員提供多途徑的數據管理手段,解決前端應用對數據不同訪問控制的安全管理及具體需求,提高數據庫的安全性及可用性。
關鍵詞:Oracle;虛擬專用數據庫;實現;應用
中圖分類號:TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)13-0039-02
Abstract: VPD (virtual private database) of Oracle database can realize fine-grained access control and security application strategy from the database layer. This paper introduces the implementation and application scenarios of Oracle virtual private database, provides database administrators with multi-channel data management means, solves the security management and specific requirements of front-end applications for different data access control, and improves the security and availability of database.
Key words: Oracle, virtual private database, implementation, application
1 概述
Oracle數據庫在實際應用中可能會遇到不同級別的數據查詢權限劃分或不同種類的數據查詢需求, Oracle數據庫的虛擬專用數據庫VPD(Virtual Private Database)能從數據庫層面對數據庫實現細粒度訪問控制及安全應用策略實現,數據庫管理員(DBA)可以用少量的VPD策略維護一個較大的數據庫,針對不同用戶制定不同的訪問控制策略,而不必針對不同用戶建立不同或單獨的數據庫,降低系統開銷,提高數據庫精細化管理及安全訪問控制功能,從數據庫層面實現數據管理的高可用及高安全。
2 應用場景分析
Oracle數據庫管理過程中,某些數據信息涉及保密及特殊要求只能由特定權限的用戶進行訪問查詢及修改,或者同一個數據表內的不同數據,有不同權限用戶訪問控制需求,用數據庫普通用戶權限管理功能無法實現。Oracle虛擬專用數據庫將服務器實施的細粒度訪問控制和安全應用程序上下文結合起來,支持上下文的函數范圍一個謂語,即where子句,該子句自動附加到所有的select子句或其他DML語句。換句話,由VPD控制的表、視圖、同義詞上的select語句將根據where子句返回行的子集,該子集由通過應用程序上下文生效的安全策略函數自動生成。VPD的主要組成部分是行級別的安全性(RLS),也稱為“細粒度訪問控制”(FGAC)。細粒度訪問控制,能很好實現以上管理控制,在用戶端完全透明無訪問障礙。具體應用例如在醫院信息管理系統中,患者數據存放于同一數據庫中,某些重點及特殊患者醫療涉及隱私及保密需要,需要對不同身份類別患者進行不同權限數據訪問控制,Oracle數據庫細粒度訪問控制就能在用戶完全透明的前提下,有效實現不同類別用戶查詢、修改、刪除不同類別數據的權限需求,而不需要單獨建立特殊患者數據庫,提高了實際應用中的高可用性及高安全性。
3 虛擬專用數據庫(VPD)的安全管理策略實現
應用場景假設一收治特殊患者科室,只允許特殊用戶訪問該科室患者信息數據 ,其他用戶嚴格控制訪問。
1)首先創建程序包DEPT_SELECT,程序包中的過程是可以設置上下文變量的唯一過程,程序包主體如下:
create or replace package body dept_select as
function select_lmt(object_schema Varchar2,object_name Varchar2) Return? Varchar2? is
rtn_predicate Varchar2(500);
begin
if user='XZX' then
rtn_predicate := 'Dept_code ='||'092801';
else
rtn_predicate := 'Dept_code<>'||'092801';
end if;
return rtn_predicate;
end;
end;
其中設置條件為“當數據庫用戶(User)等于xzx時,變量rtn_predicate賦值為Dept_code='092801',否則為Dept_code <>'092801'? ”。
2)利用oracle內置程序包DBMS_RLS,其含有大量子程序,DBA可以使用這些子程序維護與表、視圖、同義詞關聯的VDP策略。本文介紹最常用的子程序ADD_POLICE和DROP_POLICE。
(1)子程序ADD_POLICE實現將細粒度的訪問控制策略添加到對象 。接上面示例,我們利用ADD_POLICE將程序包DEPT_SELECT的策略應用于表inpadm.bed_rec:
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema=> 'inpadm',
object_name=> 'bed_rec',
policy_name=> 'dept_audit',
function_schema => 'sys',
policy_function=> 'dept_select.select_lmt',
statement_types=> 'select'
);
end;
其中object_schema是包含由策略保護的表、視圖或同義詞的模式,如果該值為空,則使用調用過程的用戶的模式;object_name是由策略保護的表、視圖和同義詞的名稱;statement_types是應用策略的語句類型,允許的值(以逗號分隔)可以是select、insert、update、delete和index的任意組合。默認條件下,除了index之外的所有類型適用;policy_name是添加到對象的策略名稱,對于受保護的每個對象,該策略名必須唯一;policy_function是函數名稱,該函數為針對object_name的策略生成謂語,如果函數是程序包的一部分,則在此處必須指定程序包名,用于限定策略函數名。
以上名稱為dept_audit細粒度訪問控制策略實現:當對表inpadm.bed_rec進行select查詢操作時,當查詢用戶不為xzx時,查詢結果不返回表bed_rec字段dept_code值為092801的數據 ,只有查詢用戶為xzx時,才能返回相應數據記錄。在實際應用中結合實例,假設某醫院莫特殊科室在醫院床位記錄表bed_rec中,科室代碼字段值為092801,應用以上程序,就能實現當用戶名為xzx的數據庫用戶執行查詢語句時,可以返回該床位代碼為該科室的患者信息 ,其他用戶查詢該科室患者數據信息返回值為0。
(2)子程序DROP_POLICE實現刪除對象中的細粒度訪問控制策略。如刪除名稱為dept_audit的策略,命令如下:
BEGIN
DBMS_RLS.DROP_POLICY(
object_schema=> ' inpadm ',
object_name=> ' bed_rec ',
policy_name=> 'dept_audit');
END;
命令執行后,對對象表inpadm.bed_rec的細粒度訪問控制策略失效 。
4 總結
Oracle數據庫的虛擬專用數據庫VPD的應用,能解決很多應用場景中對數據訪問控制的特殊需求。只需要極低的系統開銷,就能對相同數據庫的相同數據實現不同權限管理,減少單獨建庫的軟、硬件資源配置需求,方便管理及維護,且前端應用透明無痕,充分體現Oracle數據庫的高安全及高可用。通過Oracle虛擬專用數據庫的應用,我們能對在用系統數據庫基礎上對新的數據管理需求做深層次的數據統籌規劃及管理,為數據管理提供更安全、精細、科學的技術手段支撐。
參考文獻:
[1] 許杰,魯慧哲,左翼.如何建立基于虛擬數據庫的Oracle數據安全防護體系[J].中國數字醫學,2016,11(9):106-108.
[2] 牛承志,趙丹.虛擬數據庫技術在集成化醫院信息系統中的應用研究[J].河南職工醫學院學報,2011,23(2):248-250.
[3] 杜威,鄒先霞,潘久輝.虛擬數據庫的實現方法[J].計算機工程與設計,2010,31(14):3201-3206.
【通聯編輯:王力】