Oracle 技术网

使用虚拟专用数据库策略组

<不要删除此文本,因为它是在浏览器中运行时生成的“主要”标题列表的占位符>

目的

虚拟专用数据库 (VPD) 使您可以控制数据库用户和非数据库用户(应用程序或最终用户)对表的列和行的访问。

在根据用户对表行进行访问控制的同时,还可以根据每个策略控制表的某列或某些列是否显示。可以对每个敏感列或一组敏感列实施一个 VPD 策略。如果不同的用户组对不同的列集合敏感,则需对每个列集合实施一个 VPD 策略。然而,如果向一个表附加了多个 VPD 策略,则这些策略将平等执行,其结果是这些策略相与运算的结果。在本示例中,仅执行一个策略。要控制执行哪个策略,需要实施“驱动应用程序上下文”。

本教程的目的是演示:

所需时间

大约 1 小时。

概述

在本教程中,您将执行以下任务:

软件和硬件要求

以下为软件要求列表:

前提条件

开始本教程之前,您应该:

.

安装 Oracle Database 11g 第 2 版。

.

vpd_groups.zip 文件下载并解压缩到您选择的目录中。

创建用户并授予其权限


要创建本示例中将使用的用户并授予其权限,执行以下任务。

创建 APP_SERVER 用户


.

打开浏览器并输入相应的 URL,在您的服务器上启动 Enterprise Manager Database Control。以 SYSTEM 用户身份登录。

 

.

在 Database Home 页面中单击 Server 选项卡。


.

在 Security 区域中,单击 Users 链接。

 

.

单击 Create。

 

.

在 Name 域中输入 app_server。指定口令。使用手电筒图标选择默认表空间和临时表空间。单击 System Privileges 选项卡。

 

.

单击 Edit List。

 

.

在 Available System Privileges 列表中使用滚动条定位到 CREATE TABLE。单击 Move。

 

.

CREATE TABLE 现在显示为 Selected System Privilege。单击 OK。

 

.

CREATE TABLE 现在被列为 System Privilege。单击 Quotas 选项卡。

 

.

针对 EXAMPLE 表空间,从 Quota 下拉菜单中选择 Unlimited

 

.

单击 OK。

 

.

您会收到一条消息,确认 app_server 用户创建成功。

 

创建 SEC_ADMIN 用户


.

在 Users 页面上,单击 Create。

 

.

在 Name 域中输入 sec_admin。指定口令。使用手电筒图标选择默认表空间和临时表空间。单击 System Privileges 选项卡。


.

单击 Edit List。

 

.

在 Available System Privileges 列表中使用滚动条定位到 CREATE ANY CONTEXT。单击 Move。对 CREATE PROCEDURESELECT ANY DICTIONARY 重复这一过程。

 

.

这些权限都显示为 Selected System Privileges。单击 OK。

 

.

列出了选定的系统权限。单击 OK。

 

.

您会收到一条消息,确认 sec_admin 用户创建成功。单击 Logout。

 

.

单击 Login。在 User Name 域中输入 sys,为 SYS 用户输入口令。在 Connect As 菜单中选择 SYSDBA。再次单击 Login。

 

.

在 Database Home 页面中单击 Server 选项卡。

 

.

在 Security 区域中单击 Users。

 

.

在 Object Name 域中输入 sec_admin,然后单击 Go。

 

.

单击 Edit。

 

.

单击 Object Privileges 选项卡。

 

.

在 Select Object Type 菜单中选择 Package。单击 Add。

 

.

在 Select Package Objects 域中输入 SYS.DBMS_RLS。在 Available Privileges 列表中选择 EXECUTE,然后单击 Move。

 

.

单击 OK。

 

.

单击 Apply。

 

.

您会收到一条消息,确认 SEC_ADMIN 用户已经修改。单击 Logout。

 

.

导航至 vpd_groups.zip 文件的解压缩目录。调用 SQL*Plus,以 APP_SERVER 用户身份连接。

 

