Skip to content

DB2 用户权限管理

用户权限管理概述

DB2 用户权限管理是数据库安全的核心组成部分,用于控制用户对数据库对象的访问和操作权限。合理的权限管理可以确保数据库的安全性、完整性和可用性,防止未授权访问和数据泄露。

1.1 权限管理的重要性

  • 安全性:防止未授权用户访问敏感数据
  • 完整性:确保只有授权用户可以修改数据
  • 可用性:防止误操作导致数据库不可用
  • 合规性:满足行业法规和审计要求
  • 责任分离:实现不同角色之间的权限分离

1.2 权限管理体系

DB2 权限管理体系包括以下几个层次:

  1. 实例级权限:控制对数据库实例的访问和管理
  2. 数据库级权限:控制对数据库的访问和管理
  3. 数据库对象级权限:控制对表、视图、索引等对象的操作
  4. 数据级权限:控制对表中特定数据行的访问

用户和组管理

2.1 用户类型

DB2 支持多种用户类型:

用户类型描述示例
操作系统用户由操作系统管理的用户,通过操作系统认证Windows 域用户、Linux/Unix 用户
DB2 内部用户由 DB2 数据库管理的用户,通过数据库认证使用 CREATE USER 创建的用户
应用程序用户用于应用程序连接数据库的用户应用系统服务账户
管理员用户具有最高权限的用户SYSADM、DBADM、SECADM

2.2 用户创建和管理

创建用户

sql
-- 使用操作系统用户(需要操作系统级权限)
CREATE USER db2user1 IDENTIFIED BY "Passw0rd" WITH DBADM;

-- 使用 DB2 内部认证
CREATE USER db2user2 USING PASSWORD "Passw0rd";

修改用户

sql
-- 修改用户密码
ALTER USER db2user1 USING PASSWORD "NewPassw0rd";

-- 修改用户权限
ALTER USER db2user1 REVOKE DBADM;

删除用户

sql
DROP USER db2user1;

查询用户

sql
-- 查询所有用户
SELECT * FROM SYSCAT.USERS;

-- 查询用户权限
SELECT * FROM SYSCAT.DBAUTH WHERE GRANTEE = 'DB2USER1';

2.3 组管理

创建组

sql
CREATE GROUP db2group1;

添加用户到组

sql
GRANT GROUP db2group1 TO USER db2user1;

查询组信息

sql
SELECT * FROM SYSCAT.GROUPS;
SELECT * FROM SYSCAT.GROUPMEMBERS WHERE GROUPNAME = 'DB2GROUP1';

权限类型和层级

3.1 实例级权限

实例级权限控制对数据库实例的访问和管理,主要包括:

权限描述
SYSADM系统管理员权限,具有实例的最高权限
SYSCTRL系统控制权限,可管理实例但不能访问数据
SYSMAINT系统维护权限,可进行备份恢复等操作
SYSMON系统监控权限,可监控实例性能

配置实例级权限

sql
-- 查询当前实例级权限配置
GET DATABASE MANAGER CONFIGURATION;

-- 修改实例级权限
UPDATE DATABASE MANAGER CONFIGURATION USING SYSADM_GROUP db2admins;
UPDATE DATABASE MANAGER CONFIGURATION USING SYSCTRL_GROUP db2ctrls;

3.2 数据库级权限

数据库级权限控制对数据库的访问和管理,主要包括:

权限描述
DBADM数据库管理员权限,具有数据库的最高权限
SECADM安全管理员权限,负责权限管理
SYSADM继承实例级 SYSADM 权限
DATAACCESS数据访问权限,可访问所有数据
ACCESSCTRL访问控制权限,可授予和撤销权限
LOAD加载数据权限
CONNECT连接数据库权限

授予数据库级权限

sql
GRANT DBADM ON DATABASE TO USER db2user1;
GRANT CONNECT ON DATABASE TO GROUP db2group1;

3.3 数据库对象级权限

数据库对象级权限控制对表、视图、索引等对象的操作,主要包括:

权限适用对象描述
ALTER表、视图、索引等修改对象结构
CONTROL所有对象完全控制权限
CREATEIN模式、表空间等在对象内创建新对象
DELETE表、视图删除数据行
DROP表、视图、索引等删除对象
EXECUTE存储过程、函数执行对象
INSERT表、视图插入数据行
REFERENCES创建外键约束
SELECT表、视图、昵称查询数据
UPDATE表、视图更新数据行

