惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
Recorded Future
Recorded Future
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
GbyAI
GbyAI
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
腾讯CDC
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
月光博客
月光博客
博客园_首页
C
Check Point Blog
宝玉的分享
宝玉的分享
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tenable Blog
Vercel News
Vercel News
SecWiki News
SecWiki News
Security Latest
Security Latest
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
Y
Y Combinator Blog
U
Unit 42
The Register - Security
The Register - Security
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
WordPress大学
WordPress大学
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
Jina AI
Jina AI

博客园 - AlfredZhao

impdp 遇到 TSTZ Version 报错:ORA-39405 处理实践 数据乱成一锅粥,还能先做本体吗? SQL*Plus 执行中文 SQL 文件,如何避开乱码坑 Podman 报错:普通用户无法运行 rootless Podman 怎么办 语义层构建:企业级AI落地绕不开的关键 AI时代最扎心的真相:人类在打杂,AI在做决策 Win7老系统登录报错怎么解?PuTTY这次真能救急 Linux 主机防火墙如何同时开启 80 和 443? AI 编程变更记录:知识加工模块与博客工厂模块的状态重新定义 一篇搞定:用 curl 测试私有部署模型联通性 DBA除了修库,还能把经验变成更大的价值 原本3GB+ 的 Docker 镜像直接缩成500M RAG技术从1.0到4.0,系统为何越来越“会想” 生产环境里,为什么不建议把普通端口直接暴露到公网? ORACLE默默地搞了个免费的智能体工厂 GPT 省钱,不是别用最新模型,而是别浪费缓存 Docker 容器时区不对,`timedatectl` 不存在怎么办? AI 编程工作总结:从体验问题到模块能力建设 OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G? vi 删除指定范围的行,不用再反复按 dd AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板 氛围编程实战系列:先规划清楚学习路径 入门:我的第一个Vibe Coding实践程序 Linux时区修改为CST 如何在Oracle Agent Factory中配置国内厂商的LLM? Oracle Deep Data Security (Deep Sec) 初体验 APEX实战第13篇:全套开发环境的本地配置与恢复实践 Codex 和 OpenClaw,到底差在哪? 微信对接OpenClaw的常见问题和解决方案 在群晖NAS上配置OpenClaw:一次踩坑后的保姆级教程(完整修订版) 用Docker安全驯服OpenClaw,并打通社交软件 RAG 时代的“破壁人”:为什么你的大模型应用急需 Docling? 为什么 AI 服务器首选 Ubuntu?难道 OEL 和 RHEL 不香吗? APEX实战第12篇:Oracle APEX 工作区密码忘记了怎么办? AI开发者如何无痛部署Oracle AI Database 26ai环境 Oracle 26ai 本地通用版这次是真的来了 Docker 快速入门:手把手教你打包 Python 应用 APEX实战第11篇:图形界面轻松解锁工作区账户 APEX实战第10篇:手把手教你给APEX打补丁 APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全 小白学AI开发01:创建第一个示例Agent LangChain、LangFlow、LangGraph:一文讲清三大 LLM 框架的定位与差异 Oracle RAS:AI时代企业数据安全核心 新版MOS(My Oracle Support)主要变化 APEX实战第8篇:ORDS连库报错574?一招根治用户过期问题 为什么 Iceberg 在数据湖领域这么火
使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战指南)
AlfredZhao · 2026-01-07 · via 博客园 - AlfredZhao

上篇介绍了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两条原表记录)。
--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目录下,然后执行:

javac -cp ".:ojdbc8.jar:xs.jar" hrdemo.java

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

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.