阻止用户特权
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需要用户具有无密码特权(“需