授予对象级权限

sql
-- 授予表的 SELECT 和 INSERT 权限
GRANT SELECT, INSERT ON TABLE employee TO USER db2user1;

-- 授予存储过程的 EXECUTE 权限
GRANT EXECUTE ON PROCEDURE get_employee TO GROUP db2group1;

3.4 数据级权限

数据级权限控制对表中特定数据行的访问,主要通过以下方式实现:

  1. 视图:通过创建视图限制可见的数据行
  2. 行访问控制(RACF):DB2 9.7 及以上版本支持的行级访问控制
  3. 列访问控制:限制对特定列的访问

行访问控制示例

sql
-- 创建行访问控制策略
CREATE ACCESS CONTROL POLICY emp_access_policy
FOR employee
USING (department = SESSION_USER);

-- 应用行访问控制策略
ALTER TABLE employee ACTIVATE ROW ACCESS CONTROL;

权限授予和撤销

4.1 权限授予

基本语法

sql
GRANT <权限> ON <对象> TO <用户//角色> [WITH GRANT OPTION];

示例

sql
-- 授予单个权限
GRANT SELECT ON TABLE employee TO USER db2user1;

-- 授予多个权限
GRANT SELECT, INSERT, UPDATE ON TABLE employee TO GROUP db2group1;

-- 授予带授权选项的权限
GRANT SELECT ON TABLE employee TO USER db2user1 WITH GRANT OPTION;

-- 授予所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA admin TO ROLE db2role1;

4.2 权限撤销

基本语法

sql
REVOKE <权限> ON <对象> FROM <用户//角色> [RESTRICT | CASCADE];

示例

sql
-- 撤销单个权限
REVOKE SELECT ON TABLE employee FROM USER db2user1;

-- 撤销多个权限
REVOKE SELECT, INSERT, UPDATE ON TABLE employee FROM GROUP db2group1;

-- 级联撤销权限
REVOKE SELECT ON TABLE employee FROM USER db2user1 CASCADE;

-- 撤销所有表的权限
REVOKE SELECT ON ALL TABLES IN SCHEMA admin FROM ROLE db2role1;

4.3 权限传递

当使用 WITH GRANT OPTION 授予权限时,被授权用户可以将权限传递给其他用户。权限传递关系可以通过 SYSCAT.TABAUTH 等系统视图查询。

查询权限传递关系

sql
SELECT GRANTEE, GRANTER, WITH GRANT OPTION FROM SYSCAT.TABAUTH WHERE TABNAME = 'EMPLOYEE';

角色管理

5.1 角色概述

角色是一组权限的集合,用于简化权限管理。通过将权限分配给角色,然后将角色分配给用户,可以减少权限管理的复杂性,提高安全性。

5.2 角色创建和管理

创建角色

sql
CREATE ROLE db2role1;

授予权限给角色

sql
GRANT SELECT, INSERT ON TABLE employee TO ROLE db2role1;
GRANT EXECUTE ON PROCEDURE get_employee TO ROLE db2role1;

将角色分配给用户/组

sql
GRANT ROLE db2role1 TO USER db2user1;
GRANT ROLE db2role1 TO GROUP db2group1;

激活角色

sql
-- 对于当前会话激活角色
SET ROLE db2role1;

-- 对于用户默认激活角色
ALTER USER db2user1 DEFAULT ROLE db2role1;

查询角色信息

sql
-- 查询所有角色
SELECT * FROM SYSCAT.ROLES;

-- 查询角色权限
SELECT * FROM SYSCAT.TABAUTH WHERE GRANTEE = 'DB2ROLE1';

-- 查询用户已分配的角色
SELECT * FROM SYSCAT.ROLEAUTH WHERE GRANTEE = 'DB2USER1';

删除角色

sql
DROP ROLE db2role1;

5.3 预定义角色

DB2 提供了一些预定义角色,用于简化常见权限的分配:

预定义角色描述
DBADM数据库管理员角色
SECADM安全管理员角色
DATAACCESS数据访问角色
ACCESSCTRL访问控制角色
LOAD数据加载角色

审计和监控

6.1 审计概述

审计是记录和监控数据库活动的过程,用于检测和防止未授权访问,满足合规性要求。DB2 提供了强大的审计功能,可以审计各种数据库活动。

6.2 审计配置