.

执行 cr_rfid_data.sql 脚本创建 APP_SERVER.RFID_DATA 表并向该表插入若干行。

 

.

退出 SQL*Plus。

 

创建 VPD 策略组

创建 PROVIDER_A_GROUP 策略组


.

SEC_ADMIN 用户身份登录到 Enterprise Manager Database Control。

 

.

单击 Server 选项卡。


.

在 Server 页面的 Security 区域中,单击 Virtual Private Database。


.

单击 Advanced 选项卡。


.

单击 Create 添加 VPD 策略组。


.

在 Policy Group Name 域中输入 provider_a_group。在 Object Name 域中输入 APP_SERVER.RFID_DATA。单击 OK。


.

您会收到一条消息,确认策略组创建成功。


创建 PROVIDER_B_GROUP 策略组


.

在 Virutal Private Database Policies 页面中(Advanced 选项卡),单击 Create 创建另一个策略组。

 

.

在 Policy Group Name 域中输入 provider_b_group。在 Object Name 域中输入 APP_SERVER.RFID_DATA。单击 OK。


.

您会收到一条消息,确认策略组创建成功。单击 Database 链接返回 Database Home 页面。


创建策略函数

要创建策略函数,执行以下步骤:

.

在 Database Home 页面中,单击 Schema 选项卡。

 

 

.

在 Programs 区域中单击 Functions。


.

单击 Create。


.

在 Name 域中输入 f_hide_cols。将以下代码复制并粘贴到 Source 域中。单击 OK。

(schema in varchar2, tab in varchar2)
return varchar2 as predicate varchar2(8) default '1=2';
begin
return predicate;
end;


.

您会收到一条消息,确认函数创建成功。单击 Database 选项卡返回 Database Home 页面。


向策略组添加策略

要向策略组添加策略,执行以下步骤:

向 PROVIDER_A_GROUP 添加策略


.

在 Database Home 页面中单击 Server 选项卡。

 

.

在 Security 区域中单击 Virtual Private Database。


.

单击 Advanced。


.

选择 PROVIDER_A_GROUP 并单击 Manage。


.

在 Manage Group Policies 部分中,单击 Add。


.

在 Policy Name 域中输入 hide_cols_b_from_a。在 Policy Type 菜单中选择 SHARED_CONTEXT_SENSITIVE。确保选中 Enabled。在 Policy Function 域中输入 SEC_ADMIN.F_HIDE_COLS


.

向下滚动页面。在 Enforcement 区域中,确保只选中 SELECT(不选中 INSERT、UPDATE 和 DELETE)。选择 Enable Column Masking Behavior。单击 Add。


.

选择 STORAGE_BDATE_B。单击 Select。


.

返回 Add Policy 页面。单击 Continue。


.

在 Manage Policy Group:PROVIDER_A_GROUP 页面中,单击 OK。


.

您会收到一条消息,确认策略组已成功修改。

 

向 PROVIDER_B_GROUP 添加策略


.

选择 PROVIDER_B_GROUP 并单击 Manage。


.

在 Manage Group Policies 部分中,单击 Add。


.

在 Policy Name 域中输入 hide_cols_a_from_b。在 Policy Type 菜单中选择 SHARED_CONTEXT_SENSITIVE。确保选中 Enabled。在 Policy Function 域中输入 SEC_ADMIN.F_HIDE_COLS


.

向下滚动页面。在 Enforcement 区域中,确保只选中 SELECT(不选中 INSERT、UPDATE 和 DELETE)。选择 Enable Column Masking Behavior。单击 Add。


.

选择 STORAGE_ADATE_A。单击 Select。


.

返回 Add Policy 页面。单击 Continue。


.

在 Manage Policy Group:PROVIDER_A_GROUP 页面中,单击 OK。


.

您会收到一条消息,确认策略组已成功修改。单击 Database 选项卡返回 Database Home 页面。



