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

推荐订阅源

K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - Franky
V
V2EX
Last Week in AI
Last Week in AI
H
Help Net Security
J
Java Code Geeks
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
月光博客
月光博客
腾讯CDC
小众软件
小众软件
罗磊的独立博客
D
Docker
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
博客园 - 叶小钗
F
Full Disclosure
Recent Announcements
Recent Announcements
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LangChain Blog
T
The Exploit Database - CXSecurity.com
宝玉的分享
宝玉的分享
美团技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 热门话题
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Securelist
Latest news
Latest news
Project Zero
Project Zero
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
K
Kaspersky official blog
O
OpenAI News
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
爱范儿
爱范儿
B
Blog RSS Feed
U
Unit 42

博客园 - 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? 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 官方 HR Demo 快速验证 RAS 功能(小白实战指南) Oracle RAS:AI时代企业数据安全核心 新版MOS(My Oracle Support)主要变化 APEX实战第8篇:ORDS连库报错574?一招根治用户过期问题 为什么 Iceberg 在数据湖领域这么火
Oracle Deep Data Security (Deep Sec) 初体验
AlfredZhao · 2026-05-13 · via 博客园 - AlfredZhao

关于数据安全,之前介绍过的 Oracle RAS 虽然强大,但规则定义还是太复杂,如今 Oracle 推出的 Deep Data Security (Deep Sec) 重新定义了AI智能体时代的数据安全玩法,不但继承了RAS的核心功能,而且其提供的直接使用声明式SQL来配置的方法,也让AI时代的数据安全从此变得既简单又可控。

01 | 前提条件:Oracle AI Database 需升级到23.26.2

因为 Deep Sec 是在 23.26.2 引入的新功能,所以软件版本要求 Oracle AI Database (23.26.2 or later),目前这个RU已经可以在MOS下载到了。

笔者目前的测试环境还是23.26.1,所以需要下载应用这个补丁:

  • Patch 39093711: DATABASE RELEASE UPDATE 23.26.2.0.0

注意:readme中建议用于应用补丁的opatch建议在12.2.0.1.49或以上,执行下面命令查询opatch版本,如果你的opatch版本也不符合要求,可以通过搜索 6880880 下载最新的opatch版本。

$ $ORACLE_HOME/OPatch/opatch version

笔者的opatch版本不满足需求,所以选择下载最新的opatch版本:

OPatch比较小,下载后的文件名为:

  • p6880880_230000_Linux-x86-64.zip

然后我们更新opatch,再用新的opatch应用23.26.2的补丁,直接按照readme操作即可。考虑到如今AI时代下,数据库的使用者自身未必都有DBA经验,也未必能找到DBA帮忙,且这种基础环境的操作还是不太建议全权交给AI(因为不同版本补丁是可能有细微差异的,AI可能出错),最终需要真人来确认复核比较稳妥,所以这里列下笔者操作的关键命令参考,完整细节还是参考readme仔细核对:

首先,备份之前的OPatch,解压新的OPatch,确认已成功替换新的opatch版本,操作如下:

[oracle@alfred-aibs-db ~]$ cd $ORACLE_HOME
[oracle@alfred-aibs-db dbhome_1]$ mv OPatch OPatch_bak
[oracle@alfred-aibs-db dbhome_1]$ unzip /u01/media/p6880880_230000_Linux-x86-64.zip 
[oracle@alfred-aibs-db dbhome_1]$ $ORACLE_HOME/OPatch/opatch version
OPatch Version: 12.2.0.1.51

OPatch succeeded.

确认opatch版本已经是目前最新的 OPatch Version: 12.2.0.1.51。

然后使用这个opatch来应用补丁,按照补丁包中的readme说明操作即可,有些参数readme可能忘记标明了,手工根据实际情况,补上即可,笔者环境执行相关命令如下:

unzip p39093711_230000_Linux-x86-64.zip
cd 39093711
$ORACLE_HOME/OPatch/opatch prereq CheckMinimumOPatchVersion -ph /u01/media/39093711
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /u01/media/39093711

确认这些预检查都正常验证通过:

笔者这里单实例,需要停止数据库和监听:

If this is not an Oracle RAC environment, shut down all instances and listeners associated with the Oracle home that you are updating. For more information, see Oracle AI Database Administrator's Guide.

