技术说明

在 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 程序包的执行权限。

创建安全管理员的模式:

  • 以 SYSTEM 的身份连接
  • 执行以下语句:
  • 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。

创建数据模式:

  • 以 SYSTEM 的身份连接并执行以下语句:
  • 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";
    
  • 基于 SCOTT.EMP 的副本创建表:
  • 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 的记录。

测试策略函数:

  • 以 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 NameUsername 和刚刚创建的 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 策略。

寄送此页面
Printer View 打印机视图