启用审计

sql
-- 创建审计策略
CREATE AUDIT POLICY audit_policy
CATEGORIES ALL STATUS BOTH ERROR TYPE AUDIT;

-- 应用审计策略到数据库
AUDIT DATABASE USING POLICY audit_policy;

-- 应用审计策略到表
AUDIT TABLE employee USING POLICY audit_policy;

查询审计配置

sql
-- 查询审计策略
SELECT * FROM SYSCAT.AUDITPOLICIES;

-- 查询数据库审计配置
SELECT * FROM SYSCAT.DATABASEAUDIT;

-- 查询表审计配置
SELECT * FROM SYSCAT.TABLEAUDIT WHERE TABNAME = 'EMPLOYEE';

6.3 审计日志管理

查询审计日志

sql
-- 使用 db2audit 工具提取审计日志
CALL SYSPROC.AUDIT_ARCHIVE(CAST(NULL AS VARCHAR(1024)), CAST(NULL AS VARCHAR(1024)));

-- 使用 db2audit 工具格式化审计日志
db2audit extract delasc to /audit/logs from files /audit/archive/*

审计日志清理

sql
-- 清理审计日志
CALL SYSPROC.AUDIT_CLEANUP(CAST(NULL AS VARCHAR(1024)), CAST(NULL AS VARCHAR(1024)));

6.4 权限监控

监控权限变更

sql
-- 查询最近的权限变更
SELECT * FROM SYSCAT.SCHEMAAUTH WHERE CREATETIME > CURRENT TIMESTAMP - 7 DAYS;
SELECT * FROM SYSCAT.TABAUTH WHERE CREATETIME > CURRENT TIMESTAMP - 7 DAYS;

监控异常访问

sql
-- 查询失败的连接尝试
SELECT * FROM SYSIBMADM.LOGON_FAILURES;

-- 查询异常权限使用
SELECT * FROM SYSIBMADM.AUTHORIZATIONID_USE WHERE USAGE_COUNT > 1000;

版本差异

7.1 DB2 10.5 vs DB2 11.1

特性DB2 10.5DB2 11.1变化说明
行访问控制支持增强支持更复杂的行访问策略
列访问控制支持增强支持动态列掩码
审计功能基本审计增强审计支持更细粒度的审计控制
角色管理支持增强支持默认角色激活
可信上下文支持增强支持更复杂的可信上下文配置

7.2 DB2 11.1 vs DB2 11.5

特性DB2 11.1DB2 11.5变化说明
动态数据掩码支持增强支持更多掩码函数和条件
透明数据加密支持增强支持更多加密算法和密钥管理
审计功能增强审计高级审计支持实时审计和告警
权限管理基于角色基于角色+支持更细粒度的权限控制
合规性报告基本报告增强报告支持自动生成合规性报告

生产实践

8.1 权限管理最佳实践

  1. 遵循最小权限原则:只授予用户完成任务所需的最小权限
  2. 使用角色管理权限:通过角色统一管理权限,简化权限维护
  3. 实现责任分离:不同角色之间的权限分离,如管理员、开发者、审计员
  4. 定期审查权限:定期审计用户权限,撤销不必要的权限
  5. 使用强密码策略:实施复杂密码要求和定期密码更改
  6. 启用审计功能:记录所有权限变更和敏感操作
  7. 限制管理员权限:避免过度使用 SYSADM 和 DBADM 权限
  8. 使用可信上下文:对于应用程序连接,使用可信上下文提高安全性

8.2 权限管理流程

  1. 权限申请:用户提交权限申请,说明所需权限和原因
  2. 权限审批:由管理员或授权人员审批权限申请
  3. 权限授予:按照审批结果授予相应权限
  4. 权限监控:监控权限使用情况,检测异常活动
  5. 权限审查:定期审查用户权限,确保权限的必要性
  6. 权限撤销:及时撤销不再需要的权限

8.3 常见场景的权限配置

开发人员

sql
-- 创建开发人员角色
CREATE ROLE developer;

-- 授予开发人员权限
GRANT CONNECT ON DATABASE TO ROLE developer;
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE ON SCHEMA dev TO ROLE developer;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA dev TO ROLE developer;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA dev TO ROLE developer;

-- 分配角色给开发人员
GRANT ROLE developer TO USER devuser1;

只读用户

sql
-- 创建只读角色
CREATE ROLE readonly;

-- 授予只读权限
GRANT CONNECT ON DATABASE TO ROLE readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA prod TO ROLE readonly;
GRANT SELECT ON ALL VIEWS IN SCHEMA prod TO ROLE readonly;

-- 分配角色给只读用户
GRANT ROLE readonly TO USER readonly1;

应用程序用户

sql
-- 创建应用程序角色
CREATE ROLE appuser;

-- 授予应用程序权限
GRANT CONNECT ON DATABASE TO ROLE appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE prod.orders TO ROLE appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE prod.customers TO ROLE appuser;
GRANT EXECUTE ON PROCEDURE prod.process_order TO ROLE appuser;

-- 分配角色给应用程序用户
GRANT ROLE appuser TO USER appuser1;

常见问题(FAQ)

9.1 如何查询用户的所有权限?

问题分析:需要查看某个用户拥有的所有权限,包括实例级、数据库级和对象级权限。

解决方案

sql
-- 查询实例级权限
GET DATABASE MANAGER CONFIGURATION;

-- 查询数据库级权限
SELECT * FROM SYSCAT.DBAUTH WHERE GRANTEE = 'DB2USER1';

-- 查询表级权限
SELECT * FROM SYSCAT.TABAUTH WHERE GRANTEE = 'DB2USER1';

-- 查询视图级权限
SELECT * FROM SYSCAT.VIEWAUTH WHERE GRANTEE = 'DB2USER1';

-- 查询存储过程权限
SELECT * FROM SYSCAT.PROGAUTH WHERE GRANTEE = 'DB2USER1';

-- 查询角色权限
SELECT * FROM SYSCAT.ROLEAUTH WHERE GRANTEE = 'DB2USER1';

9.2 如何撤销用户的所有权限?

问题分析:需要撤销某个用户的所有权限,包括直接授予的权限和通过角色继承的权限。

解决方案

sql
-- 撤销用户的数据库级权限
REVOKE DBADM, SECADM, DATAACCESS, ACCESSCTRL, LOAD, CONNECT ON DATABASE FROM USER db2user1 CASCADE;

-- 撤销用户的表级权限
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA prod FROM USER db2user1 CASCADE;

-- 撤销用户的角色
REVOKE ALL ROLES FROM USER db2user1;

-- 最后撤销连接权限
REVOKE CONNECT ON DATABASE FROM USER db2user1;

9.3 如何处理权限冲突?

问题分析:当用户同时属于多个组或被授予多个角色时,可能会出现权限冲突。

解决方案

  1. 明确权限优先级:DB2 中直接授予的权限优先于通过角色或组继承的权限
  2. 使用最小权限原则:只授予必要的权限,避免权限冲突
  3. 定期审查权限:定期清理不必要的权限和角色
  4. 使用角色管理:通过角色统一管理权限,减少直接授权

9.4 如何实现跨数据库的权限管理?

问题分析:在多数据库环境中,需要实现跨数据库的统一权限管理。

解决方案

  1. 使用统一的用户认证:使用 LDAP 或 Active Directory 实现统一用户管理
  2. 使用角色模板:在多个数据库中使用相同的角色定义
  3. 使用脚本自动化:编写脚本批量创建用户和授予权限
  4. 使用配置管理工具:使用 Ansible、Chef 等工具管理权限配置

9.5 如何确保权限变更的安全性?

问题分析:权限变更可能导致安全风险,需要确保权限变更的安全性和可审计性。

解决方案

  1. 实施变更管理流程:所有权限变更必须经过审批
  2. 启用审计功能:记录所有权限变更操作
  3. 使用双人授权:敏感权限变更需要双人授权
  4. 定期审查变更日志:定期审查权限变更日志,检测异常变更
  5. 使用版本控制:对权限配置进行版本控制,便于回滚

总结

DB2 用户权限管理是数据库安全的重要组成部分,合理的权限管理可以确保数据库的安全性、完整性和可用性。本文介绍了 DB2 用户权限管理的核心概念、用户和组管理、权限类型、权限授予与撤销、角色管理、审计监控、版本差异和生产实践。

在实际应用中,建议遵循最小权限原则,使用角色管理权限,实现责任分离,定期审查权限,启用审计功能,以确保数据库的安全性和合规性。同时,根据不同版本的 DB2 特性,选择合适的权限管理策略,以满足业务需求和安全要求。