如何阻止用户在 Db2 中对 table 执行 select 查询?

How to block a user from executing select queries on a table in Db2?

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

SELECT * FROM SYSIBMADM.DBMCFG

我已经试过了

REVOKE SELECT ON TABLE SYSIBMADM.DBMCFG FROM USER DB2ADMIN

我收到错误 SQL0556N 和消息 "DB2ADMIN does not hold this privilege",这意味着它本来就不应该工作。

当我使用该帐户登录并执行上述查询时,我仍然能够获得 select 查询结果。有人可以提出解决方法吗?

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

One of the following authorizations is required:

  • SELECT privilege on the DBMCFG administrative view
  • CONTROL privilege on the DBMCFG administrative view
  • DATAACCESS authority
  • DBADM authority
  • SQLADM authority

所以有问题的用户可能没有 SELECT 权限,但可能有 DBADM 权限。鉴于用户名,我可能猜对了。撤销该用户的 DBADM 权限并再次测试。

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

以下查询向您提供有关 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 权限之一(如果有)足以从此视图 select 的信息。 更新
请注意,Authorization list for SYSIBMADM.DBMCFG is not correct. It's one of the system catalog views, and one having SECADM or 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);