SQL防火墙包含在Oracle 23c数据库中,通过监视和阻止未经授权的SQL和SQL注入攻击(无论SQL执行路径如何),提供针对常见数据库攻击的实时保护。
您可以使用SQL防火墙来控制数据库允许处理哪些SQL语句。您可以限制与数据库连接和SQL语句关联的连接路径。可以记录和阻止未经授权的SQL。由于SQL防火墙嵌入在Oracle数据库中,因此无法绕过它。所有SQL语句都经过检查,无论是本地语句还是网络语句,无论是加密语句还是明文语句。它检查顶级SQL、存储过程和相关的数据库对象。
SQL防火墙通过将数据库访问限制为仅授权的SQL语句或连接,提供了针对常见数据库攻击的实时保护。它降低了SQL注入攻击、异常访问以及凭据盗窃或滥用带来的风险。
SQL防火墙策略在数据库帐户级别工作,无论是应用程序服务帐户还是直接数据库用户(如报告用户或数据库管理员)。换句话说,您可能有一个SQL防火墙策略用于数据库用户HR,另一个用于数据库用户JOE。这种灵活性允许您从数据库管理员或应用程序服务帐户开始逐步建立数据库的保护级别。
您可以在根数据库和可插拔数据库(PDB)中使用SQL防火墙。SQL防火墙是一种简单易用的防火墙解决方案,适用于所有Oracle数据库部署,如内部部署、云、多租户、Oracle Data Guard或Oracle Real Application Clusters。SQL防火墙与其他Oracle数据库安全功能协同工作,如透明数据加密(TDE)、数据库审核和Oracle数据库保险库。在Oracle数据库Vault环境中,要配置SQL防火墙的用户必须具有特定于数据库Vault的授权。
SQL防火墙支持(也就是说,它捕获并强制执行)除事务控制命令(SAVEPOINT、COMMIT和ROLLBACK)之外的所有SQL命令。此外,SQL防火墙支持SQL*Plus命令PASSWORD和DESCRIBE,以及通过数据库链接的远程过程调用(RPC)。
配置SQL防火墙
具有SQL_FIREWALL_ADMIN角色的用户可以使用DBMS_SQL_FIREWALL PL/SQL包在根数据库或可插拔数据库(PDB)中配置SQL防火墙。
1.以被授予SQL_FIREWALL_ADMIN角色的用户身份连接到根或PDB。
2.启用SQL防火墙
EXEC DBMS_SQL_FIREWALL.ENABLE;
3.通过为指定用户创建并启用SQL防火墙捕获来训练SQL防火墙。
示例假定用户是名为APP的PDB用户。例如:
BEGINDBMS_SQL_FIREWALL.CREATE_CAPTURE (username => 'APP',top_level_only => TRUE,start_capture => TRUE);END;/
上面示例中:
username是SQL防火墙将监视的应用程序用户的名称。每个用户只能创建一个捕获。不能为SYS、SYSDG、SYSBACKUP、SYSRAC、SYSKM、DVSYS、LBACSYS或AUDSYS用户创建SQL防火墙捕获。
top_level_仅控制捕获的SQL语句的级别。
TRUE仅为顶级SQL语句(即用户直接运行的语句)生成捕获日志。
FALSE为顶级SQL语句和PL/SQL单元发出的SQL命令生成捕获日志。默认值为FALSE。
start_capture控制捕获何时生效。
TRUE使SQL防火墙能够立即开始捕获目标用户的活动。默认值为TRUE。
FALSE为用户创建捕获,但不会立即启动捕获。如果以后要开始捕获,则必须运行DBMS_SQL_FIREWALL。用户的START_CAPTURE过程。例如:
EXEC DBMS_SQL_FIREWALL.START_CAPTURE ('APP');
在这个阶段,假设您已经将start_capture设置为TRUE,那么您将从受信任的数据库连接路径运行应用程序帐户所需的SQL语句。如果应用程序工作负载发生了变化,您可能希望SQL防火墙忘记并学习新的SQL语句。如果用户不是,则需要重新启动捕获过程,以确保只运行正确的SQL语句。具体而言,如果要重新启动捕获过程,则必须首先停止此捕获(如果已启动),然后清除捕获日志并再次启动此捕获,或者删除此捕获并再次创建(并启动)捕获。
4.查看捕获日志和会话日志,以确定捕获的充分性。
SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_CAPTURE_LOGS WHERE USERNAME = 'APP';
5.停止捕获
EXEC DBMS_SQL_FIREWALL.STOP_CAPTURE ('APP');
6.为用户生成允许列表。
允许列表定义了允许用户执行的SQL语句。SQL防火墙基于从用户的现有捕获日志中收集的数据创建允许列表。
EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST ('APP');
7.要查找有关允许用户执行的活动的信息,请查询DBA_SQL_FIREWALL_allowed_*数据字典视图。
SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_ALLOWED_SQL WHERE USERNAME = 'APP';
或者,对于允许用户使用的任何操作系统程序:
SELECT OS_PROGRAM FROM DBA_SQL_FIREWALL_ALLOWED_OS_PROG WHERE USERNAME = 'APP';
8.(可选)通过运行DBMS_SQL_FIREWALL在允许的上下文中添加或修改条目。ADD_ALLOWED_CONTEXT和DBMS_SQL_FIREWALL。DELETE_ALLOWED_CONTEXT过程。
只有在生成允许列表后,才能添加上下文。上下文可以指定客户端IP地址、操作系统用户的名称或可用于数据库连接的操作系统程序。您可以根据需要添加任意多的上下文值。例如,如果用户的允许上下文列表不包含IP地址192.0.2.1,但您希望在启用允许列表后允许用户从此IP进行连接:
BEGINDBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT (username => 'APP',context_type => DBMS_SQL_FIREWALL.IP_ADDRESS,value => '192.0.2.1');END;/
要指定特定context_type的所有可能性,请输入%通配符。
以下三种类型的context_type设置是有效的:
DBMS_SQL_FIREWALL。IP_ADDRESS接受CIDR表示法中的IPv4和IPv6地址及子网。当IP地址不可用时,它接受本地连接的值Local(区分大小写)。
DBMS_SQL_FIREWALL。OS_USERNAME接受任何有效的操作系统用户名,例如oracle。
DBMS_SQL_FIREWALL。OS_PROGRAM接受用户用于运行SQL语句的任何有效操作系统程序名,如sqlplus或SQL Developer。
您可以查询以下数据字典视图以检查上下文:
DBA_SQL_FIREWALL_ALLOWED_IP_ADDR
DBA_SQL_FIREWALL_ALLOWED_OS_USER
DBA_SQL_FIREWALL_ALLOWED_OS_pg
9.通过启用为用户生成的允许列表来启用SQL防火墙保护。
即使在目标用户的现有会话中,这种启用也会立即生效。
BEGINDBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST (username => 'APP',enforce => DBMS_SQL_FIREWALL.ENFORCE_SQL,block => TRUE);END;/
在本示例中:
username可以是已生成允许列表的特定用户,也可以是当前未启用允许列表的所有用户。若要指定所有用户,请使用NULL作为值。
强制执行指定以下强制类型之一:
DBMS_SQL_FIREWALL.ENFORCE_CONTEXT强制执行已配置的允许上下文。
DBMS_SQL_FIREWALL.ENFORCE_SQL强制执行已配置的允许的SQL。
DBMS_SQL_FIREWALL.ENFORCE_ALL强制执行允许的上下文和允许的SQL。此设置为默认设置。
块指定以下内容:
TRUE:当用户违反允许列表定义时,TRUE将阻止用户的数据库连接或用户的SQL执行。
FALSE:允许不匹配的用户数据库连接或SQL命令继续执行。此设置为默认设置。
SQL防火墙始终为任何不匹配的用户数据库连接或SQL语句生成违规日志,而不管强制选项是什么。
在此阶段,如果用户试图执行违反允许列表的SQL查询,并且您已指定SQL防火墙来阻止此SQL,则会出现ORA-47605:SQL防火墙违反错误。
10.监视违规日志中是否存在异常SQL连接尝试或SQL查询(如果它们不在允许列表中)。
SELECT SQL_TEXT, FIREWALL_ACTION, IP_ADDRESS, CAUSE, OCCURRED_ATFROM DBA_SQL_FIREWALL_VIOLATIONS WHERE USERNAME = 'APP';
将显示类似于以下内容的输出:
SQL_TEXT FIREWALL_ACTION IP_ADDRESS CAUSE OCCURRED_AT–-------------------------------------------------------- –--------------- –---------- –---------------- –----------------------------------SELECT SALARY FROM HR.EMPLOYEES WHERE SALARY >:"SYS_B_0" BLOCKED 192.0.2.146 Context violation 12-MAY-23 11.12.39.626053 PM +00:00




