如何阻止用户对 Db2 中的表执行选择查询?

Posted

技术标签:

【中文标题】如何阻止用户对 Db2 中的表执行选择查询?【英文标题】:How to block a user from executing select queries on a table in Db2? 【发布时间】:2020-05-11 04:47:15 【问题描述】:

我有一个数据库“SAMPLE”,我需要在其中阻止用户“DB2ADMIN”执行

SELECT * FROM SYSIBMADM.DBMCFG

我已经试过了

REVOKE SELECT ON TABLE SYSIBMADM.DBMCFG FROM USER DB2ADMIN

我收到错误 SQL0556N 和消息“DB2ADMIN 不持有此特权”,这意味着它不应该首先工作。

当我使用该帐户登录并执行上述查询时,我仍然能够获得选择查询结果。有人可以建议一种方法来做到这一点。

【问题讨论】:

【参考方案1】:

查看administrative view (not table) SYIDBMADM.DBMCFG 的文档。它声明如下:

需要以下授权之一:

DBMCFG 管理视图上的 SELECT 权限 DBMCFG 管理视图的 CONTROL 权限 DATAACCESS 权限 DBADM 权限 SQLADM 权限

因此,该用户可能没有 SELECT 权限,但可能具有 DBADM 权限。给定用户名,我可能猜对了就是这种情况。撤销该用户的 DBADM 权限并再次测试。

如果这没有帮助,请尝试了解有关该用户(ID)的更多信息。使用过程AUTH_LIST_GROUPS_FOR_AUTHID、AUTH_LIST_AUTHORITIES_FOR_AUTHID和PRIVILEGES获取安全相关信息。

【讨论】:

我删除了上述所有内容,我使用了REVOKE DATAACCESS ON DATABASE FROM USER DB2ADMIN(其他两个权威机构也是如此)但我无法做到。 我添加了更多提示。【参考方案2】:

以下查询为您提供有关为什么您的DB2ADMIN 用户在SYSIBMADM.DBMCFG 视图上拥有SELECTCONTROL 权限(如果有)的信息。

SELECT  
  P.PRIVILEGE, U.AUTHID, U.AUTHIDTYPE
FROM SYSIBMADM.PRIVILEGES P
CROSS JOIN (VALUES 'DB2ADMIN') A (AUTHID)
JOIN TABLE 
(
SELECT GROUP, 'G' FROM table(AUTH_LIST_GROUPS_FOR_AUTHID(A.AUTHID))
  UNION ALL
select ROLENAME, 'R' from table(AUTH_LIST_ROLES_FOR_AUTHID(A.AUTHID, 'U'))
  UNION ALL
SELECT * FROM TABLE(VALUES ('PUBLIC', 'G'), (A.AUTHID, 'U')) T (AUTHID, AUTHIDTYPE)
) U (AUTHID, AUTHIDTYPE) ON U.AUTHID=P.AUTHID AND U.AUTHIDTYPE=P.AUTHIDTYPE
WHERE P.OBJECTSCHEMA = 'SYSIBMADM' AND P.OBJECTNAME = 'DBMCFG' 
AND P.PRIVILEGE IN ('SELECT', 'CONTROL');

以下查询为您提供有关为什么您的DB2ADMIN 用户具有足以从此视图中选择的 DATAACCESS、DBADM、SQLADM、SECADM 或 ACCESSCTRL 权限之一(如果有)的信息。 更新 请注意,SYSIBMADM.DBMCFG 的 Authorization list 不正确。它是系统目录视图之一,具有SECADM 或ACCESSCTRL 数据库权限的用户可以访问此视图。因此,我们需要另外检查这两个用户权限。

SELECT 
  P.GRANTEE, P.GRANTEETYPE
, P.DATAACCESSAUTH, P.DBADMAUTH, P.SQLADMAUTH, P.SECURITYADMAUTH, P.ACCESSCTRLAUTH
FROM SYSCAT.DBAUTH P
CROSS JOIN (VALUES 'DB2ADMIN') A (AUTHID)
JOIN TABLE 
(
SELECT GROUP, 'G' FROM table(AUTH_LIST_GROUPS_FOR_AUTHID(A.AUTHID))
  UNION ALL
select ROLENAME, 'R' from table(AUTH_LIST_ROLES_FOR_AUTHID(A.AUTHID, 'U'))
  UNION ALL
SELECT * FROM TABLE(VALUES ('PUBLIC', 'G'), (A.AUTHID, 'U')) T (AUTHID, AUTHIDTYPE)
) U (AUTHID, AUTHIDTYPE) ON U.AUTHID=P.GRANTEE AND U.AUTHIDTYPE=P.GRANTEETYPE
WHERE 'Y' IN (P.DATAACCESSAUTH, P.DBADMAUTH, P.SQLADMAUTH, P.SECURITYADMAUTH, P.ACCESSCTRLAUTH);

【讨论】:

两者都返回空结果,感谢您努力创建查询 您使用的 Db2 版本是什么? 最新版本(11.5) 然后通过 IBM 支持打开一个案例。如果上面的这两个查询都在DB2ADMIN 上返回空结果,那么根据文档,这个用户一定不能从这个视图中选择。 伙计,如果这不能锻炼,那么你能告诉我如何创建一个没有特权或权限的用户来对 Windows 10 中的任何表执行选择查询,即使这会涵盖我的目的,即测试没有选择表权限的用户

以上是关于如何阻止用户对 Db2 中的表执行选择查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何查询db2数据库表是不是被锁

如何查询一个ACCESS数据库中的表名和字段?

db2如何查询表结构

如何在 IBM DB2 中的导出结果中也包含列标题

如何查看 db2 服务器中最近更新的表?

Jpa , Hibernate 选择查询优化