41-Oracle 23 ai Firewall(内核级集成)

小伙伴们,有没有遇见各种安全要求,网络安全监测需求。在从前的Oracle数据库前端放置安全设备或是行为拦截设备,进行拦截和日志解析。前置外挂效果如何且不论述,性能肯定会有影响。

现在Oracle 23 ai 将防火墙功能集成在数据库内核中,原生集成,颗粒度细致,性能提升。

一、技术演进:从边界防护到原生安全

1. 传统防火墙架构(23ai之前)​
  • 网络层代理​:作为独立硬件/软件部署在数据库前,通过SPAN或TAP端口镜像流量
  • 功能特性​:
    • 黑白名单策略​:基于正则表达式匹配SQL模式(如拦截UNION SELECT)
    • 登录控制​:限制失败登录尝试次数,自动锁定账户
    • 协议解析​:支持TNS协议解码,但无法解析加密流量
  • 核心缺陷​:
    • 网络绕行风险​:旁路部署可能被攻击者绕过
    • 性能损耗​:SQL语法解析增加5-15ms延迟
    • 管理割裂​:策略配置独立于数据库,策略与数据库分离,需手动同步用户权限。
2. 23ai内生防火墙革新
  • 内核级集成​:通过DBMS_SQL_FIREWALL包实现策略管理,消除网络层绕行风险
  • 加密流量解析​:原生支持TLS 1.3加密流量分析(无需解密)
  • 租户隔离​:CDB/PDB独立策略管理,支持容器化部署
3. 功能对比 

能力

传统方案

23ai

策略生效点

网络层

数据库内核

加密支持

有限

原生TLS 1.3解析

性能损耗

5-15ms

多租户管理

不支持

根容器统一策略

二、23ai防火墙核心技术

1. 技术核心
  • 上下文感知策略
    • 绑定客户端属性(IP、OS_USER、OS_PROGRAM)
    • 识别SQL结构特征(如永真条件、非常规UNION)
  • 多模式运行​:
    • 学习模式​:捕获合法SQL生成指纹,(DBMS_SQL_FIREWALL.CREATE_CAPTURE)
    • 告警模式​:记录违规
    • 阻断模式​:实时拦截未授权操作
2. 关键增强特性
  • 细粒度捕获控制
-- 捕获顶级SQL(PL/SQL嵌套调用)-现在是演示,看后面的步骤  
BEGIN  
  DBMS_SQL_FIREWALL.CREATE_CAPTURE(  
    username        => 'APP_USER',  
    top_level_only  => TRUE
  );
END;
/
  • 动态上下文绑定​ 
-- 限制DBA仅从特定IP执行操作  
BEGIN  
  DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT(  
    username      => 'DBA_USER',  
    context_type  => DBMS_SQL_FIREWALL.IP_ADDRESS,  
    value         => '192.168.1.0/24'  
  );
END;
/

三、实操环境初始化(SYSDBA执行) 

-- 切换到目标PDB(容器化部署必需)
ALTER SESSION SET CONTAINER = freepdb1;  -- 容器名根据实际修改

-- 启用全局SQL防火墙
--ALTER SYSTEM SET SQL_FIREWALL=ON;--废弃的功能
EXEC DBMS_SQL_FIREWALL.ENABLE;
--
SYS@CDB$ROOT> EXEC DBMS_SQL_FIREWALL.ENABLE;
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.586
-- 创建测试用户(密码Oracle_4U)
CREATE USER APP_USER IDENTIFIED BY "Oracle_4U";
GRANT CREATE SESSION ,SQL_FIREWALL_ADMIN TO APP_USER;
grant unlimited tablespace to APP_USER;
--
Grant succeeded.
Elapsed: 00:00:00.025
-- 创建敏感数据表(APP_USER会话执行)
sqlplus APP_USER/Oracle_4U@localhost:1521/freepdb1
CREATE TABLE sensitive_data (
  id          NUMBER PRIMARY KEY,
  name        VARCHAR2(50),
  credit_card VARCHAR2(20)
);
INSERT INTO sensitive_data VALUES (1, 'BOSS', '4111111111111111');
COMMIT;
--
INSERT INTO sensitive_data VALUES (1, 'BOSS', '4111111111111111');
1 row created.
APP_USER@localhost:1521/freepdb1> COMMIT;
Commit complete.
--

四、策略训练与拦截验证

步骤1:学习模式捕获合法SQL
-- SYSDBA执行(启用捕获,仅监控顶级SQL)
BEGIN
  DBMS_SQL_FIREWALL.CREATE_CAPTURE(
    username        => 'APP_USER',
    top_level_only  => TRUE,  -- 关键优化:忽略PL/SQL嵌套调用
    start_capture   => TRUE   -- 立即开始捕获
  );
END;
/
-- 模拟合法操作(APP_USER会话执行)
SELECT * FROM sensitive_data WHERE id=1;              -- 按ID查询
UPDATE sensitive_data SET name='Alice' WHERE id=1;     -- 按ID更新
--
APP_USER@localhost:1521/freepdb1> SELECT * FROM sensitive_data WHERE id=1;
        ID NAME                                               CREDIT_CARD
