技术开发 频道

★DB2 Viper 2 中可帮助企业成长的新特性



【IT168分析评论】 

    【聆听IT专家讲座,了解如何降低数据管理成本,更有机会获得限量蓝牙耳机!】

    【了解更多数据管理产品信息。】

3. 数据库角色

随着企业中雇员人数的增长,维护对数据的适当访问控制成为一项挑战。如果企业周转较快,或者人员调动频繁,那么这个问题就更为棘手。直观的想法是将特权或权限与一个组或个人相关联,需要这组特权或权限的组或个人可以从外部通过系统管理员请求成为这个组的成员。

这个想法从理论上看还可以。但是,有两个缺点:

  • 需要系统管理员(如果您没有这些角色)定义组并为必须属于该组的每个人赋予从属关系。
  • 存在一些限制,授给一个组的权限或特权不被认同。 要获得关于这些限制的更多信息,请参阅 参考资料 小节中 “Understanding DB2 9 security” 的 “Group privileges restriction” 小节。

3.1 数据库角色简介

对于数据库角色,最简单的描述是 “在数据库组中”。对角色的更正式的定义是 “可以将一个或多个特权或数据库权限组在一起,并且可以授予给用户、组、PUBLIC 或其他角色的一个数据库对象”。

数据库角色可用于填补外部组关系留下的鸿沟。数据库安全管理员对角色从属关系有严密的控制。注意,默认情况下数据库管理员或系统管理员并不拥有数据库安全管理员权限。必须由 DBA 或 SYSADM 将数据库安全管理员权限授给个人。

与组特权不同,与角色相关联的特权在特权或权限检查期间也会被考虑。但是,被授给一个组的与一个角色相关联的特权与组特权具有相同的限制。

角色从属关系由数据库安全管理员来管理。在授予角色从属关系时,数据库安全管理员可以选择将这项能力授权给其他人。例如,如果数据库安全管理员想要用户 henry(授权 ID 为 HENRY)来管理 ROLE CE_SECURITY,并使之成为那个角色的成员。下面的 SQL 语句可以同时执行这两个任务:

    GRANT ROLE CE_SECURITY TO USER HENRY WITH ADMIN OPTION
            

如果只授予从属关系,那么可以忽略 WITH ADMIN OPTION 子句。当从一个用户、组或角色那里收回角色从属关系时,管理 “被回收” 角色的能力也随之被撤销。

实例级权限:SYSADM、SYSMAINT、SYSCTRL 和 SYSQUIESCE 不能赋给一个角色。对于这些权限,仍然必须依赖于外部组从属关系。

在数据库连接建立期间,同时会获得角色从属关系(和组从属关系)。成功地认证之后,授给连接用户的任何角色都会自动激活。在 DB2 Viper 2 中,没有任何方法可以显式地启用或禁用任何被授予的角色。

在 DB2 Viper 2 中,有两个新的表函数可用于获得特权和权限信息。AUTH_LIST_ROLES_FOR_AUTHID 表函数返回给定授权 ID 所属角色的列表。而 AUTH_LIST_AUTHORITIES_FOR_AUTHID 表函数则返回授权 ID 直接或间接被授予的所有权限(该函数用于替代被弃用的 GET AUTHORIZATIONS 命令和 sqluadau API)。

在医院场景中,角色 INTERN 被授给角色 DOCTOR,而角色 DOCTOR 又被授给角色 SPECIALIST,然后角色 SPECIALIST 被授给用户 JUSTIN。JUSTIN 属于组 STAFF,而角色 EMPLOYEE 被授给组 STAFF。JUSTIN 还属于一个特殊的组 PUBLIC,并且角色 VISITOR 被授给 PUBLIC。检索被授给用户 Justin 的所有角色。清单 3 显示关于如何使用 AUTH_LIST_ROLES_FOR_AUTHID 表函数获得被授给某个授权 ID 的所有角色从属关系的语法。


清单 3. AUTH_LIST_ROLES_FOR_AUTHID 表函数上相同的查询和输出

            SELECT substr(1, 7, GRANTOR) as GRANTOR, GRANTORTYPE, substr(1, 10, GRANTEE) as GRANTEE,
            GRANTEETYPE, substr(1, 10, ROLENAME) as ROLENAME, ADMIN FROM
            TABLE (SYSPROC.AUTH_LIST_ROLES_FOR_AUTHID ('JUSTIN', 'U') ) AS T
            GRANTOR GRANTORTYPE GRANTEE    GRANTEETYPE ROLENAME   ADMIN
            ------- ----------- ---------- ----------- ---------- -----
            SECADM1 U           DOCTOR     R           INTERN     N
            SECADM1 U           SPECIALIST R           DOCTOR     N
            SECADM1 U           JUSTIN     U           SPECIALIST N
            SECADM2 U           STAFF      G           EMPLOYEE   N
            SECADM3 U           PUBLIC     G           VISITOR    N
            

