阻止用户特权

Posted

技术标签:

【中文标题】阻止用户特权【英文标题】:Prevent privileges for user 【发布时间】:2019-06-05 11:24:18 【问题描述】:

有没有办法阻止(撤销)特权,例如:

create table, create package, create function等等,

来自用户在其自己的架构中,但允许他为其他用户执行这些操作。

示例:

-- connected as DP1

-- will raise an exception
create table dp1.tst (id number);


-- no exception
create table dp2.tst (id number);

谢谢。

【问题讨论】:

您是否要求类似this? 为什么要授予用户DP1 在架构DP2 中创建表? 【参考方案1】:

一般来说这是不可能的。

您可以授予像GRANT CREATE TABLE TO DP1 这样的权限,它允许用户 DP1 在他自己的模式中创建表。

或者您可以授予像 GRANT CREATE ANY TABLE TO DP1 这样的权限,它允许用户 DP1 在任何架构中创建表 - 当然包括他自己的架构。

一个解决方案可能是这样的过程:

create or replace procedure DP2.create_table(ddl in varchar2) as

begin
   if regexp_like(ddl, '^CREATE TABLE DP2.', 'i') then
      execute immediate ddl;
   end if; 
end;
/

grant execute on DP2.create_table to DP1;

但是,我认为这是一个丑陋的解决方法。 execute immediate ddl 会产生潜在的安全漏洞,并且该过程容易出错。

另一种方法可能是Database Trigger:

GRANT CREATE ANY TABLE TO DP1;

CREATE OR REPLACE TRIGGER CREATE_TABLE_CHECK
   BEFORE CREATE ON DATABASE 
BEGIN
   IF ora_login_user = 'DP1' THEN
       IF NOT (ora_dict_obj_owner = 'DP2' AND ora_dict_obj_type = 'TABLE') THEN
          RAISE_APPLICATION_ERROR(-20001, 'You are permitted only to create TABLES in schema "DP2"');
       END IF;
   END IF;
END;

但您应该更好地审查您的设计要求。

【讨论】:

【参考方案2】:

正如@Wernfried 解释的那样,您可以从 DP1 撤消这些权限,但随后允许他们管理 DP2 下的对象会很麻烦。您还可以将 CREATE ANY 权限与 DDL 触发器一起使用,该触发器会针对 DP1 架构运行 DDL 的错误,但这更加麻烦,并且应该避免一般使用 ANY 权限,因为它们非常强大。

您可以改为设置代理身份验证:

alter user DP2 grant connect through DP1;

然后代替DP1连接说:

sqlplus dp1/dp1passwd@db

然后可以连接为:

sqlplus dp1[dp2]/dp1passwd@db

他们不需要知道 DP2 的帐户密码 - 他们仍然使用自己的自己的帐户密码进行身份验证。直通代理机制意味着它们现在作为 DP2 处于会话中,符合所有意图和目的。任何 DDL 都将违反 DP2 的模式,并且审计跟踪可以显示这些操作是通过代理执行的以及真实用户(即 DP1)是谁。他们将拥有 DP2 的角色和权限,因此他们将能够管理该架构中的对象,即使他们对自己的帐户没有创建权限。

他们甚至无法在自己的 DP1 架构中看到任何内容(除非他们已将权限授予 DP2);但由于在这种情况下他们不拥有任何东西,这有点争议。

当然,这不仅适用于 SQL*Plus,您还可以通过 OCI、JDBC 等使用它。

Read more.

【讨论】:

以上是关于阻止用户特权的主要内容,如果未能解决你的问题,请参考以下文章

强制 c# windows 服务始终作为系统运行,并且不允许非特权用户停止/启动

保护特权用户帐户的九个最佳实践

撤销 Oracle 中的特权会影响使用这些特权的正在进行的事务吗?

Cloudera安装未能检测到CentOS上的root特权我试图将新主机添加到CentOS集群中。安装失败,状态为“安装失败。无法检测root特权”。我知道Cloudera需要用户具有无密码特权(“需

以特权用户身份运行 Windows 服务

python 通知用户以特权用户身份运行命令