找回密码
 立即注册
首页 业界区 业界 使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战 ...

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

澹台吉星 前天 22:35
上篇介绍了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)
    • 创建应用角色(如 employee、it_engineer、hr_representative)
    • 创建应用用户(如 DAUSTIN、SMAVRIS)
    • 创建安全类、安全策略和 ACL
    • 将安全策略应用到 HR.EMPLOYEES 表上

  • hrdemo.sql

    • 运行演示脚本,直接使用应用用户登录数据库 查看 RAS 效果

  • hrdemo_session.sql

    • 使用 Session API 演示如何通过中间层管理 RAS 会话

  • hrdemo.java

    • Java 示例代码演示在应用层如何联合 RAS 查询数据

  • hrdemo_clean.sql

    • 清理所有 Demo 对象,回到最初状态

  • 上述各脚本完整内容可直接参考官方文档:

    • https://docs.oracle.com/en/database/oracle/oracle-database/19/dbfsg/real-application-security-hr-demo-files.html

我们只需按照顺序运行这些脚本,就是一个完整的 RAS 上手实践。
笔者自己测试时发现一些小问题,会在具体地方贴出来供大家参考,避免重复踩坑。

  • 避坑1:RAS这套脚本执行前提是你的库中存在hr这个示例schema,很多小伙伴会发现自己新版本的Oracle下不再有示例schema,而且也没安装脚本,此时就需要单独下载 Sample Schemas,解压到任意目录(当然也可以遵循历史放到$ORACLE_HOME/demo/schema下),然后切换成你的PDB下,执行其中的 HR 脚本 @hr_install.sql。
1.jpeg


  • 避坑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 可见
    • 不能更新任何记录

2.jpeg

3.jpeg

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

  • 避坑3:测试发现sample数据中employees这张表中压根就没有这两个用户,估计笔者用到的版本和写官方文档的人不一致,如果你也遇到这样的问题,别改RAS的示例脚本,笔者这里直接插入两条记录(需要注意,原表107条记录,插入后全表记录变成109条,要知晓这个变化,因为脚本中有标识对比表中记录数的地方,如果实在不想增加记录,也可以选择update两条原表记录)。
  1. --IT
  2. INSERT INTO employees VALUES
  3.       ( 1001
  4.       , 'David'
  5.       , 'Austin'
  6.       , 'DAUSTIN'
  7.       , '1.590.555.0105'
  8.       , TO_DATE('01-01-2026', 'dd-MM-yyyy')
  9.       , 'IT_PROG'
  10.       , 4800
  11.       , NULL
  12.       , 103
  13.       , 60
  14.       );
  15. --HR
  16. INSERT INTO employees VALUES
  17.       ( 1002
  18.       , 'Susan'
  19.       , 'Mavris'
  20.       , 'SMAVRIS'
  21.       , '1.515.555.0168'
  22.       , TO_DATE('01-01-2026', 'dd-MM-yyyy')
  23.       , 'HR_REP'
  24.       , 6500
  25.       , NULL
  26.       , 101
  27.       , 40
  28.       );
  29. commit;
复制代码
04 | HR 代表 SMAVRIS:全表全列权限

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


  • conn smavris/welcome1@alfred;
  • 角色:employee + hr_representative
② 查询效果


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

这个演示说明了:应用用户 SMAVRIS 拥有完整的表访问权限,并且 RAS 自动应用权限策略,而不是依赖她的数据库账号级权限来控制
Tips:这里看到截图一定有小伙伴会觉得困惑,这个conn直连感觉上不就是数据库的用户吗?
其实不是的,上面使用的DAUSTIN、SMAVRIS都属于应用用户,并不是数据库传统用户,有疑惑可以看官方DEMO最开始RAS初始化脚本中,这两个用户的创建是通过sys.xs_principal.create_user来完成的。
05 | 中间层仿真:Session API(hrdemo_session.sql)

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

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


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

示例中验证:

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

这个步骤说明了:一个数据库连接可以托管多个业务用户权限上下文,而不会互相干扰
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.jarJDBC 驱动xs.jarRAS Java API具体位置在:

  • $ORACLE_HOME/jdbc/lib/ojdbc8.jar
  • $ORACLE_HOME/rdbms/jlib/xs.jar
为了方便拷贝到同一个ras目录下,然后执行:
  1. javac -cp ".:ojdbc8.jar:xs.jar" hrdemo.java
复制代码
编译成功得到 hrdemo.class 文件后,执行java程序,注意要指定正确的数据库信息
  1. java -cp ".:ojdbc8.jar:xs.jar" hrdemo jdbc:oracle:thin:@//localhost:1522/alfred
复制代码
6.jpeg

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.

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册