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