Oracle 23ai推出的SQL防火墙新特性,作为数据库内核原生集成的安全功能,它无需额外部署第三方工具,能够全方位 inspect 所有 incoming 数据库连接和SQL语句,通过“允许列表”机制精准管控授权行为,实时阻断未授权操作,从根源上抵御SQL注入等核心威胁.其具有以下几个特点:

  • 不可绕过:深度集成于数据库内核,无论SQL语句来自本地还是网络、传输方式是加密还是明文,无论是否包含PL/SQL调用或动态生成的SQL,都能被全面inspect,不存在防护盲区,彻底杜绝被绕过的可能;
  • 精准管控:采用“允许列表”(Allow-List)模式,仅允许明确授权的SQL语句和连接行为执行,拒绝所有未授权操作,从根源上抵御SQL注入、恶意SQL等威胁,比传统“黑名单”模式更安全、更精准;
  • 上下文感知:能够捕捉SQL执行的完整上下文信息,包括网络地址、操作系统用户、执行程序等,可基于这些信息限制连接来源,进一步降低凭证盗用、滥用的风险;
  • 运维便捷:原生集成于Oracle 23ai,无需额外部署第三方工具,可通过DBMS_SQL_FIREWALL包直接管理,也可结合Oracle Data Safe实现多数据库集群的统一管控,大幅降低运维成本;
  • 性能损耗低:与数据库内核深度协同,采用轻量化检测机制,对SQL执行性能的影响微乎其微,可满足高并发业务场景的安全需求。

接下来介绍下配置

1.环境准备与权限配置

前提条件:确保Oracle 23ai数据库已正常部署,需为管理员用户授予SQL防火墙管理权限,用于配置和管理防火墙策略。

-- 1. 切换至sys用户,授予管理员用户SQL防火墙管理权限
sqlplus / as sysdba
-- 2. 切换至可插拔数据库(若使用多租户环境)
ALTER SESSION SET CONTAINER = freepdb1;
-- 3. 创建SQL防火墙管理员用户(或使用现有管理员用户)
CREATE USER sql_fw_admin IDENTIFIED BY SqlFw@123456;
-- 4. 授予核心权限:会话创建、SQL防火墙管理、审计权限
GRANT CREATE SESSION, SQL_FIREWALL_ADMIN, AUDIT_ADMIN TO sql_fw_admin;
-- 5. 授予DBMS_SQL_FIREWALL包的执行权限
GRANT EXECUTE ON SYS.DBMS_SQL_FIREWALL TO sql_fw_admin;

2. 开启学习模式,生成允许列表

以应用服务账户(app_user)为例,开启学习模式,捕捉其正常业务SQL行为,生成允许列表。

-- 1. 使用SQL防火墙管理员用户登录
sqlplus sql_fw_admin/SqlFw@123456@freepdb1
-- 2. 为app_user开启学习模式,学习时长设置为7天(可根据业务调整)
BEGIN
    DBMS_SQL_FIREWALL.START_CAPTURE(
        user_name => 'APP_USER',  -- 目标数据库用户
        capture_duration => 7,    -- 学习时长(天)
        capture_context => TRUE   -- 捕捉连接上下文(IP、操作系统用户、程序)
    );
END;
/
-- 3. 查看学习进度
SELECT user_name, capture_start_time, capture_end_time, status
FROM DBA_SQL_FIREWALL_CAPTURE;
-- 4. 学习完成后,停止学习模式,生成允许列表
BEGIN
    DBMS_SQL_FIREWALL.STOP_CAPTURE(user_name => 'APP_USER');
END;
/

3. 配置防护策略,启用主动防护

学习完成后,基于生成的允许列表,配置防护策略,设置管控模式和上下文规则,启用主动防护。

-- 1. 为app_user创建防护策略,绑定允许列表
BEGIN
    DBMS_SQL_FIREWALL.CREATE_POLICY(
        policy_name => 'APP_USER_SQL_FW_POLICY',  -- 策略名称
        user_name => 'APP_USER',                  -- 绑定的数据库用户
        allow_list_type => 'CAPTURED',            -- 允许列表来源:学习阶段捕捉的SQL
        enforcement_mode => 'BLOCK',              -- 管控模式:阻断+日志(仅日志为'LOG_ONLY')
        allowed_ips => '192.168.1.100,192.168.1.101',  -- 允许访问的IP地址
        allowed_programs => 'java.exe,sqlplus.exe' -- 允许执行的程序
    );
END;
/
-- 2. 启用防护策略
BEGIN
    DBMS_SQL_FIREWALL.ENABLE_POLICY(policy_name => 'APP_USER_SQL_FW_POLICY');
END;
/
-- 3. 查看防护策略状态
SELECT policy_name, user_name, enforcement_mode, status
FROM DBA_SQL_FIREWALL_POLICIES;

4. 违规检测与日志查看

防护策略启用后,可实时检测违规操作,并通过日志查看违规详情,进行排查与溯源。

-- 1. 查看违规日志(本地查询)
SELECT violation_time, user_name, client_ip, program_name, violating_sql, violation_type
FROM DBA_SQL_FIREWALL_VIOLATIONS
WHERE user_name = 'APP_USER'
ORDER BY violation_time DESC;
-- 2. 手动添加单条SQL到允许列表(如需)
BEGIN
   DBMS_SQL_FIREWALL.APPEND_ALLOW_LIST_SINGLE_SQL(
        policy_name => 'APP_USER_SQL_FW_POLICY',
        sql_text => 'SELECT * FROM app_user.orders WHERE order_id = :1'
    );
END;
/
-- 3. 临时禁用防护策略(用于维护)
BEGIN
    DBMS_SQL_FIREWALL.DISABLE_POLICY(policy_name => 'APP_USER_SQL_FW_POLICY');
END;
/

Related Posts