创建程序包

要创建驱动应用程序文本将使用的程序包,执行以下步骤:

.

在 Database Home 页面中单击 Schema 选项卡。


.

在 Programs 区域中单击 Packages。


.

单击 Create。


.

在 Name 域中输入 provider_package。将以下代码复制并粘贴到 Source 域中。

as
procedure set_provider_context;
end;

单击 OK。


.

您会收到一条确认消息。


.

在 Object Type 菜单中选择 Package Body,然后单击 Create。


.

在 Name 域中输入 provider_package。将以下文本复制并粘贴到 Source 域中。

AS
procedure set_provider_context
IS
begin
CASE lower(sys_context('userenv','client_identifier'))
WHEN 'provider_a' then
dbms_session.set_context('provider_ctx','policy_group','PROVIDER_A_GROUP');
WHEN 'provider_b' then
dbms_session.set_context('provider_ctx','policy_group','PROVIDER_B_GROUP');
END CASE;
end set_provider_context;
end;

单击 OK。


.

您会收到一条确认消息。单击 Database 选项卡返回 Database Home 页面。



创建应用程序上下文

要创建应用程序上下文,执行以下步骤:

.

在 Database Home 页面中单击 Server 选项卡。


.

在 Security 区域中单击 Application Contexts。


.

单击 Create。


.

在 Namespace 域中输入 PROVIDER_CTX。在 Package Name 域中输入 SEC_ADMIN.PROVIDER_PACKAGE。确保在 Type 区域中选中 Secure session based - Accessed Locally


.

向下滚动页面。在 Driving Context 区域中,单击 Add。


.

在 Object Name 域中输入 APP_SERVER.RFID_DATA。在 Attribute 域中输入 policy_group。单击 Continue。


.

返回 Create Application Contexts 页面。单击 OK。


.

您会收到一条确认消息。单击 Database 选项卡返回 Database Home 页面。



授予程序包 EXECUTE 权限

要授予程序包 EXECUTE 权限,执行以下步骤:

.

在 Database Home 页面中单击 Server 选项卡。


.

在 Security 区域中单击 Users。


.

选择 APP_SERVER 用户并单击 Edit。


.

单击 Object Privileges 选项卡。


.

在 Select Object Type 菜单中选择 Package。单击 Add。


.

在 Select Package Objects 域中输入 sec_admin.provider_package。在 Available Privileges 列表中选择 EXECUTE。单击 Move。


.

单击 OK。


.

单击 Apply。


.

您会收到一条确认消息。单击 Database 选项卡返回 Database Home 页面。




验证实施

要验证您的 VPD 策略组的实施,执行以下步骤:

注意: 在创建本教程所使用的环境中,向 $ORACLE_HOME/sqplus/admin/glogin.sql 文件添加 set sqlprompt '_user> ' 命令。

.

APP_SERVER 用户身份登录到 SQL*Plus。


.

执行 exec_pkg_a.sql 脚本。该脚本将上下文切换到 provider_a,然后基于上下文执行 PROViDER_PACKAGE.SET_PROVIDER_CONTEXT 过程来设置策略组。最后,对 RFID_DATA 表执行查询。注意,因为应用了 provider_a,因此只显示 STORAGE_ADATE_A 列的值。


.

执行 exec_pkg_b.sql 脚本。该脚本将上下文切换到 provider_b,然后基于上下文执行 PROViDER_PACKAGE.SET_PROVIDER_CONTEXT 过程来设置策略组。最后,对 RFID_DATA 表执行查询。注意,因为应用了 provider_b,因此只显示 STORAGE_BDATE_B 列的值。


.

退出 SQL*Plus。

 


总结

在本教程中,您学习了如何:

资源

致谢

Oracle Is The Information Company 关于 Oracle | Oracle RSS 信源 | 招聘 | 联系我们 | 网站地图 | 法律声明 | 使用条款 | 您的隐私权利