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 的其他特性(领域、命令规则、因素)结合使用,可以构建纵深防御体系,有效保护敏感数据。

相关推荐
XDHCOM2 小时前
MySQL ER_IB_MSG_919报错解析,故障修复与远程处理指南
数据库·mysql·adb
爬山算法2 小时前
MongoDB(88)如何进行数据迁移?
数据库·mongodb
小小程序员.¥2 小时前
oracle--函数
数据库·sql·mysql
Leon-Ning Liu2 小时前
Oracle 26ai 新特性: True Cache(真实缓存)
数据库·缓存·oracle
Leon-Ning Liu2 小时前
Oracle 26ai 的 SQL 语言增强特性
数据库·sql·oracle
Elastic 中国社区官方博客2 小时前
Elasticsearch:语义搜索,现在默认支持多语言
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小江的记录本2 小时前
【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)
java·前端·数据库·spring boot·后端·spring·mybatis
小年糕是糕手2 小时前
【35天从0开始备战蓝桥杯 -- Day9】
数据结构·数据库·c++·算法·蓝桥杯
weixin_307779132 小时前
使用COPY INTO从S3导入CSV文件到Azure Synapse Dedicated SQL Pool表的问题分析与自动化验证方案
sql·自动化·azure