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

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

SELECT * FROM SYSIBMADM.DBMCFG

我已经试过了

REVOKE SELECT ON TABLE SYSIBMADM.DBMCFG FROM USER DB2ADMIN

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

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

【问题讨论】:

    标签: sql linux db2 ibm-cloud db2-luw


    【解决方案1】:

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

    需要以下授权之一:

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

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

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

    【讨论】:

    • 我删除了上述所有内容,我使用了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.DBMCFGAuthorization list 不正确。它是系统目录视图之一,具有SECADMACCESSCTRL 数据库权限的用户可以访问此视图。因此,我们需要另外检查这两个用户权限。

    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 中的任何表执行选择查询,即使这会涵盖我的目的,即测试没有选择表权限的用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多