【问题标题】:How SELECT ANY TABLE privilege work in Oracle?SELECT ANY TABLE 权限在 Oracle 中如何工作?
【发布时间】:2018-11-12 10:34:18
【问题描述】:

我想知道权限SELECT ANY TABLE 在 Oracle 内部是如何工作的。

它是否被视为单一特权?还是相当于为每张表做一个GRANT SELECT ON MyTable TO MyUser

例如,我想知道这是否可行:

GRANT SELECT ANY TABLE TO PUBLIC;
REVOKE ALL ON MY_TABLE FROM PUBLIC;

在这些查询之后,我仍然可以从任何用户那里访问 MY_TABLE 吗?

【问题讨论】:

  • 经过几次测试,似乎 ANY TABLE 特权被视为单个特权,但不会为每个表单独生成特权。但我想确认:p

标签: sql oracle privileges


【解决方案1】:

是的,所有用户仍然可以查询MY_TABLE

你在看不同的privilege types

用户权限的主要类型如下:

  • 系统权限——系统权限使用户能够执行特定操作,或对特定类型的任何架构对象执行操作。例如,系统权限CREATE TABLE 允许用户在与该用户关联的架构中创建表,系统权限CREATE USER 允许用户创建数据库用户。
  • 对象权限——对象权限使用户能够对特定模式对象执行特定操作。不同的对象权限可用于不同类型的模式对象。从EMPLOYEES 表中选择行或从DEPARTMENTS 表中删除行的权限是对象权限的示例。

SELECT ANY TABLE 是一个系统权限,允许被授权者:

在除SYS 之外的任何架构中查询表、视图或具体化视图。使用SELECT ... FOR UPDATE 获取行锁。

当您授予它是独立的单一权限时,在dba_sys_privs 中可见。当 Oracle 决定是否允许用户访问表时,它可以首先查看系统权限,如果没有允许操作的系统权限,则仅继续查找特定对象权限(在 dba_tab_privs 中可见)执行。

系统权限不会转换为数据库中每个对象的单独权限 - 维护这将是可怕的,因为创建一个新对象必须根据系统权限自动确定谁应该被授予权限;这意味着您无法区分该特权与单独授予的特权。因此,例如,如果您在特定表上显式授予 select privs,则用户被授予 SELECT ANY TABLE,然后他们已撤销 SELECT ANY TABLE - 之前的显式授予会发生什么情况?

您的情况基本相同,只是您已指定要撤销的对象的所有权限。如果这些是唯一涉及的两个命令,那么PUBLICMY_TABLE 没有明确的权限,所以撤销并没有真正做任何事情;但如果已授予该表的任何显式特权,则它们将被撤销。不过,这对更高级别的SELECT ANY TABLE 系统权限没有影响。

特权是累积的;撤销对特定对象的权限不会阻止对该对象的访问,它只会删除一个可能的访问路径。

顺便说一句,希望您使用了一个人为的示例,因为应该谨慎授予如此强大的系统权限和only when really needed。让任何用户查询数据库中的任何表都可能会在安全模型中造成一个大漏洞。再次from the docs:

Oracle 建议您只将ANY 权限授予受信任的用户

Oracle 建议不要将系统权限授予PUBLIC

the database security guide阅读更多内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2023-01-14
    • 2011-09-09
    • 2015-08-08
    • 2017-10-24
    相关资源
    最近更新 更多