授予 SELECT 对表的权限,而用户无需在 select 上限定所有者

granting SELECT rights to tables without the user needing to qualify the owner on select

我有很多 table,比如 MetricsResults,其中一些在一个包含大量机密信息的庞大数据库中。我要设置安全性,允许特定应用程序查看那些 table 中的数据。我不需要修改它们。总共涉及大约 200-300 table,其中包含 NOT 机密信息。

与所有其他 table 一样,指标是由数据库 owner/admin 创建的,比方说 dbo。如果我连接为 dbo,那么我可以简单地做:

select * from Metrics.

不幸的是,作为数据库所有者连接也意味着我连接的用户可以看到 所有 tables,而不仅仅是 Metrics 并且还可以更新Metrics.

我想创建一个新用户 lowprivilege 并让 dba GRANT SELECT METRICS TO lowprivilege.

不幸的是,这意味着当我以低权限连接时,我需要限定 table 所有者:

select * from dbo.Metrics.

在 Oracle 下,dba 如何能够在授予 SELECT 授权给 table 的情况下,授权的接收者无需证明 table 所有者的资格?并且低权限用户在所选 table 中不应该有任何超出 select 的权限。

备选方案 1 - 视图:

create view lowprivilege.Metrics as select * from dbo.Metrics

这是可能的,但我确实需要保留 * 通配符,因为我不知道 Metrics 中的所有列。另一个问题是,我希望每当 dbo.Metrics 重建时我的观点都会中断(这不应该经常发生)。

备选方案 2 - 创建同义词:

create or replace lowprivilege.Metrics FOR dbo.Metrics

dba 能否执行该操作并授予 SELECT 仅使用此功能?假设至少有一个 Oracle 12 版本。

备选方案 3 - GRANT SELECT 并切换模式:

GRANT SELECT METRICS TO lowprivilege

但是,每当 lowprivilege 连接时,它都会使用 alter session set current_schema=dbo。请注意,这需要在 SQLAlchemy /cx-Oracle 下成为可能。

此外,如果 dba 可以通过 DROP USER lowprivilege CASCADE.

关闭所有内容,那就太好了

实现此目标的最佳方法是什么?

备选方案 #2 - 创建同义词。这正是同义词的用途。

grant read on dbo.Metrics to lowprivilege;
create or replace synonym lowprivilege.Metrics FOR dbo.Metrics;

请注意使用 GRANT READ 而不是 GRANT SELECT。具有 SELECT 权限的用户仍然可以锁定 table。 READ 特权阻止了这种情况。

如果应用程序在连接时可以发出这样的命令,您就可以避免使用同义词:

alter session set current_schema = HR;

现在 SQL 解析器将首先检查 HR 模式是否存在不合格的对象名称。

与其直接向 LOWPRIVILEGE 用户授予权限,不如创建一个角色并向其授予权限,然后将该角色授予一个或多个应用程序用户帐户。当有多个用户时,这会简化事情,并提供一定程度的自我记录,因为角色可以有逻辑名称。

grant read on metrics to readonly;

grant readonly to some_app_account;