【问题标题】:Direct privilege grant vs ALL PRIVILEGES vs roles vs PUBLIC直接权限授予 vs ALL PRIVILEGES vs 角色 vs PUBLIC
【发布时间】:2016-04-24 16:29:42
【问题描述】:

1/ 据我所知,直接privilegegrant 和ROLEgrant 和PUBLICgrant 是独立的,这意味着所有三个都可以拥有相同的特权。从一个撤消不会干扰该特权仍然保留在用户手中。 意思是如果我们

GRANT SELECT ON T TO userA
GRANT SELECT ON T TO roleA; GRANT roleA to userA
GRANT SELECT on T TO PUBLIC

撤销 3 项授权中的一项或两项会使 userA 拥有SELECT 权限。 ALL PRIVILEGES 怎么样,它是否与这 3 个 zones 中的任何一个重叠?如果我们有上面和下面的 3 个赠款

GRANT ALL PRIVILEGES on T to userA;

然后我们

REVOKE ALL PRIVILEGES on T to userA;

3 项授权中的哪一项将被额外删除?系统权限和对象权限的行为是否相同?

2/ 有一个GRANT ANY PRIVILEGEGRANT ALL PRIVILEGE*S*。它们是一样的吗?

【问题讨论】:

    标签: sql oracle oracle11g database-security


    【解决方案1】:

    根据文档“Oracle 数据库提供了 ALL PRIVILEGES 快捷方式,用于授予表 18-1 中列出的所有系统权限,SELECT ANY DICTIONARY 权限除外。”您的示例不是系统特权,因此没有重叠。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

    对于GRANT ANY PRIVILEGE,这授予用户依次授予其他用户系统权限的能力。例如:

    dba@db> GRANT GRANT ANY PRIVILEGE to some_user;
    grant succeeded 
    

    以 some_user 身份重新连接。此用户现在可以将系统授权传递给 some_other_user。

    some_user@db> GRANT COMMENT ANY TABLE to some_other_user;
    grant succeeded
    

    这似乎是您想要授予用户部分 dba 权限并且应谨慎使用时要使用的权限

    相比之下,ALL PRIVILEGES 更像是一个宏,它一次授予所有单个系统权限,所以

    GRANT ALL PRIVILEGES to some_user; 
    

    就像为所有系统权限运行授权语句(并且有很多):

    GRANT ADVISOR TO some_user;
    GRANT ADMINISTER SQL TUNING SET TO some_user;
    GRANT ADMINISTER ANY SQL TUNING SET TO some_user;
    GRANT CREATE ANY SQL PROFILE TO some_user;
    GRANT DROP ANY SQL PROFILE TO some_user;
    GRANT ALTER ANY SQL PROFILE TO some_user;
    etc...
    

    编辑: 在上面的链接中,在 grant_object_privileges 部分下还有:

    所有[特权]

    指定 ALL 以授予您拥有的对象的所有权限 被授予 GRANT OPTION。拥有架构的用户 包含对象自动拥有该对象的所有权限 使用 GRANT 选项。为语义提供关键字 PRIVILEGES 清晰度,是可选的。

    如果你做类似的事情

    GRANT ALL PRIVILEGES on some_table TO some_user; 
    

    该用户获得所有这些表权限(至少这是我在 12c 中获得的列表):

    FLASHBACK
    DEBUG
    QUERY REWRITE
    ON COMMIT REFRESH
    READ
    REFERENCES
    UPDATE
    SELECT
    INSERT
    INDEX
    DELETE
    ALTER
    

    对于你得到的序列:

    SELECT
    ALTER
    

    (并且其他对象类型将有自己的列表。)

    因此,它就像系统权限的 ALL PRIVILEGES 一样,因为它是授予指定对象类型的所有对象权限的快捷方式;您没有获得任何“ALL PRIVILEGES”特权。对于表,这就像为上面列出的 12 种权限输入授权语句:

    GRANT FLASHBACK on ...
    GRANT DEBUG on ...
    GRANT QUERY REWRITE on ...
    

    这些权限中的每一项都可以单独撤销。所以如果你这样做了:

    REVOKE INSERT, UPDATE, DELETE on some_table FROM some_user;
    

    您仍将拥有上表权限中的其他 9 项权限。

    如果您在 REVOKE 中使用“ALL PRIVILEGES”:

    REVOKE ALL PRIVILEGES on some_table FROM some_user; 
    

    它将带走 some_user 在上面列表中的 some_table 上剩余的任何表权限。

    所以,长话短说,这里有一个 SQL 示例来显示您原始问题的答案(表 T 的所有者是 USERT):

    SQL> create table t (a varchar2(1));
    
    Table created.
    
    SQL> grant select on t to userA;
    
    Grant succeeded.
    
    SQL> select grantor
      2       , grantee
      3       , table_schema
      4       , table_name
      5       , privilege
      6    from all_tab_privs
      7   where table_name = 'T'
      8   order by grantee;
    
    GRANTOR    GRANTEE    TABLE_SCHEMA TABLE_NAME PRIVILEGE
    ---------- ---------- ------------ ---------- --------------------
    USERT      USERA      USERT        T          SELECT
    
    SQL>
    SQL> grant select on t to roleA;
    
    Grant succeeded.
    
    SQL> select grantor
      2       , grantee
      3       , table_schema
      4       , table_name
      5       , privilege
      6    from all_tab_privs
      7   where table_name = 'T'
      8   order by grantee;
    
    GRANTOR    GRANTEE    TABLE_SCHEMA TABLE_NAME PRIVILEGE
    ---------- ---------- ------------ ---------- --------------------
    USERT      ROLEA      USERT        T          SELECT
    USERT      USERA      USERT        T          SELECT
    
    SQL> grant select on t to public;
    
    Grant succeeded.
    
    SQL> select grantor
      2       , grantee
      3       , table_schema
      4       , table_name
      5       , privilege
      6    from all_tab_privs
      7   where table_name = 'T'
      8   order by grantee;
    
    GRANTOR    GRANTEE    TABLE_SCHEMA TABLE_NAME PRIVILEGE
    ---------- ---------- ------------ ---------- --------------------
    USERT      PUBLIC     USERT        T          SELECT
    USERT      ROLEA      USERT        T          SELECT
    USERT      USERA      USERT        T          SELECT
    
    SQL> grant all privileges on t to userA;
    
    Grant succeeded.
    
    SQL> select grantor
      2       , grantee
      3       , table_schema
      4       , table_name
      5       , privilege
      6    from all_tab_privs
      7   where table_name = 'T'
      8   order by grantee;
    
    GRANTOR    GRANTEE    TABLE_SCHEMA TABLE_NAME PRIVILEGE
    ---------- ---------- ------------ ---------- --------------------
    USERT      PUBLIC     USERT        T          SELECT
    USERT      ROLEA      USERT        T          SELECT
    USERT      USERA      USERT        T          INDEX
    USERT      USERA      USERT        T          INSERT
    USERT      USERA      USERT        T          ALTER
    USERT      USERA      USERT        T          SELECT
    USERT      USERA      USERT        T          FLASHBACK
    USERT      USERA      USERT        T          DELETE
    USERT      USERA      USERT        T          REFERENCES
    USERT      USERA      USERT        T          READ
    USERT      USERA      USERT        T          ON COMMIT REFRESH
    USERT      USERA      USERT        T          QUERY REWRITE
    USERT      USERA      USERT        T          DEBUG
    USERT      USERA      USERT        T          UPDATE
    
    14 rows selected.
    
    SQL> REVOKE ALL PRIVILEGES on T from userA;
    
    Revoke succeeded.
    
    SQL> select grantor
      2       , grantee
      3       , table_schema
      4       , table_name
      5       , privilege
      6    from all_tab_privs
      7   where table_name = 'T'
      8   order by grantee;
    
    GRANTOR    GRANTEE    TABLE_SCHEMA TABLE_NAME PRIVILEGE
    ---------- ---------- ------------ ---------- --------------------
    USERT      PUBLIC     USERT        T          SELECT
    USERT      ROLEA      USERT        T          SELECT
    

    因此 REVOKE ALL PRIVILEGES 命令从 userA 中删除了表 T 上的所有直接授权,但该用户仍将通过 grant select to roleA(假设 userA 已被授予角色)或 grant select to public 拥有 SELECT 权限.

    【讨论】:

    • 1.我不明白你的第一点。 ALL PRIVILEGES on object 和直接权限之间至少有重叠。 docs.oracle.com/database/121/SQLRF/… 撤销用户的对象特权:示例部分。 2.GRANT ALL PRIVILEGES 确实适用于对象。
    • 1.对不起,但我不明白你在这里想说什么。在撤销用户的对象权限:示例下,它只是说“您可以使用以下语句将表订单上的 DELETE、INSERT、READ、SELECT 和 UPDATE 权限授予用户 hr……”这些不是系统权限.此处列出了系统权限:docs.oracle.com/cd/B28359_01/server.111/b28286/… 至于 2)“对对象有效”是什么意思?能举个例子吗?
    • 1/您提到您的示例不是系统权限,因此没有重叠。我的例子不是系统权限,没错。并且根据我的链接存在重叠:用户被赋予 ALL PRIVILEGES 并且 DELETE 被撤销,仍然让他拥有其他特权。这说明了我的观点,即有重叠。如果它们是独立的,就会发生用户同时拥有DELETE权限和ALL PRIV权限,单独撤销DELETE会留下ALL PRIV 完好无损。
    • 2/ _ ALL PRIVILEGES 更像是一个宏,它一次性授予所有单个系统权限_但对象有 ALL PRIVILEGES将 T 上的所有特权授予 A
    • 对不起,我之前的回答不完整。请查看更新后的版本,如果您正在寻找它,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2018-10-11
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2017-09-08
    • 2011-04-02
    • 2018-07-28
    相关资源
    最近更新 更多