|
技术说明
在 Oracle HTML DB 应用程序中使用虚拟专用数据库 作者:Scott Spendolini(产品经理)、Sergio Leunissen(高级产品经理)和 David Knox(总工程师) 发布日期:2004 年 10 月
确保应用程序的安全首先是在数据库级应用相应的访问控制规则。Oracle 数据库帮助您实现访问控制规则的方法之一是细粒度访问 (FGA) 控制或虚拟专用数据库 (VPD)。本文将介绍在 Oracle HTML DB 中开发的应用程序如何利用此特性。
VPD 使您能够基于在 PL/SQL 函数中实现的安全策略限制对记录的访问。PL/SQL 函数基于安全管理员定义的条件构造 WHERE 子句。该函数随后通过内置的 DBMS_RLS 程序包在要保护的表或视图中注册。针对受保护的表或视图发出查询时,VPD 才策略函数返回的字符串附加到原始 SQL 语句上。
此技术说明介绍了一个在 HTML DB 应用程序中使用 VPD 策略的示例,并假设您拥有对您自己数据库的 SQL*Plus 访问权限。
所需软件
设置安全管理模式
首先,我们将创建两个模式;一个模式将作为我们的安全模式,另一个模式将作为我们的数据模式。第一个模式将由安全管理员使用,他的工作是为应用程序和数据模式提供安全保障。请注意,SYS 用户必须授予此模式对 DBMS_RLS 程序包的执行权限。
创建安全管理员的模式:
CREATE USER vpd_admin IDENTIFIED BY
akf7d98s2 DEFAULT
TABLESPACE users TEMPORARY TABLESPACE temp
- 通过执行以下语句,授予执行本技术说明中的步骤所必需的权限:
GRANT CREATE SESSION TO vpd_admin;
GRANT CREATE PROCEDURE TO vpd_admin<>;
- 以 SYS 的身份连接,并授予安全管理员注册 VPD 策略所必需的权限:
GRANT EXECUTE ON DBMS_RLS TO vpd_admin;
设置数据模式 接下来,我们将创建存储数据的模式。虽然不必将实现 VPD 策略所需的 PL/SQL 和权限另外存储到保存数据的模式之外,但它却是一个不错的做法。我们将在 DATA_SCHEMA 的内创建 SCOTT.EMP 表的副本。出于测试目的,需要将新建 emp 表的 SELECT 权限授予 SCOTT。
创建数据模式:
CREATE USER data_schema
IDENTIFIED BY laskjdf098ksdaf09
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
- 通过执行以下语句,授予允许 DATA_SCHEMA 创建表所必需的权限:
GRANT CREATE TABLE TO
data_schema;
ALTER USER data_schema QUOTA 1
m ON "USERS";
CREATE TABLE data_schema.emp AS SELECT * FROM scott.emp;
- 为了测试,授予 SCOTT 模式 SELECT 权限:
GRANT SELECT ON data_schema.emp TO scott;
创建策略函数 接下来,我们将以安全管理员的身份定义访问策略。此策略函数将返回的记录限制为运行查询的用户有权使用的记录。执行调用的用户可能是数据库用户或 Oracle HTML DB 应用程序用户。该函数通过将用户名与 ENAME 列中的值匹配来执行此操作。稍后,我们将看到此代码如何满足 Oracle HTML DB 应用程序中的安全要求。
创建策略函数:
- 以安全管理员用户 VPD_ADMIN 的身份连接:
connect vpd_admin/akf7d98s2
CREATE OR REPLACE FUNCTION user_only (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
RETURN 'ename = nvl(v(''APP_USER''),USER)';
END;
/
注册策略函数 请注意,对策略函数的 EXECUTE 权限故意没授予任何人。数据库将代表用户执行此函数。现在,我们需要注册此函数,以便每当对 EMP 表运行查询时均应用此函数。通过以安全管理员的身份调用 DBMS_RLS 程序包来进行注册。
- 要注册此策略函数,以 VPD_ADMIN 的身份执行以下语句:
BEGIN
DBMS_RLS.add_policy
(object_schema => 'data_schema',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
function_schema => 'vpd_admin',
policy_function => 'USER_ONLY',
statement_types => 'SELECT');
END;
/
以上创建的策略规定,对 DATA_SCHEMA 模式中的 EMP 表所执行的任何 SELECT 语句都将使数据库执行位于 VPD_ADMIN 模式中的 USER_ONLY 函数。USER_ONLY 函数返回的字符串将被附加到最初运行的查询上。
在 SQL*Plus 中测试策略函数
我们可以通过 SQL*Plus 登录到 SCOTT 模式来测试 VPD 策略。透明地重写对表的查询,且将结果限制为只包含 SCOTT 的记录。
测试策略函数:
connect scott/tiger
SELECT empno, ename, job, sal
FROM data_schema.emp;
您将看到以下结果:
EMPNO ENAME JOB SAL
---------- ---------- --------- ----------
7788 SCOTT ANALYST 3000
由于数据库在应用 VPD 策略后执行了以下查询,因此只返回一行:
SELECT empno, ename, job, sal
FROM data_schema.emp
WHERE ename = nvl(v('APP_USER'),USER)
我们稍后将介绍 v('APP_USER') 的含义。此处只需说明一点就够了,那就是当在 Oracle HTML DB 的外部运行此查询时,函数 v('APP_USER') 返回 NULL,因此 ename 与每一行的 USER 的值匹配。
在 Oracle HTML DB 应用程序中测试策略函数
要在 Oracle HTML DB 应用程序中测试新创建的策略函数,我们将基于 DATA_SCHEMA.emp 表快速创建一个报表。首先,我们需要创建能够访问 DATA_SCHEMA 模式的工作区。
创建工作区:
- 以 Oracle HTML DB 服务管理员的身份使用如下所示的 URL 登录:
http://your_server.com/pls/some_dad/htmldb_admin
在 Manage Workspaces 下,单击 Create New Workspace。
输入 Workspace Name 并单击 Next。
选择 Re-use an existing schema,然后为 Schema Name 输入 DATA_SCHEMA。
单击 Next。
在 Administrator Username 域中,输入 admin。
在 Password 域中输入口令。
在 Email 域中,输入电子邮件地址。
单击 Next。
复查您的选择,然后单击 Provision。
现在,我们可以开发人员的身份登录新建的工作区。
登录工作区:
- 单击该页面右上角的 Logout 图标。
- 单击 Login 链接。
- 输入 Workspace Name、Username 和刚刚创建的 Password,然后单击 Login。
您现在应看到“Welcome to HTML DB”屏幕,其中包含 Application Builder、SQL Workshop、Data Workshop 和 Administration 的图标。在 Oracle HTML DB 应用程序中测试 VPD 策略的最快速方法是在现有 EMP 表中创建一个策略。
快速创建应用程序:
- 单击 Create Application。
- 选择 Based on Existing Tables。
- 单击 Next >。
- 选择 DATA_SCHEMA 作为 Table/View Owner。
- 单击 Next >
- 在 Table/View Names 下的第一个域段中,输入 EMP。
- 单击 Next >。
- 单击 Finish 创建应用程序。
- 单击 Run Application 运行应用程序。
- 使用用户名 admin 以及在创建工作区时选择的口令登录。
- 单击 Report and Edit 下的 Emp 链接;您应收到“No Data Found”消息。
该策略再次应用于使用 EMP 表的 SELECT 语句,当您以应用程序用户 admin 的身份登录时,由于 VPD 策略的作用,将不返回任何行。
要使此报表中返回的数据与我们在 SQL*Plus 中看到的数据相同,我们必须创建应用程序用户 SCOTT。默认情况下,使用应用程序向导创建的应用程序使用 Oracle HTML DB 身份验证(基于与应用程序所属的工作区关联的用户库)。我们可以使用工作区管理工具创建一个新用户。
请注意,我们将在此处创建一个应用程序用户,而非数据库模式。Oracle HTML DB 使您能够在所需的任意位置(包括 LDAP 库或一次性登录)灵活地维护应用程序用户。对于本演示,我们将一直使用 Oracle HTML DB 提供的身份验证机制。
在工作区中创建新应用程序用户:
- 当应用程序运行时,单击页面底部的 Edit Application。
- 在 Tasks 区域下,单击 Manage Developers,然后单击 Create >。
- 创建名为 SCOTT 的用户,指定一个口令和有效的电子邮件地址,然后单击 Create User。
- 单击导航栏中的 Build 图标,然后单击 Run。
- 单击 Logout 链接,然后以刚刚创建的 SCOTT 用户的身份重新登录。
- 单击 Report and Edit 下的 Emp 链接;您现在应看到一行。
请注意如何在无论是直接从 SQL*PLUS 还是通过 Oracle HTML DB 应用程序中的报表访问数据的情况下应用同一策略。
有关 VPD 函数中的函数调用 v('APP_USER') 的更多信息。APP_USER 是一个内置的会话状态变量,它始终包含当前运行 Oracle HTML DB 应用程序的用户的用户名,无论如何对该用户进行身份验证。为确保 VPD 策略按照所需的方式在 SQL*Plus 和 Oracle HTML DB 应用程序内部工作,我们在 v('APP_USER') 函数周围使用了 NVL。
到此,您就在 HTML DB 应用程序中实现了 VPD 策略。
|