实操Oracle 23C SQL防火墙

来源:这里教程网 时间:2026-03-03 21:46:05 作者:

以下是一个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集成:将拦截日志统一归档至审计系统。

相关推荐