暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 23c中的代理连接和SQL防火墙

小小亮 2024-12-03
315

Oracle 23c中的代理连接和SQL防火墙

我最近发布了一个三部分的系列文章,探讨了Oracle 23c免费版中新发布的SQL防火墙的高级功能。这些部分包括:

  1. 第一部分 - 引言:
  2. 第二部分 - 学习和设置阶段:
  3. 第三部分 - 测试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

文章转载自小小亮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论