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

Oracle 如何限制具有DBA角色的用户直接执行软件包?

ASKTOM 2021-06-03
343

问题描述

你好,Asktom团队,

谢谢你所做的一切出色的工作。

您能帮助我们解决以下问题吗?

A.我们是否可以限制或阻止具有DBA角色的用户直接执行特定软件包?这个包是在另一个用户的模式中定义的,可以调用第三方库。由于第三方施加的安全要求,我们需要限制它的执行。

我们知道的一个选项是DB vault。然而,看起来这个选项会影响整个数据库。

B.是否可以在软件包上定义类似访问控制列表的内容,以确保只能由指定用户使用?

比方说,User1定义了很多包,其中有一个名为securepackage1的特殊包。User2,User3和User4使用 “执行任何过程” 特权执行User1的所有包。我们是否有任何机制可以专门定义可以执行SecurePackage1软件包的用户?

谢谢,
AB

专家解答

首先要记住的是具有DBA权限的用户基本上可以在数据库中做任何事情。如果有足够的时间,总是有可能绕过你采取的任何措施。

因此,无论您采取什么步骤来限制对安全代码的访问,您还应该:

有关程序的审计执行。虽然这不会阻止人们执行有问题的程序,但你将能够找到是谁执行的。

避免向用户授予DBA!创建自定义角色,这些角色仅具有人们完成工作所需的特权。

也就是说,您可以采取一些步骤来使特权用户更难以执行安全代码。

12.1引入了访问器列表。这些定义了可以执行目标过程的程序单元的逗号分隔列表。然后只能通过列表中的一个执行该过程。

因此,您可以围绕安全包/过程创建包装器。这些可以检查在当前会话中启用了哪些角色。如果这包括DBA或您想要限制访问的任何其他内容,请引发错误以停止执行。

这是一个快速演示。我当前的用户 (Chris) 具有DBA角色。尽管拥有该过程并具有此角色,但可访问的by子句阻止我直接调用protect_me。

调用它的唯一方法是通过privileged_proc。这将检查session_roles以查看是否启用了DBA。如果是,则会引发异常。所以CHRIS & DBAU不能运行protect_me。只是U-只有创建会话并在privileged_proc上执行-可以调用它:

grant dba 
  to dbau identified by dbau;
grant create session, create procedure 
  to u identified by u;

create or replace procedure protect_me 
  accessible by ( privileged_proc )
  authid current_user
as
begin
  dbms_output.put_line ( 'Executed' );
end protect_me;
/

create or replace procedure privileged_proc 
  authid current_user
as
begin
  for r in ( 
    select * from session_roles
    where  role = 'DBA'
  ) loop
    raise_application_error ( -20001, 'Stop doing this DBA!' );
  end loop;
  chris.protect_me ();
end privileged_proc;
/

exec protect_me();

ORA-06550: line 1, column 7:
PLS-00904: insufficient privilege to access object PROTECT_ME

exec privileged_proc();

ORA-20001: Stop doing this DBA!

grant execute on privileged_proc to u;
  
conn u/u

exec chris.protect_me ();

ORA-06550: line 1, column 7:
PLS-00201: identifier 'CHRIS.PROTECT_ME' must be declared

exec chris.privileged_proc();

Executed

conn dbau/dbau

exec chris.protect_me ();

ORA-06550: line 1, column 7:
PLS-00904: insufficient privilege to access object PROTECT_ME

exec chris.privileged_proc();

ORA-20001: Stop doing this DBA!
复制

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

评论

芬芳
关注
暂无图片
获得了2次点赞
暂无图片
获得了2次收藏