使用 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.

相关推荐
jnrjian3 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
TTc_3 天前
oracle中的union和union all有什么区别?
数据库·oracle
山峰哥3 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
南 阳3 天前
Python从入门到精通day37
数据库·python·oracle
轩情吖3 天前
MySQL库的操作
android·数据库·mysql·oracle·字符集·数据库操作·编码集
脱发的老袁3 天前
【数据库】Oracle手动清理归档日志
数据库·oracle
jnrjian3 天前
Oracle 共享池 库缓存下的 Library Cache Lock
数据库·缓存·oracle
新缸中之脑4 天前
在Reddit上探索未满足的需求
数据库·oracle
light blue bird4 天前
产线多并发客户端指令操作场景组件
jvm·oracle·.net·winform
坐吃山猪4 天前
Neo4j04_数据库事务
数据库·oracle·neo4j