如何阻止用户在 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
视图具有 SELECT
或 CONTROL
权限(如果有)的信息。
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);
我有一个数据库 '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
视图具有 SELECT
或 CONTROL
权限(如果有)的信息。
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);