小伙伴们,有没有遇见各种安全要求,网络安全监测需求。在从前的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
&spm=1001.2101.3001.5002&articleId=148695127&d=1&t=3&u=e3391861217d4a7988117d90d6b1e3af)
2492

被折叠的 条评论
为什么被折叠?



