使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战指南)

上篇介绍了AI时代下数据安全的重要性,本篇笔者将基于 Oracle 官方提供的 HR Demo,动手实践 Real Application Security(RAS)的全流程。帮助大家更直观的理解 RAS 的核心机制。


01 | 先搞清楚:什么是 Oracle RAS?

RAS(Real Application Security)是 Oracle 推出的安全框架,它允许你在数据库层面管理"应用用户"的权限,而不仅仅是"数据库用户"。

如果想了解更多RAS的说明和其在AI时代的必要性,可直接参考上篇文章《Oracle RAS:AI时代企业数据安全核心》。


02 | Demo 环境准备(官方脚本一步到位)

Oracle 官方提供了一系列脚本,你可以按顺序运行来快速完成整个 Demo:

  • hrdemo_setup.sql
    • 创建数据库角色(例如 DB_EMP
    • 创建应用角色(如 employeeit_engineerhr_representative
    • 创建应用用户(如 DAUSTINSMAVRIS
    • 创建安全类、安全策略和 ACL
    • 将安全策略应用到 HR.EMPLOYEES 表上
  • hrdemo.sql
    • 运行演示脚本,直接使用应用用户登录数据库 查看 RAS 效果
  • hrdemo_session.sql
    • 使用 Session API 演示如何通过中间层管理 RAS 会话
  • hrdemo.java
    • Java 示例代码演示在应用层如何联合 RAS 查询数据
  • hrdemo_clean.sql
    • 清理所有 Demo 对象,回到最初状态
  • 上述各脚本完整内容可直接参考官方文档:

我们只需按照顺序运行这些脚本,就是一个完整的 RAS 上手实践。

笔者自己测试时发现一些小问题,会在具体地方贴出来供大家参考,避免重复踩坑。

  • 避坑1:RAS这套脚本执行前提是你的库中存在hr这个示例schema,很多小伙伴会发现自己新版本的Oracle下不再有示例schema,而且也没安装脚本,此时就需要单独下载 Sample Schemas,解压到任意目录(当然也可以遵循历史放到$ORACLE_HOME/demo/schema下),然后切换成你的PDB下,执行其中的 HR 脚本 @hr_install.sql
  • 避坑2:RAS这套脚本没有考虑多租户的情况,目前都是多租户环境,所以脚本中所有关于数据库连接的地方都需要修改@pdb_service_name,并测试能连接到期望的PDB。此外,sys认证保留脚本中的密码认证模式,不要自作聪明的改成os认证模式,因为有些脚本会多次切换连接,比如当从sys切换到普通用户后,就无法再成功切回sys,连接会报错。

03 | 直连方式验证 RAS(hrdemo.sql)

① 为什么要看"直连效果"?

直连模式是最简单的验证方式,用它能证明:

  • RAS 会在数据库层自动判断权限
  • 不同应用用户即使登录同一模式,也会看到不同的数据结果

② DAUSTIN:IT 员工的权限表现

  • 连接方式:conn daustin/welcome1@alfred;
  • 角色: employee + it_engineer
  • 结果:
    • 能看到 IT 部门所有员工行
    • 只有自己的 SALARY 可见
    • 不能更新任何记录

这个结果证明:即便 DAUSTIN 是通过直接登录数据库看到表,他的权限依旧受 RAS 策略控制,而不是数据库权限控制

  • 避坑3:测试发现sample数据中employees这张表中压根就没有这两个用户,估计笔者用到的版本和写官方文档的人不一致,如果你也遇到这样的问题,别改RAS的示例脚本,笔者这里直接插入两条记录(需要注意,原表107条记录,插入后全表记录变成109条,要知晓这个变化,因为脚本中有标识对比表中记录数的地方,如果实在不想增加记录,也可以选择update两条原表记录)。
SQL 复制代码
--IT
INSERT INTO employees VALUES
      ( 1001
      , 'David'
      , 'Austin'
      , 'DAUSTIN'
      , '1.590.555.0105'
      , TO_DATE('01-01-2026', 'dd-MM-yyyy')
      , 'IT_PROG'
      , 4800
      , NULL
      , 103
      , 60
      );
--HR
 INSERT INTO employees VALUES
      ( 1002
      , 'Susan'
      , 'Mavris'
      , 'SMAVRIS'
      , '1.515.555.0168'
      , TO_DATE('01-01-2026', 'dd-MM-yyyy')
      , 'HR_REP'
      , 6500
      , NULL
      , 101
      , 40
      );

commit;

04 | HR 代表 SMAVRIS:全表全列权限

我们继续使用直连方式验证 RAS,这次换成SMAVRIS这个应用用户。

① 登录演示

  • conn smavris/welcome1@alfred;
  • 角色:employee + hr_representative

② 查询效果

  • 全表所有员工都能看到
  • SALARY 列完整显示
  • 可以更新任意一条记录

这个演示说明了:应用用户 SMAVRIS 拥有完整的表访问权限,并且 RAS 自动应用权限策略,而不是依赖她的数据库账号级权限来控制

Tips:这里看到截图一定有小伙伴会觉得困惑,这个conn直连感觉上不就是数据库的用户吗?

其实不是的,上面使用的DAUSTINSMAVRIS都属于应用用户,并不是数据库传统用户,有疑惑可以看官方DEMO最开始RAS初始化脚本中,这两个用户的创建是通过sys.xs_principal.create_user来完成的。


05 | 中间层仿真:Session API(hrdemo_session.sql)

在现实业务中,我们通常不会让业务用户直接登录数据库,而是让中间层应用维护一个连接池。RAS 提供了 Session API 来支持这种场景:

① Session 是什么?

一个 RAS Session 表示业务用户在线的身份环境,它绑定真实的数据库连接,使后续 SQL 执行按照这个业务用户的安全策略执行。

② Session API 的执行顺序

  1. 使用 session 管理员账号(如 hr_session)创建 RAS 会话
  2. 将会话挂载到当前数据库连接(attach)
  3. 当做这个应用用户来执行 SQL
  4. 执行完成后 detach 并 destroy
  5. 下次再 attach 到其他库连接上也能继续保持业务上下文

③ Session API 结果验证

示例中验证:

  • 当前 RAS 会话的用户名是 SMAVRIS(可通过 xs_sys_context('xs$session','username') 查询)
  • 会话启用角色时能看到全表
  • 禁用 hr_representative 角色后,只能看到自己的记录
  • 重新启用后恢复权限

这个步骤说明了:一个数据库连接可以托管多个业务用户权限上下文,而不会互相干扰


06 | Java 示例程序(hrdemo.java)

除了 SQL 脚本,Oracle 官方还提供了 Java Demo,用于演示如何在真实应用层联动 RAS:

  • Dispatcher 负责创建和管理 RAS sessions
  • Application 连接使用普通账号查询数据
  • 代码层通过 RAS 提供的接口判断:
    • 哪些列可见(如 SALARY 是否可见)
    • 当前业务用户是否有某些 ACL 权限

这意味着应用程序不需要托管一堆数据库用户账号,只要统一使用一个连接账号,通过 RAS Session 管理就能识别不同的用户身份和权限。

  • 避坑4:这里官方文档也没写执行java程序相关的步骤,笔者没有java工作经验,因此直接跟AI学习下,得到一些指导,跑通这部分测试,给同样困惑的小伙伴参考:

首先要跑这段java程序,至少需要 这两个 jar:

Jar 作用
ojdbc8.jar JDBC 驱动
xs.jar RAS Java API

具体位置在:

  • $ORACLE_HOME/jdbc/lib/ojdbc8.jar
  • $ORACLE_HOME/rdbms/jlib/xs.jar

为了方便拷贝到同一个ras目录下,然后执行:

BASH 复制代码
javac -cp ".:ojdbc8.jar:xs.jar" hrdemo.java

编译成功得到 hrdemo.class 文件后,执行java程序,注意要指定正确的数据库信息

BASH 复制代码
java -cp ".:ojdbc8.jar:xs.jar" hrdemo jdbc:oracle:thin:@//localhost:1522/alfred

Tips:目前整个demo演示已完成,最后可以根据实际所需来选择是否通过 hrdemo_clean.sql 恢复到RAS实验前的环境,这里不再赘述。

07 | 后记

其实RAS按照这个DEMO执行是比较简单的,但是如果根据实际需求去修改脚本内容配置时,就会发现RAS这种命令行的配置方式,还是有些门槛的,比如DEMO中的第一个setup脚本,就包含了这5个部分,需要先捋清楚这些概念之间的关系,才能更好的对应上自己的需求进行个性化的修订。

-- 1. SETUP - User and Roles

-- 2. SETUP - Security class and ACL

-- 3. SETUP - Data security policy

-- 4. SETUP - Validate the objects we have set up.

-- 5. SETUP - Mid-Tier related configuration.

相关推荐
渐暖°3 小时前
JDBC直连ORACLE进行查询
数据库·oracle
尋有緣4 小时前
力扣1355-活动参与者
大数据·数据库·leetcode·oracle·数据库开发
木风小助理6 小时前
三大删除命令:MySQL 核心用法解析
数据库·oracle
yumgpkpm7 小时前
AI评判:信创替代对Cloudera CDH CDP Hadoop大数据平台有何影响?
大数据·hive·oracle·flink·kafka·hbase·cloudera
曹牧7 小时前
Oracle:大量数据删除
数据库·oracle
问今域中10 小时前
Spring Security登录认证
数据库·sql·oracle
曹牧12 小时前
Oracle 大表数据分区存储
数据库·oracle
曹牧13 小时前
Oracle:单一索引和联合索引
数据库·oracle
独角鲸网络安全实验室13 小时前
CVE-2025-61882深度分析:Oracle Concurrent Processing BI Publisher集成远程接管漏洞的技术原理与防御策略
数据库·网络安全·oracle·漏洞·ebs·cve-2025-61882·xml 注入
Leon-Ning Liu13 小时前
Oracle 自动统计信息收集任务:维护窗口创建与删除
数据库·oracle