![]() |
||
虚拟专用数据库 (VPD) 使您可以控制数据库用户和非数据库用户(应用程序或最终用户)对表的列和行的访问。
在根据用户对表行进行访问控制的同时,还可以根据每个策略控制表的某列或某些列是否显示。可以对每个敏感列或一组敏感列实施一个 VPD 策略。如果不同的用户组对不同的列集合敏感,则需对每个列集合实施一个 VPD 策略。然而,如果向一个表附加了多个 VPD 策略,则这些策略将平等执行,其结果是这些策略相与运算的结果。在本示例中,仅执行一个策略。要控制执行哪个策略,需要实施“驱动应用程序上下文”。
本教程的目的是演示:
大约 1 小时。
在本教程中,您将执行以下任务:
以下为软件要求列表:
开始本教程之前,您应该:
. |
安装 Oracle Database 11g 第 2 版。 |
|---|---|
. |
将 vpd_groups.zip 文件下载并解压缩到您选择的目录中。 |
. |
打开浏览器并输入相应的 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 用户创建成功。
|
. |
在 Users 页面上,单击 Create。
|
|---|---|
. |
在 Name 域中输入 sec_admin。指定口令。使用手电筒图标选择默认表空间和临时表空间。单击 System Privileges 选项卡。
|
. |
单击 Edit List。
|
. |
在 Available System Privileges 列表中使用滚动条定位到 CREATE ANY CONTEXT。单击 Move。对 CREATE PROCEDURE 和 SELECT 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。
|
. |
以 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。
|
. |
您会收到一条消息,确认策略组创建成功。
|
. |
在 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)
|
. |
您会收到一条消息,确认函数创建成功。单击 Database 选项卡返回 Database Home 页面。
|
要向策略组添加策略,执行以下步骤:
. |
在 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_B 和 DATE_B。单击 Select。
|
. |
返回 Add Policy 页面。单击 Continue。
|
. |
在 Manage Policy Group:PROVIDER_A_GROUP 页面中,单击 OK。
|
. |
您会收到一条消息,确认策略组已成功修改。
|
. |
选择 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_A 和 DATE_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 单击 OK。
|
. |
您会收到一条确认消息。
|
. |
在 Object Type 菜单中选择 Package Body,然后单击 Create。
|
. |
在 Name 域中输入 provider_package。将以下文本复制并粘贴到 Source 域中。 AS 单击 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 权限,执行以下步骤:
. |
在 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_A 和 DATE_A 列的值。
|
. |
执行 exec_pkg_b.sql 脚本。该脚本将上下文切换到 provider_b,然后基于上下文执行 PROViDER_PACKAGE.SET_PROVIDER_CONTEXT 过程来设置策略组。最后,对 RFID_DATA 表执行查询。注意,因为应用了 provider_b,因此只显示 STORAGE_B 和 DATE_B 列的值。
|
. |
退出 SQL*Plus。
|
在本教程中,您学习了如何:
致谢
![]()
|
|
关于 Oracle | |