[oracle@alfred-aibs-db 39093711]$ lsnrctl stop
[oracle@alfred-aibs-db 39093711]$ sqlplus / as sysdba
SQL> shutdown immediate;

确认正常关闭后,然后应用补丁:

$ cd /u01/media/39093711
$ $ORACLE_HOME/OPatch/opatch apply

碰到交互式确认的地方,选择y即可,基本都是问你是否确认执行,是否已关闭数据库并准备好打补丁了。

耐心等个几分钟,补丁就应用好了:

下一步继续按readme执行,启库,执行datapatch,这一过程又需要再等几分钟:

[oracle@alfred-aibs-db 39093711]$ sqlplus / as sysdba
SQL> startup
SQL> alter pluggable database all open;
SQL> quit
[oracle@alfred-aibs-db OPatch]$ ./datapatch -sanity_checks
[oracle@alfred-aibs-db OPatch]$ ./datapatch -verbose

执行完成后检查日志有无报错,可以跑下utlrp这个重新编译无效对象:

[oracle@alfred-aibs-db OPatch]$ export PATH=$PATH:$ORACLE_HOME/bin
[oracle@alfred-aibs-db OPatch]$ cd $ORACLE_HOME/rdbms/admin
[oracle@alfred-aibs-db admin]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -n 1 -e -b utlrp -d $ORACLE_HOME/rdbms/admin utlrp.sql

确认已升级成功23.26.2:

最后启动下监听,恢复对外服务。

[oracle@alfred-aibs-db admin]$ lsnrctl start

02 | 测试验证Deep Sec的功能效果

本文测试验证当没有IAM集成的场景下,如何利用 Local End User 配置 Deep Sec 的功能,并验证效果:

参考官方文档link:

① 构造最小示例数据

-- 笔者本次测试用到的PDB:orclpdb1
ALTER SESSION SET CONTAINER = orclpdb1;

-- Create the HR user
-- 注:这里是创建一个“没有密码、无法直接登录”的模式(Schema)用户 HR
CREATE USER hr NO AUTHENTICATION
  DEFAULT TABLESPACE users
  QUOTA UNLIMITED ON users;
 
-- Create the employees table
CREATE TABLE hr.employees (
    employee_id   NUMBER PRIMARY KEY,
    first_name    VARCHAR2(50),
    last_name     VARCHAR2(50),
    email         VARCHAR2(128),
    manager       VARCHAR2(128),
    ssn           VARCHAR2(20),
    salary        NUMBER(10,2),
    phone         VARCHAR2(20)
);

-- 插入示例数据
INSERT INTO hr.employees VALUES
  (100, 'Victoria', 'Williams', 'vwilliams',
   NULL, '219-09-9999', 13000, '555-0100');
 
INSERT INTO hr.employees VALUES
  (200, 'Marvin', 'Anderson', 'manderson',
   'vwilliams', '457-55-5462', 12030, '555-0200');
 
INSERT INTO hr.employees VALUES
  (300, 'Chris', 'Evans', 'cevans',
   'vwilliams', '321-12-4567', 6900, '555-0300');
 
INSERT INTO hr.employees VALUES
  (400, 'Emma', 'Baker', 'ebaker',
   'manderson', '733-02-9821', 8200, '555-0400');
 
INSERT INTO hr.employees VALUES
  (500, 'Taylor', 'Mills', 'tmills',
   'manderson', '558-76-1243', 9000, '555-0500');
 
COMMIT;

示例数据准备好是这样,全表只有5行数据,以方便读者更直观的看到演示效果:

② 创建Local End Users

注意这里的 End User 不是传统意义上的数据库用户。

CREATE END USER "manderson" IDENTIFIED BY "Test_20260513";
CREATE END USER "ebaker" IDENTIFIED BY "Test_20260513";

虽然上面的SQL是在数据库中执行,但其本质区别是这种 End User 用户并没有自己的schema,没有任何的数据库对象实体。只是用于细粒度数据访问:

They receive fine-grained data access through data grants assigned to their data roles.

当一个 End User 登录到数据库,

