标题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 领域和命令规则 |
| 合规审计 | 启用审计策略,记录所有违规尝试 |
注意事项
- 测试充分:生产环境启用前,务必在测试环境完成完整业务流程捕获
- 动态 SQL:对于 ORM 框架生成的动态 SQL,可能需要调整捕获粒度
- 维护更新:应用升级后,需要重新捕获新增 SQL 并更新允许列表
- 性能影响:启用后会有轻微性能开销,主要在 SQL 签名比对阶段
SQL Firewall 与 Oracle Database Vault 的其他特性(领域、命令规则、因素)结合使用,可以构建纵深防御体系,有效保护敏感数据。