---------- -------------------------------------------------- --------------------
         1 BOSS                                               4111111111111111
APP_USER@localhost:1521/freepdb1> UPDATE sensitive_data SET name='Alice' WHERE id=1;
1 row updated.
APP_USER@localhost:1521/freepdb1>
步骤2:生成允许列表,并启用阻断

白名单生成是捕获的后续步骤,需先停止捕获 → 生成白名单 → 再启用阻断策略

-- SYSDBA执行
--先停止捕获
BEGIN
  DBMS_SQL_FIREWALL.STOP_CAPTURE('APP_USER');  -- 停止捕获
END;
/
--PL/SQL procedure successfully completed.
--生成允许列表(白名单)​
BEGIN
  DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST('APP_USER');  -- 生成白名单
END;
/
--或如下
EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST('APP_USER');      -- 生成白名单
--PL/SQL procedure successfully completed.
--再启用阻断策略
-- 以管理员(需 SQL_FIREWALL_ADMIN 角色)在 PDB 中执行
BEGIN
  DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST(
    username => 'APP_USER',
    enforce  => DBMS_SQL_FIREWALL.ENFORCE_ALL,  -- 强制检查SQL和上下文
    block    => TRUE                            -- 开启阻断
  );
END;
/
--PL/SQL procedure successfully completed.
--检查捕获情况
SELECT username,SQL_TEXT
FROM DBA_SQL_FIREWALL_CAPTURE_LOGS 
WHERE username = 'APP_USER';  -- 应无活跃记录
--
SELECT username,SQL_TEXT
  2  FROM DBA_SQL_FIREWALL_CAPTURE_LOGS
  3  WHERE username = 'APP_USER';

USERNAME
------------------------------------------------------------------------------------------------------------------------
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
APP_USER
SELECT * FROM SENSITIVE_DATA WHERE ID=:"SYS_B_0"
APP_USER
UPDATE SENSITIVE_DATA SET NAME=:"SYS_B_0" WHERE ID=:"SYS_B_1"
APP_USER
SELECT * FROM SENSITIVE_DATA WHERE ID=:"SYS_B_0" OR :"SYS_B_1"=:"SYS_B_2"

--检查白名单生成
SELECT sql_text 
FROM DBA_SQL_FIREWALL_ALLOWED_SQL 
WHERE username = 'APP_USER';  -- 应返回学习到的合法SQL
--测试阻断功能
-- 用 APP_USER 执行未授权的SQL(预期触发 ORA-47605)
SELECT * FROM sensitive_data WHERE 1=1; 
--
APP_USER@localhost:1521/freepdb1> SELECT * FROM sensitive_data WHERE 1=1;
SELECT * FROM sensitive_data WHERE 1=1
              *
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
步骤3:记录测试(触发ORA-47605) 
-- APP_USER会话执行
-- 测试1:捕捉SQL
SELECT * FROM sensitive_data WHERE id='1' OR 1=1;
-- 测试2:全表扫描
SELECT * FROM sensitive_data; 
--
APP_USER@localhost:1521/freepdb1> SELECT * FROM sensitive_data;
SELECT * FROM sensitive_data
              *
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
-- 测试3:绑定程序上下文(限制非sqlplus访问)
BEGIN
  DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT(
    username      => 'APP_USER',
    context_type  => DBMS_SQL_FIREWALL.OS_PROGRAM,
    value         => 'sqlplus.exe'                          -- 仅允许sqlplus
  );
END;
/
--PL/SQL procedure successfully completed.

五、日志分析与策略优化

查看拦截日志
-- SYSDBA执行
SELECT username, sql_text, CAUSE, OCCURRED_AT
FROM DBA_SQL_FIREWALL_VIOLATIONS
WHERE username='APP_USER';                                   
-- 确认被记录
--USERNAME
---------------------------------------------------------
SQL_TEXT
---------------------------------------------------------
CAUSE             OCCURRED_AT
----------------- ---------------------------------------
APP_USER
SELECT * FROM SENSITIVE_DATA WHERE :"SYS_B_0"=:"SYS_B_1"
SQL violation     16-JUN-25 04.01.49.804037 PM +08:00

APP_USER
SELECT * FROM SENSITIVE_DATA
SQL violation     16-JUN-25 04.02.47.085260 PM +08:00

六、企业级场景扩展

场景1:限制固定IP操作
--若需限制访问来源(如只允许特定 IP),使用 ADD_ALLOWED_CONTEXT:
BEGIN  
  DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT(  
    username      => 'APP_USER',  
    context_type  => DBMS_SQL_FIREWALL.IP_ADDRESS,  
    value         => '172.2.25.100'  -- 仅允许此 IP  
  );  
END;  
/
场景2:允许特定的程序 
BEGIN  
  DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT(  
    username      => 'APP_USER',  
    context_type  => DBMS_SQL_FIREWALL.OS_PROGRAM,  
    value         => 'report_tool.exe'  
  );  
END;
/
--PL/SQL procedure successfully completed.
场景3、还原,需要重新测试的时候删除捕获,再重新设置 
SYS@FREE> EXEC DBMS_SQL_FIREWALL.DROP_CAPTURE('APP_USER');

--PL/SQL procedure successfully completed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值