【问题标题】:can we provide an oracle privilege to user which can alter only password of other user我们可以为用户提供只能更改其他用户密码的 oracle 权限吗
【发布时间】:2021-04-02 05:17:01
【问题描述】:

我创建了一个如下所示的过程。此过程存在于schema1 中,并尝试修改另一个架构/用户的密码,比如schema2。 要实现这一点,用户schema1 必须具有更改的用户权限,但由于应用程序级别的一些限制,我无法将alter user 权限提供给schema1。 我尝试在过程中使用ALTER SESSION 进行查询,但它不起作用。 有人可以帮我解决吗?

代码:

Procedure p_demo(p_schema in varchar, p_pswd in varchar2)
is
begin
execute immediate 'alter session set current_schema ='||p_schema;
execute immediate 'alter user '||p_schema||' identified by '||p_pswd;
end;

【问题讨论】:

  • 您的意思是要防止用户更改自己的密码?
  • 你能做到grant alter user to schema2吗?如果“是”,请记住,用户也可以直接在 SQL*Plus 或类似工具中修改密码,他也可以更改其他用户属性,例如轮廓。如果“否”,那么这将很困难,因为 schema1schema2 都不需要 alter user 权限。

标签: oracle privileges


【解决方案1】:

更改current_schema 不会影响权限或当前登录的用户。它只会更改对象名称解析的工作方式。如果在 current_schema 设置为 schema1 时查询对象 foo,Oracle 会在 schema1 架构中查找,而不是在当前用户的架构中查找。它无法让您访问schema1.foo 表。

我不太确定我是否理解目标。如果您试图确保只有schema2 用户可以更改schema2 用户的密码,您可以定义使用调用者权限而不是定义者权限的过程。

create or replace procedure change_my_password( p_username in varchar2, 
                                                p_password in varchar2 )
  authid current_user
is
begin
  execute immediate 'alter user '||p_username||' identified by '||p_password;
end;
/

如果目标是拥有schema1 拥有的过程并授予schema2 用户以外的用户更改schema2 密码的权限(即允许应用程序用户或帮助台用户重置用户的密码),schema1 可能需要拥有alter user 权限。否则,它可能是不可行的。

如果您真的很绝望,您可能会使用未记录的(我在这里强调未记录,随时可能更改,可能会产生奇怪的副作用,可能会使 Oracle 支持不满意)dbms_sys_sql 包。这是 APEX 在内部用于以其他用户身份运行代码的包。我不认为一个理智的 DBA 会考虑授予应用程序用户 execute 对该软件包的访问权限,而不是更(非常,非常)更安全的 alter user 权限,但是如果您正在尝试解决某些公司政策并且您'不太关心实际的安全性......

【讨论】:

    【解决方案2】:

    此示例涉及 3 个用户:

    • scott,试图更改别人的密码(那是你的schema1
    • mike,应该更改其密码(您的schema2
    • mydba,在我的数据库中被授予 DBA 角色(如果你没有这样的用户,SYS 可以,但是 - 你宁愿拥有自己的“DBA”用户,不要搞砸@ 987654327@如果你不需要)

    连接为scott,我无法修改mike的密码:

    SQL> alter user mike identified by lion;
    alter user mike identified by lion
                                  *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    

    我将以mydba 的身份连接并创建一个看起来像你的存储过程:

    SQL> connect mydba/mypwd@c11gt
    Connected.
    
    SQL> create or replace procedure p_demo (p_schema in varchar2, p_pswd in varchar2) is
      2  begin
      3    execute immediate 'alter user ' || p_schema || ' identified by ' || p_pswd;
      4  end;
      5  /
    
    Procedure created.
    
    SQL> exec p_demo('mike', 'lion');
    
    PL/SQL procedure successfully completed.
    

    好的;有用。我会将execute 权限授予scott

    SQL> grant execute on p_demo to scott;
    
    Grant succeeded.
    

    返回scott;看看他现在能做什么:

    SQL> connect scott/tiger@c11gt
    Connected.
    
    SQL> exec mydba.p_demo('mike', 'friday');
    
    PL/SQL procedure successfully completed.
    

    mike 的凭据有效吗?

    SQL> connect mike/friday@c11gt
    Connected.
    
    SQL>
    

    是的,一切都很好。


    所以:您不必将alter user 授予schema1;让它使用特权用户拥有的程序,该用户可以更改其他人的密码。

    【讨论】:

    • “mydba,谁被授予 DBA 权限”不准确。很可能您授予 DBA ROLE - 但 ROLE 授予的权限不适用于 PL/SQL 过程。因此,除了 ROLE DBA 之外,您的用户 mydba 还需要直接授予 ALTER USER 权限。但是,根据问题用户schema1(对应于您的mydba)将不会获得alter user 权限
    【解决方案3】:

    我们不能如下所示:尝试这样做,但没有成功。 我要做的基本上是给一个角色更改用户权限并将该角色分配给我的 oracle 过程。 创建角色role_name; GRANT ALTER USER TO role_name 将 role_name 上的所有权限授予过程

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多