Oracle 23c中的代理连接和SQL防火墙
我最近发布了一个三部分的系列文章,探讨了Oracle 23c免费版中新发布的SQL防火墙的高级功能。这些部分包括:
- 第一部分 - 引言:
- 第二部分 - 学习和设置阶段:
- 第三部分 - 测试SQL防火墙:
在测试过程中,我记录了许多关于Oracle 23c中新SQL防火墙的笔记,因此我原本打算发布一个更大的第四部分,但我决定在这里创建一个简单的短篇文章,因为我想要讨论与SQL防火墙一起使用代理的情况。
代理在Oracle中已经存在很长时间了,我大概在14-15年前就推荐人们使用代理进行管理工作。我很久以前就注意到代理可以以不同的方式或意义使用,而不仅仅是当时使用的方式。通常的用途是在连接池中提供身份。因此,在这个意义上,许多用户通过一个或一小群数据库用户来提供他们的身份,建立在共享连接用户之上。另一种方式是锁定一个带有不可能密码的关键账户。我使用的例子是强大的账户或模式。模式是一个很好的例子。用不可能的密码锁定模式(现在模式专用账户也做同样的事情),然后不允许直接访问模式,这在许多地方已经这样做了。
现在,通过代理作为发布用户到模式,然后运行代码,可以完成新代码、表等的发布。对于发布用户来说,他在所有方面都是模式,除了代理。这意味着脚本运行就好像用户直接连接到模式一样。这意味着我们不是在模式上留下审计线索,我们不知道谁真正连接了,因为它是一个共享账户,而是可以审计发布用户,因为他们有自己的账户,我们知道“谁做的”。
所以,我想测试Oracle 23c中的SQL防火墙与代理一起使用。记住在第一部分我们设置了一个数据库用户VM来连接并使用ORABLOG.CUSTOMER表和ORABLOG.CUSTA PL/SQL过程。我们在第二部分使用了3个简单的SQL、PL/SQL调用作为学习阶段,并在第三部分再次测试了这些。
VM被允许的唯一SQL是我们设置的这三个动作。首先,让我们创建一个新用户VQ并允许它代理到VM:
C:\>sqlplus sys/oracle@//192.168.56.18:1521/freepdb1 as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 16 14:23:59 2023
Version 19.12.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to:
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0
SQL> create user vq identified by vq;
User created.
SQL> grant create session to vq;
Grant succeeded.
SQL> alter user vm grant connect through vq;
User altered.
SQL>
现在我们可以连接到数据库并使用VQ代理到VM:
SQL> connect vq[vm]/vq@//192.168.56.18:1521/freepdb1 Connected. SQL> sho user USER is "VM"
所以,我们是VQ,但表现得像VM。现在尝试所有由SQL防火墙规则允许的SQL:
SQL> sho user
USER is "VM"
SQL> select * from orablog.customer;
FULLNAME FIRSTNAME
------------------------------ ------------------------------
LASTNAME
------------------------------
Pete Finnigan Pete
Finnigan
Zulia Finnigan Zulia
Finnigan
Eric Finnigan Eric
Finnigan
SQL> select count(*) from orablog.customer;
COUNT(*)
----------
3
SQL> set serveroutput on
SQL> exec orablog.custa('Finnigan');
name:=[Pete Finnigan]
name:=[Zulia Finnigan]
PL/SQL procedure successfully completed.
SQL>
它们都按预期工作。如果我们现在尝试一些不允许的操作会怎样。记住VM对ORABLOG.CUSTOMER表有INSERT权限,但这不在SQL防火墙规则中:
SQL> insert into orablog.customer(fullname,firstname,lastname) values ('Emil Finnigan','Emil','Finnigan');
insert into orablog.customer(fullname,firstname,lastname) values ('Emil Finnigan','Emil','Finnigan')
*
ERROR at line 1:
ORA-47605: SQL Firewall violation
SQL>
所以,这有效。SQL防火墙允许我们为VM设置并应用的规则,并阻止不允许的SQL。我们在数据库中是VQ而不是VM,尽管数据库在所有方面都把我们视为VM。这就是我们应该期待的,这样我们就可以连接到一个模式并进行发布,而防火墙规则仍然有效。
但是,有一个漏洞。如果攻击者有ALTER USER权限,他可以简单地允许自己代理到另一个有有效SQL防火墙规则的用户,然后允许他查看或更改SQL防火墙已经阻止的数据。拥有ALTER USER权限的用户有:
who_has_priv: Release 1.0.3.0.0 - Production on Thu Jun 22 11:05:20 2023
Copyright (c) 2004 PeteFinnigan.com Limited. All rights reserved.
PRIVILEGE TO CHECK [SELECT ANY TABLE]: ALTER USER
OUTPUT METHOD Screen/File [S]:
FILE NAME FOR OUTPUT [priv.lst]:
OUTPUT DIRECTORY [DIRECTORY or file (/tmp)]:
EXCLUDE CERTAIN USERS [N]:
USER TO SKIP [TEST%]:
Privilege => ALTER USER has been granted to =>
====================================================================
User => APEX_220200 (ADM = NO)
User => ORDS_METADATA (ADM = NO)
User => HRREST (ADM = NO)
User => VF (ADM = NO)
User => SYS (ADM = NO)
Role => DBA (ADM = NO) which is granted to =>
User => AV (ADM = NO)
User => SYSTEM (ADM = NO)
User => SYS (ADM = YES)
Role => IMP_FULL_DATABASE (ADM = NO) which is granted to =>
Role => DATAPUMP_IMP_FULL_DATABASE (ADM = NO) which is granted to =>
Role => DBA (ADM = NO) which is granted to =>
User => AV (ADM = NO)
User => SYSTEM (ADM = NO)
User => SYS (ADM = YES)
User => SYS (ADM = YES)
User => GSMADMIN_INTERNAL (ADM = NO)
User => SYS (ADM = YES)
Role => DBA (ADM = NO) which is granted to =>
User => AV (ADM = NO)
User => SYSTEM (ADM = NO)
User => SYS (ADM = YES)
Role => DATAPUMP_IMP_FULL_DATABASE (ADM = NO) which is granted to =>
Role => DBA (ADM = NO) which is granted to =>
User => AV (ADM = NO)
User => SYSTEM (ADM = NO)
User => SYS (ADM = YES)
User => SYS (ADM = YES)
User => GSMADMIN_INTERNAL (ADM = NO)
Role => DV_ACCTMGR (ADM = NO) which is granted to =>
PL/SQL procedure successfully completed.
For updates please visit http://www.petefinnigan.com/tools.htm
SQL>
因此,任何拥有DBA或IMP_FULL_DATABASE权限的用户,或者DV_ACCTMGR、APEX等用户,都可以简单地更改自己的用户,允许代理访问已经设置SQL防火墙规则的用户,从而绕过SQL防火墙。如果一个用户拥有许多其他%ANY%权限,他们也可以通过首先攻击拥有ALTER USER的用户,然后获得对SQL防火墙用户的访问权限,进而访问数据,从而绕过SQL防火墙。
如你所知,我们需要分层防御来保护数据。同时,我们需要记住,要使用SQL防火墙,我们必须保护SQL防火墙免受绕过和滥用。我们必须有深度的安全措施来保护数据。
所以,是的,当我们代理时SQL防火墙工作得很好,因为我们有代理的理由,比如发布到一个模式,但请记住,代理也可以被用来搭便车并窃取对SQL防火墙规则的访问权限。
原文标题:Proxy Connections and the SQL Firewall in Oracle 23c
原文作者:Pete Finnigan
原文链接:http://www.petefinnigan.com/weblog/archives/00001520.htm




