Oracle 26ai新特性:SQL Firewall(SQL 防火墙)的使用方法

标题SQL Firewall(SQL 防火墙)的使用方法:

SQL Firewall 概述

SQL Firewall 是 Oracle Database Vault 的内置组件,用于防止 SQL 注入、异常访问和凭证滥用。它通过**允许列表(Allow-List)**机制,仅允许显式授权的 SQL 语句执行。


核心概念

概念 说明
允许列表(Allow-List) 预先批准的 SQL 语句集合,只有这些语句可以执行
捕获模式(Capture Mode) 学习阶段,记录应用正常发送的 SQL 语句
执行模式(Enforce Mode) 防护阶段,只允许允许列表中的 SQL 执行
上下文检查 验证会话属性(IP、OS用户、程序名)

使用方法详解

步骤 1:启用 SQL Firewall

sql 复制代码
-- 以 DV_OWNER 或 DV_ADMIN 身份连接
CONNECT dv_owner/password@database

-- 为指定用户启用 SQL Firewall
BEGIN
    DBMS_SQL_FIREWALL.ENABLE_USER(
        username => 'APP_USER'
    );
END;
/

步骤 2:配置捕获模式(学习阶段)

sql 复制代码
-- 开始捕获特定用户的 SQL 语句
BEGIN
    DBMS_SQL_FIREWALL.START_CAPTURE(
        username          => 'APP_USER',
        top_level_only    => FALSE,      -- FALSE=捕获所有SQL,TRUE=仅顶层SQL
        capture_implicit  => TRUE        -- 是否捕获隐式SQL
    );
END;
/

捕获期建议:在测试环境或生产低峰期运行完整业务流程,确保捕获所有正常 SQL。

步骤 3:查看捕获的 SQL

sql 复制代码
-- 查询已捕获的 SQL 语句
SELECT 
    sql_id,
    sql_text,
    sql_signature,
    capture_time,
    execution_count
FROM DBA_SQL_FIREWALL_CAPTURES
WHERE username = 'APP_USER'
ORDER BY execution_count DESC;

步骤 4:生成允许列表

sql 复制代码
-- 停止捕获
BEGIN
    DBMS_SQL_FIREWALL.STOP_CAPTURE(
        username => 'APP_USER'
    );
END;
/

-- 从捕获的 SQL 生成允许列表
BEGIN
    DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST(
        username => 'APP_USER'
    );
END;
/

步骤 5:启用执行模式(防护阶段)

sql 复制代码
-- 启用允许列表执行
BEGIN
    DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST(
        username      => 'APP_USER',
        enforce       => TRUE,          -- TRUE=强制执行,FALSE=仅记录
        block         => TRUE,          -- TRUE=阻断违规SQL,FALSE=仅告警
        trust_context => TRUE           -- 是否信任会话上下文
    );
END;
/

高级配置

配置上下文验证

sql 复制代码
-- 限制特定 IP 地址或程序才能执行 SQL
BEGIN
    DBMS_SQL_FIREWALL.ADD_CONTEXT(
        username    => 'APP_USER',
        attribute   => 'IP_ADDRESS',     -- 或 'OS_USER', 'PROGRAM'
        value       => '192.168.1.%'     -- 支持通配符
    );
END;
/

-- 添加多个可信程序
BEGIN
    DBMS_SQL_FIREWALL.ADD_CONTEXT(
        username    => 'APP_USER',
        attribute   => 'PROGRAM',
        value       => 'java.exe'
    );
    
    DBMS_SQL_FIREWALL.ADD_CONTEXT(
        username    => 'APP_USER',
        attribute   => 'PROGRAM',
        value       => 'sqlplus.exe'
    );
END;
/

管理允许列表

sql 复制代码
-- 手动添加 SQL 到允许列表
BEGIN
    DBMS_SQL_FIREWALL.ADD_TO_ALLOW_LIST(
        username  => 'APP_USER',
        sql_text  => 'SELECT * FROM employees WHERE employee_id = :1'
    );
END;
/

-- 从允许列表删除特定 SQL
BEGIN
    DBMS_SQL_FIREWALL.DELETE_FROM_ALLOW_LIST(
        username  => 'APP_USER',
        sql_id    => 'abc123xyz'  -- SQL 签名ID
    );
END;
/

-- 清空允许列表
BEGIN
    DBMS_SQL_FIREWALL.PURGE_ALLOW_LIST(
        username => 'APP_USER'
    );
END;
/

监控与审计