假设用户授权 ID ‘SEE’ 是实例所有者。清单 4 显示了关于如何使用 AUTH_LIST_AUTHORITIES_FOR_AUTHID 表函数获得给定授权 ID 的数据库和实例级权限的语法。


清单 4. AUTH_LIST_AUTHORITIES_FOR_AUTHID 表函数上相同的查询和输出

            SELECT * FROM TABLE (SYSPROC.AUTH_LIST_AUTHORITIES_FOR_AUTHID ('SEE', 'U') ) AS T
            ORDER BY AUTHORITY
            AUTHORITY                 D_USER D_GROUP D_PUBLIC ROLE_USER ROLE_GROUP ROLE_PUBLIC D_ROLE
            ------------------------- ------ ------- -------- --------- ---------- ----------- ------
            BINDADD                   Y      N       Y        N         N          N           *
            CONNECT                   Y      N       Y        N         N          N           *
            CREATE_EXTERNAL_ROUTINE   Y      N       N        N         N          N           *
            CREATE_NOT_FENCED_ROUTINE Y      N       N        N         N          N           *
            CREATETAB                 Y      N       Y        N         N          N           *
            DBADM                     Y      N       N        N         N          N           *
            IMPLICIT_SCHEMA           Y      N       Y        N         N          N           *
            LOAD                      Y      N       N        N         N          N           *
            QUIESCE_CONNECT           Y      N       N        N         N          N           *
            SECADM                    N      N       N        N         N          N           *
            SYSADM                    *      Y       *        *         *          *           *
            SYSCTRL                   *      N       *        *         *          *           *
            SYSMAINT                  *      N       *        *         *          *           *
            SYSMON                    *      N       *        *         *          *           *
            


3.2 角色层次和组织图

只要不会导致循环,就可以将角色的从属关系授给另一个角色。可以创建一个角色层次,以便将组织图和对于一个 “任务角色” 相同的相关特权和权限映射到一个角色对象。然后,就可以将那个角色对象的从属关系授给被归为在一个特定 “任务角色” 中的任何用户。显然,通过将角色的从属关系授给 USER、GROUP 或 PUBLIC,仍然可以接收对特权或权限的附加需求。


3.3 角色和 LBAC

作为对基于标签的访问控制(LBAC)的 DB2 Viper 2 数据库角色增强的一部分,可以对一个角色或组授予或收回安全标签或豁免权。默认情况下,在创建策略时,不会考虑被授给一个角色或组的安全标签上的特权或豁免权。为了启用它们,需要使用新的 ALTER SECURITY POLICY 语句修改安全策略。


3.4 示例场景

下面来看看一个简单的场景。


图 2. 示例组织图



给定图 2 中所示的一个组织结构,用户可能属于以下几种类型之一:Director、System Test Manager、Functional Test Manager、Integration Test Manager 或三个测试领域中某一领域的测试者。

对于一家质量保证组织来说,一个常见的挑战是收集整个测试状况和进展。假设该组织使用一种像 IBM® Rational® Enterprise ClearQuest® test management 这样的工具,该工具执行测试并将测试结果存储到一个后端 DB2 数据库中。

显然,主管应该能够看到整个进展,而测试者只需看到自己的进展。通过构建一个映射组织图的角色层次,并授予对表中所需数据的访问权,主管(被授予角色 DIRECTOR)可自动看到数据。

为构建这个角色层次,应该执行下面的 SQL 语句:

CREATE ROLE DIRECTOR
            CREATE ROLE SVT_MANAGER
            CREATE ROLE FVT_MANAGER
            CREATE ROLE INTEGRATION_MANAGER
            CREATE ROLE SVT_TESTER
            CREATE ROLE FVT_TESTER
            CREATE ROLE INTEGATION_TESTER
            GRANT ROLE SVT_MANAGER TO DIRECTOR
            GRANT ROLE FVT_MANAGER TO DIRECTOR
            GRANT ROLE INTEGRATION_MANAGER TO DIRECTOR
            GRANT ROLE INTEGATION_TESTER TO INTEGRATION_MANAGER
            GRANT ROLE FVT_TESTER TO FVT_MANAGER
            GRANT ROLE SVT_TESTER TO SVT_MANAGER
            

假设有一个底层的基本表,它存储每个测试者的所有测试用例名称(NAME)、测试结果(VERDICT)、相关缺点(DEFECTS)和评论(NOTES)。造就这个链的惟一相关信息是列 VERDICT。

每个测试者将 VERDICT 列上的 SELECT 授给他们所属的角色。例如,测试者 KEVIN 输入:

GRANT SELECT ON TABLE KEVIN.MYTEST (VERDICT) TO ROLE FVT_TESTER.
            

然后,管理层可以访问所有测试结果,并且可以做类似下面的一些事情,以推断出总体成功率。

VALUES ((
            SELECT SUM(VERDICT) FROM KEVIN.MYTEST,... all the other tester table ....
            WHERE VERDICT = 'PASS') / (
            SELECT SUM(VERDICT) FROM KEVIN.MYTEST,... all the other tester table .... ))
            

0
相关文章