ITPub博客

首页 > 数据库 > Oracle > 实操Oracle 23C SQL防火墙

实操Oracle 23C SQL防火墙

原创 Oracle 作者:jason_yehua 时间:2025-03-27 15:00:45 0 删除 编辑

以下是一个Oracle 23c中使用SQL防火墙(SQL Firewall)的实操案例,通过监控和拦截异常SQL语句,防止SQL注入攻击及非授权的数据库访问行为。SQL防火墙通过学习正常SQL模式生成允许列表(Allow List),并实时拦截不符合规则的恶意请求。

步骤 1:启用SQL防火墙并创建测试环境

1.1 创建测试用户和表

-- 创建测试用户
CREATE USER app_user IDENTIFIED BY "App@Secure123#";
GRANT CONNECT, RESOURCE TO app_user;
-- 创建测试表并插入数据
CONNECT app_user/App@Secure123#
CREATE TABLE sensitive_data (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    credit_card VARCHAR2(20)
);
INSERT INTO sensitive_data VALUES (1, 'Alice', '4111111111111111');
INSERT INTO sensitive_data VALUES (2, 'Bob', '5500000000000004');
COMMIT;


1.2 启用SQL防火墙(需DBA权限)

CONNECT / AS SYSDBA
-- 启用SQL防火墙功能
EXEC DBMS_SQL_FIREWALL.ENABLE;

步骤 2:配置SQL防火墙学习模式

2.1 为测试用户开启学习模式(捕获正常SQL)

BEGIN
  DBMS_SQL_FIREWALL.CREATE_WHITELIST(
    username => 'APP_USER',
    enabled  => TRUE,
    mode     => DBMS_SQL_FIREWALL.MODE_LEARN
  );
END;
/

2.2 模拟正常业务操作(生成允许列表)

-- 用户执行合法查询(需在应用会话中执行)
CONNECT app_user/App@Secure123#
SELECT * FROM sensitive_data WHERE id = 1;  -- 合法查询(按ID查询)
UPDATE sensitive_data SET name = 'Alice Smith' WHERE id = 1; -- 合法更新

2.3 结束学习模式并生成允许列表

CONNECT / AS SYSDBA
-- 停止学习模式并生成允许列表
BEGIN
  DBMS_SQL_FIREWALL.ALTER_WHITELIST(
    username => 'APP_USER',
    mode     => DBMS_SQL_FIREWALL.MODE_ENFORCE
  );
END;
/

步骤 3:配置SQL防火墙保护模式

3.1 启用保护模式(拦截非法SQL)

BEGIN
  DBMS_SQL_FIREWALL.ALTER_WHITELIST(
    username => 'APP_USER',
    enabled  => TRUE,
    mode     => DBMS_SQL_FIREWALL.MODE_ENFORCE
  );
END;
/

步骤 4:测试SQL防火墙拦截效果

4.1 尝试非法查询(全表扫描)

CONNECT app_user/App@Secure123#
SELECT * FROM sensitive_data;  -- 未在允许列表中的全表扫描
-- 结果:
-- ORA-47605: SQL Firewall 拦截了此操作:SQL不在允许列表中

4.2 模拟SQL注入攻击

-- 恶意输入:`' OR 1=1 --`
SELECT * FROM sensitive_data WHERE id = '1' OR 1=1 --';
-- 结果:
-- ORA-47605: SQL Firewall 拦截了此操作:检测到异常SQL结构

4.3 尝试未授权的DDL操作

DROP TABLE sensitive_data;  -- 用户无DDL权限,且操作不在允许列表
-- 结果:
-- ORA-01031: 权限不足(因权限限制) + SQL防火墙拦截日志

步骤 5:管理SQL防火墙日志与策略

5.1 查询被拦截的SQL记录

CONNECT / AS SYSDBA
-- 查看SQL防火墙违规日志
SELECT username, sql_text, violation_reason, event_timestamp
FROM DBA_SQL_FIREWALL_VIOLATIONS
WHERE username = 'APP_USER';

5.2 调整允许列表(手动添加合法SQL)

-- 若发现误拦截的合法SQL,可手动添加至允许列表
BEGIN
  DBMS_SQL_FIREWALL.ADD_SQL(
    username => 'APP_USER',
    sql_text => 'SELECT * FROM sensitive_data WHERE id = :1'
  );
END;
/

5.3 禁用/删除策略

-- 禁用用户的SQL防火墙
BEGIN
  DBMS_SQL_FIREWALL.ALTER_WHITELIST(
    username => 'APP_USER',
    enabled  => FALSE
  );
END;
/
-- 删除允许列表
BEGIN
  DBMS_SQL_FIREWALL.DROP_WHITELIST(username => 'APP_USER');
END;
/


关键点说明

SQL防火墙工作模式:

    学习模式(LEARN):捕获正常SQL生成允许列表。

    保护模式(ENFORCE):拦截不在允许列表中的SQL。

    告警模式(DETECT):仅记录违规不拦截(测试阶段适用)。

拦截场景:

    SQL注入攻击(如OR 1=1)。

    未授权的全表扫描(如SELECT * FROM table)。

    非预期的SQL结构(如动态拼接的恶意语句)。

高级配置:

    例外规则:允许特定IP或应用服务绕过防火墙。

    正则表达式匹配:自定义规则拦截含敏感字段(如credit_card)的查询。    

    与Oracle Audit集成:将拦截日志统一归档至审计系统。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31547506/viewspace-3079194/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-22

  • 博文量
    122
  • 访问量
    99637