向表授予SELECT权限,而用户无需使所有者拥有选择权

时间:2019-04-26 22:43:20

标签: oracle sqlalchemy grant

我有许多表,例如MetricsResults,其中的一些表是在具有大量机密信息的大型数据库中。我设置安全性,以允许特定的应用程序查看那些表中的数据。我不需要修改它们。总共约有200-300张桌子,其中包含保密的信息。

与所有其他表一样,度量标准是由数据库所有者/管理员创建的,例如dbo。如果我以dbo的身份连接,则可以轻松完成以下操作:

select * from Metrics

不幸的是,以数据库所有者的身份进行连接也意味着我连接的用户可以看到所有表,而不仅仅是Metrics,还可以更新Metrics

我想创建一个新用户lowprivilege,并拥有dba GRANT SELECT METRICS TO lowprivilege

不幸的是,这意味着我必须以低特权身份连接表所有者:

select * from dbo.Metrics

在Oracle下,dba如何在不授予表所有者资格的情况下将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 METRICS TO lowprivilege

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

此外,如果dba可以仅通过DROP USER lowprivilege CASCADE关闭所有内容,那就太好了。

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

2 个答案:

答案 0 :(得分:3)

替代#2-创建同义词。这正是同义词的意思。

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

注意使用GRANT READ代替GRANT SELECT。具有SELECT特权的用户仍可以锁定表。 READ特权可以防止这种情况。

答案 1 :(得分:1)

如果应用程序在连接时可以发出如下命令,则可以避免同义词:

alter session set current_schema = HR;

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

您可以创建一个角色并为其授予特权,然后将该角色授予一个或多个应用程序用户帐户,而不是直接向LOWPRIVILEGE用户授予特权。当有多个用户时,这可以简化操作,并提供一定程度的自我文档记录,因为角色可以具有逻辑名称。

grant read on metrics to readonly;

grant readonly to some_app_account;