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

相关推荐
睡不醒男孩03082337 分钟前
第二篇:深入探索开源数据库高可用:构建基于CLup的PostgreSQL生产级高可用与读写分离架构
数据库·postgresql·开源·clup
Micro麦可乐3 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
码农阿豪3 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
鼎讯信通3 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..4 小时前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
cfm_29144 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
真实的菜5 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊5 小时前
mysql数据库导出导入
数据库·mysql·oracle
十年编程老舅6 小时前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 20236 小时前
Vue复习
linux·服务器·数据库