基于虚拟专用数据库的高效数据访问权限控制

摘 要:虚拟专用数据库(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.

作者简介:

黄杰生,现就职于广州奥格智能科技有限公司,从事软件开发工作;

罗鹏,现就职于广州奥格智能科技有限公司,从事软件开发工作;

韩早强,现就职于广州奥格智能科技有限公司,从事软件开发工作。

推荐访问:高效 访问权限 专用 虚拟 控制