Skip to content

DB2 - 角色

在现代数据库管理中,角色是命名权限的集合。您不是将单个权限(如 SELECT、INSERT 等)授予每个用户,而是将它们授予角色。然后,您可以将角色授予用户,甚至授予其他角色。这种方法被称为基于角色的访问控制(RBAC),它是最小权限原则的基石,简化了安全管理并降低了错误风险。

  • 所有权:角色不能拥有表或视图等数据库对象。所有权始终分配给用户(授权 ID)。
  • 静态 SQL 考量:当创建包含静态 SQL(例如视图、MQT、触发器或 SQL 例程)的对象时,Db2 会直接检查对象创建者的权限。通过角色授予的权限在创建这些特定对象时不会被考虑,除非正在使用可信上下文(一种高级安全功能)。

让我们来看一个常见场景:为业务分析师设置一个只读角色。

首先,具有 SECADM(安全管理员)权限的用户创建角色。

CREATE ROLE ANALYST_READONLY;

示例:

db2 "CREATE ROLE ANALYST_READONLY"

输出:

DB20000I The SQL command completed successfully.

接下来,数据所有者或具有 DBADM 权限的用户将特定对象上的必要权限授予新创建的角色。

GRANT SELECT ON TABLE <schema_name>.<table_name> TO ROLE <role_name>;

示例:授予对 SALES.TRANSACTIONS 表的 SELECT 访问权限。

db2 "GRANT SELECT ON TABLE SALES.TRANSACTIONS TO ROLE ANALYST_READONLY"

输出:

DB20000I The SQL command completed successfully.

最后,安全管理员将角色授予用户或组。该用户现在继承了分配给该角色的所有权限。

GRANT ROLE <role_name> TO USER <username>;

示例:将 ANALYST_READONLY 角色授予用户 bpatel。

db2 "GRANT ROLE ANALYST_READONLY TO USER bpatel"

输出:

DB20000I The SQL command completed successfully.

角色可以被授予给其他角色,从而创建层级结构。这对于构建分层访问级别非常有用。一个角色会继承所有授予给它的角色的权限。

语法:

GRANT ROLE <child_role_name> TO ROLE <parent_role_name>;

示例:让我们创建一个 MANAGER 角色,它包含所有分析师权限以及管理特定报告表的权限。

-- 首先,创建新角色
db2 "CREATE ROLE MANAGER"
-- 将现有的分析师角色授予经理角色
db2 "GRANT ROLE ANALYST_READONLY TO ROLE MANAGER"
-- 添加额外的经理特定权限
db2 "GRANT INSERT, UPDATE ON TABLE REPORTING.SUMMARY TO ROLE MANAGER"
-- 现在,将 MANAGER 角色授予用户
db2 "GRANT ROLE MANAGER TO USER sjones"
  • 语义化命名:为角色使用清晰、描述性的名称(例如,APP_SERVICE_ACCOUNT、FINANCE_AUDITOR、DEV_READ_WRITE)。
  • 审计:使用系统目录视图(如 SYSCAT.ROLEAUTH 和 SYSCAT.TABAUTH)定期审计角色成员资格和分配给每个角色的权限。
  • 可信上下文:对于复杂的应用程序安全模型,请探索 Db2 可信上下文(Trusted Contexts),它允许在特定、可信条件下创建静态 SQL 对象时使用角色中的权限。