授予 SELECT 对表的权限,而用户无需在 select 上限定所有者
granting SELECT rights to tables without the user needing to qualify the owner on select
我有很多 table,比如 Metrics
和 Results
,其中一些在一个包含大量机密信息的庞大数据库中。我要设置安全性,允许特定应用程序查看那些 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;
我有很多 table,比如 Metrics
和 Results
,其中一些在一个包含大量机密信息的庞大数据库中。我要设置安全性,允许特定应用程序查看那些 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;