在 Linux 上的 Db2 v11.5 上,我有几个数据库,其中包含 MYSCHEMA 模式中的数百个表。
要求
a) 我需要为 MYSCHEMA 模式中的所有表分配 SELECT 权限,但不包括用户不得访问的特定表 MYSCHEMA.NO_ACCESS。
b) 如果在 MYSCHEMA 模式中创建了新表,我需要手动在新表上添加 GRANT SELECT。我希望在创建新表时避免任何类型的安全管理。
c) 当我们从审计公司进行审计时,需要简单地提供一些用户拥有和不拥有哪些访问权限的信息。拥有数百个授权很难向用户表明他们确实只拥有他们需要的访问权限。
当前解决方案
目前,我们授予除表 MYCHEMA.NO_ACCESS 之外的所有表的选择权限,如下所示:
GRANT SELECT ON TABLE MYSCHEMA.TAB1 TO GROUP GROUP1
GRANT SELECT ON TABLE MYSCHEMA.TAB2 TO GROUP GROUP1
...
GRANT SELECT ON TABLE MYSCHEMA.TAB5000 TO GROUP GROUP1
(make sure there is no MYSCHEMA.NO_ACCESS on grant list)
上述方法有局限性,当在 MYSCHEMA 模式中创建新表时,我需要在新表上设置 GRANT SELECT。
另外,在审计时由于有大量的权限,很难证明用户确实只拥有他们应该拥有的权限。
如果可能的话,采取新方法
Db2 v11.5 对模式具有 GRANT SELECTIN 权限。
有没有类似的东西:
GRANT SELECTIN ON SCHEMA MYSCHEMA TO GROUP GRUP1
DENY SELECT ON TABLE MYSCHEMA.NO_ACCESS TO GROUP GROUP1
拒绝比授予更重要。
或者还有其他方法吗?
您可以在此表上创建行权限。
您必须根据引发异常的标准函数创建一个安全函数:
使用此功能:
如果当前用户是 的成员
GROUP1
,那么 DB2 会在尝试访问此表时引发 SQLCODE = -438 和 SQLSTATE = '75000' 异常。表达式计算结果为 TRUE,允许访问非 成员的相应表GROUP1
。在这种“错误”的访问尝试中,您不会得到标准 SQLCODE = -551,但我认为这并不重要……
更新
此外,您甚至可以让 DB2 在这种访问中引发 SQLCODE = -551 的异常。
您需要
SYSIBMINTERNAL.SQLEML_RAISE_ERROR
为此使用未记录的例程。将其包装到标量函数中:
并在行权限表达式中使用它,如下所示:
然后,您会收到标准 SQLCODE/SQLSTATE 的异常。
请注意,您必须使用编译函数
RAISE_ERROR_MY
(不带 ATOMIC 子句)。无论如何,它都会CASE
在行权限表达式中内部调用,否则会引发意外异常。您当然是对的,只有被授予的权限才可以撤销。虽然这不是您问题的确切答案,但您可以使用类似这样的解决方法(我添加了撤销和处理程序,用于处理用户没有选择身份验证的情况):
作为 db2fenc1:
我现在明白那是一个群组,而不是一个用户,但这留给读者作为练习;-)
如果这不合适,您可能需要查看行访问控制,用户(在我的情况下是 db2fenc1)可以从表中选择,但看不到任何行。您可以在行和列访问控制 (RCAC) 概述中找到更多信息
这只是一个愚蠢的例子:
db2fenc1 看到的内容