查看违规事件

sql 复制代码
-- 查询 SQL Firewall 违规记录
SELECT 
    username,
    sql_text,
    violation_time,
    violation_type,        -- 'NOT_IN_ALLOW_LIST', 'CONTEXT_MISMATCH' 等
    ip_address,
    os_user,
    program,
    blocked               -- TRUE/FALSE
FROM DBA_SQL_FIREWALL_VIOLATIONS
WHERE violation_time > SYSDATE - 1  -- 最近1天
ORDER BY violation_time DESC;

查看 SQL Firewall 状态

sql 复制代码
-- 查看所有受保护用户的状态
SELECT 
    username,
    enabled,              -- 是否启用
    capture_mode,         -- 是否在捕获中
    allow_list_enforced,  -- 是否强制执行
    allow_list_count,     -- 允许列表SQL数量
    last_modified
FROM DBA_SQL_FIREWALL_USERS;

完整配置示例

sql 复制代码
-- 1. 连接为 DV_OWNER
CONNECT dv_owner/password@pdb1;

-- 2. 为应用用户启用 SQL Firewall
BEGIN
    DBMS_SQL_FIREWALL.ENABLE_USER('HR_APP_USER');
END;
/

-- 3. 开始捕获(建议在测试环境运行完整业务流程)
BEGIN
    DBMS_SQL_FIREWALL.START_CAPTURE(
        username       => 'HR_APP_USER',
        top_level_only => TRUE
    );
END;
/

-- [运行应用测试...]

-- 4. 停止捕获并生成允许列表
BEGIN
    DBMS_SQL_FIREWALL.STOP_CAPTURE('HR_APP_USER');
    DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST('HR_APP_USER');
END;
/

-- 5. 添加可信上下文(只允许特定应用服务器访问)
BEGIN
    DBMS_SQL_FIREWALL.ADD_CONTEXT(
        username  => 'HR_APP_USER',
        attribute => 'IP_ADDRESS',
        value     => '10.0.1.%'
    );
    
    DBMS_SQL_FIREWALL.ADD_CONTEXT(
        username  => 'HR_APP_USER',
        attribute => 'PROGRAM',
        value     => 'HRApplication.exe'
    );
END;
/

-- 6. 启用强制执行
BEGIN
    DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST(
        username      => 'HR_APP_USER',
        enforce       => TRUE,
        block         => TRUE,
        trust_context => TRUE
    );
END;
/

-- 7. 创建审计策略监控违规
BEGIN
    DBMS_SQL_FIREWALL.CREATE_AUDIT_POLICY(
        policy_name => 'HR_APP_FIREWALL_AUDIT',
        username    => 'HR_APP_USER',
        audit_condition => 'VIOLATION'
    );
END;
/

典型应用场景

场景 配置建议
防止 SQL 注入 启用强制执行,只允许参数化查询
防止凭证滥用 配置上下文验证,限制 IP 和程序名
零信任架构 结合 Database Vault 领域和命令规则
合规审计 启用审计策略,记录所有违规尝试

注意事项

  1. 测试充分:生产环境启用前,务必在测试环境完成完整业务流程捕获
  2. 动态 SQL:对于 ORM 框架生成的动态 SQL,可能需要调整捕获粒度
  3. 维护更新:应用升级后,需要重新捕获新增 SQL 并更新允许列表
  4. 性能影响:启用后会有轻微性能开销,主要在 SQL 签名比对阶段

SQL Firewall 与 Oracle Database Vault 的其他特性(领域、命令规则、因素)结合使用,可以构建纵深防御体系,有效保护敏感数据。

相关推荐
流年似水~几秒前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492859 分钟前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
志栋智能43 分钟前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
zhoutongsheng2 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
WinterKay2 小时前
【开源】我写了一个轻量级本地数据库浏览工具,支持 MySQL/Redis 只读查询
数据库·mysql·开源
zxrhhm3 小时前
Oracle 索引完整指南
数据库·oracle
程序猿乐锅4 小时前
【Tilas|第三篇】多表SQL语句
数据库·经验分享·笔记·学习·mysql
Navicat中国5 小时前
使用 Navicat 导入向导导入 Excel 数据时,系统提示导入成功,表中也能看到数据,但行数统计显示为 0,这是什么原因?
数据库·excel·导入
gmaajt5 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
折哥的程序人生 · 物流技术专研5 小时前
从“卡死”到“秒过”:WMS销售数据跨库回填的极限优化之旅
数据库·机器学习·oracle