ORA_END_USER_CONTEXT.username returns their user name.
The data grants in this chapter use predicates that compare this value against the email and manager columns of the hr.employees table. For the predicates to match, the local end-user names you create must match the values stored in those columns.

③ 配置Data Roles

注意这里创建的 Data Role 目前只赋予了连接会话的权限:

-- Create data roles that are managed locally in the database
CREATE DATA ROLE employee_role;
CREATE DATA ROLE manager_role;
 
-- Create a standard database role for connection privileges
CREATE ROLE db_role;
GRANT CREATE SESSION TO db_role;
 
-- Grant the connection privileges to the data role used for direct logon
GRANT db_role TO employee_role;
GRANT db_role TO manager_role;

将上面创建好的 Data Role 再赋给对应的终端用户:
终端用户 manderson 拥有两个 Data Role
终端用户 ebaker 拥有一个 Data Role

-- Grant data roles to Marvin (manager and employee)
GRANT DATA ROLE manager_role TO "manderson";
GRANT DATA ROLE employee_role TO "manderson";
 
-- Grant the employee data role to Emma
GRANT DATA ROLE employee_role TO "ebaker";

④ 配置Data Access Control

这个是重头戏,关于数据访问授权的详细规则具体如何设定全都在这部分,之前的RAS就是各种调用复杂的内部定义,如今在 Deep Sec 中只需要声明式的SQL即可实现,具体定义的内容也容易让人理解。

Define data grants to control which rows and columns each end user can access. In data grant predicates, ORA_END_USER_CONTEXT.username returns the end user's name from the current end-user security context.

创建一个数据授权(Data Grant),允许员工仅查看他们自己的记录。

CREATE DATA GRANT hr.employees_own_record
  AS SELECT
  ON hr.employees
  WHERE email = ORA_END_USER_CONTEXT.username
  TO employee_role;

创建一个数据授权,允许经理查看其直系下属的记录(但不包括 SSN 字段)。

CREATE DATA GRANT hr.manager_direct_reports
  AS SELECT (ALL COLUMNS EXCEPT ssn)
  ON hr.employees
  WHERE manager = ORA_END_USER_CONTEXT.username
  TO manager_role;

⑤ 测试验证Deep Sec的效果

分别使用不同的 END USER 登录,验证Deep Sec实现的细粒度数据访问效果。

我们主要关注,不同 END USER 登录,ORA_END_USER_CONTEXT.username 值的变化,以及同样查询 hr.employees 的记录差异:

相同的测试SQL如下,方便直接拷贝:

SELECT ORA_END_USER_CONTEXT.username FROM dual;

SET LINESIZE 120
SET TRIMSPOOL ON
SET PAGESIZE 50

COL FIRST_NAME FORMAT A10
COL LAST_NAME  FORMAT A10
COL EMAIL      FORMAT A20
COL MANAGER    FORMAT A15
COL SSN        FORMAT A11
COL SALARY     FORMAT 99999.9
COL PHONE      FORMAT A12

SELECT * FROM hr.employees;

场景1:使用 manderson 终端用户登录测试:

sqlplus '"manderson"'/Test_20260513@//localhost:1521/ORCLPDB1

从场景1的结果可以看到, manderson 终端用户登录进来后,ORA_END_USER_CONTEXT.username 值是 manderson,查询员工表,能看到自己的记录,同时能看到所有下属的记录,但无法看到下属的SSN字段值。

场景2:使用 ebaker 终端用户登录测试:

sqlplus '"ebaker"'/Test_20260513@//localhost:1521/ORCLPDB1

从场景2的结果可以看到, ebaker 终端用户登录进来后,ORA_END_USER_CONTEXT.username 值是 ebaker,查询员工表,只能看到自己的记录。

符合我们之前的定义规则。

03 | 快速部署Deep Sec的方法

上面为了让用户能看清楚每一步都做了什么,是分步骤演示执行的。

如果用户已经了解Deep Sec的机制,想快速通过集成SQL脚本,一键部署或清理测试环境,官方也有提供示例脚本,可以直接使用或者根据自己实际情况修改。

A.1 Scripts for Direct Logon with Local End Users

至此,Oracle Deep Data Security (Deep Sec) 初体验已完成,后续有时间再具体看下如何将 Deep Sec 和 AI应用结合起来使用。