Skip to content

KingBaseES 角色管理

角色管理概述

角色是KingBaseES中用于管理数据库访问权限的重要机制,它允许管理员将权限分组并批量分配给用户。角色可以理解为权限的集合,通过角色管理可以实现更细粒度、更高效的权限控制。

角色的创建与管理

创建角色

sql
-- 创建基本角色
CREATE ROLE role_name;

-- 创建具有登录权限的角色(等同于用户)
CREATE ROLE user_name LOGIN PASSWORD 'password';

-- 创建具有特定权限的角色
CREATE ROLE admin_role WITH SUPERUSER CREATEDB CREATEROLE;

修改角色

sql
-- 修改角色密码
ALTER ROLE user_name WITH PASSWORD 'new_password';

-- 修改角色权限
ALTER ROLE user_name WITH NOSUPERUSER;

-- 修改角色连接数限制
ALTER ROLE user_name WITH CONNECTION LIMIT 10;

-- 修改角色有效期
ALTER ROLE user_name WITH VALID UNTIL '2024-12-31';

删除角色

sql
-- 删除角色(确保角色没有关联对象)
DROP ROLE IF EXISTS role_name;

-- 强制删除角色及其关联对象
DROP ROLE IF EXISTS role_name CASCADE;

角色权限分配

授予权限给角色

sql
-- 授予数据库访问权限
GRANT CONNECT ON DATABASE db_name TO role_name;

-- 授予模式使用权限
GRANT USAGE ON SCHEMA schema_name TO role_name;

-- 授予表权限
GRANT SELECT, INSERT, UPDATE ON TABLE table_name TO role_name;

-- 授予所有表权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO role_name;

-- 授予序列权限
GRANT USAGE, SELECT ON SEQUENCE sequence_name TO role_name;

-- 授予函数权限
GRANT EXECUTE ON FUNCTION func_name(param_type) TO role_name;

授予角色给用户/角色

sql
-- 将角色授予用户
GRANT role_name TO user_name;

-- 将多个角色授予用户
GRANT role1, role2 TO user_name;

-- 授予角色时允许用户将角色授予其他用户
GRANT role_name TO user_name WITH ADMIN OPTION;

撤销权限

sql
-- 撤销表权限
REVOKE UPDATE ON TABLE table_name FROM role_name;

-- 撤销角色
REVOKE role_name FROM user_name;

角色层级与继承

角色继承

KingBaseES默认情况下,角色权限是继承的,即当一个角色被授予给另一个角色时,后者会继承前者的所有权限。

sql
-- 创建角色层次结构
CREATE ROLE parent_role;
CREATE ROLE child_role IN ROLE parent_role;

-- 或使用GRANT方式
GRANT parent_role TO child_role;

-- 禁用角色继承
ALTER ROLE child_role WITH NOINHERIT;

-- 显式设置角色
SET ROLE parent_role;

角色的最佳实践

1. 基于职责的角色设计

  • 管理员角色:拥有数据库所有权限
  • 开发角色:拥有开发环境的读写权限
  • 只读角色:仅拥有数据查询权限
  • 审计角色:仅拥有审计日志查看权限

2. 最小权限原则

  • 仅授予角色完成工作所需的最小权限
  • 定期审查角色权限,移除不必要的权限
  • 避免直接使用超级用户角色进行日常操作

3. 角色命名规范

-- 推荐命名规范
-- 按职责命名:role_<职责>
role_admin, role_developer, role_readonly

-- 按环境命名:role_<环境>_<职责>
role_prod_admin, role_test_developer

4. 定期审查角色

sql
-- 查看所有角色
\du

-- 查看角色权限
\dp table_name

-- 查看角色成员关系
SELECT * FROM sys_roles WHERE roleid IN (
  SELECT roleid FROM sys_members WHERE member = 'role_name'
);

版本差异

KingBaseES V8 R6

  • 角色管理功能基本完整
  • 支持角色继承和层级
  • 支持基本的权限授予和撤销

KingBaseES V8 R7

  • 增强了角色的审计功能
  • 支持更细粒度的权限控制
  • 提供了更丰富的系统视图用于角色管理
  • 增强了角色密码策略
  • 支持角色的有效期管理
sql
-- V8 R7新增:设置角色密码有效期
ALTER ROLE user_name WITH VALID UNTIL '2024-12-31';

-- V8 R7新增:查看角色详细信息
SELECT * FROM sys_role_details;

常见问题(FAQ)

1. 如何查看角色的所有权限?

sql
-- 查看角色的系统权限
SELECT * FROM sys_role_sys_privs WHERE grantee = 'role_name';

-- 查看角色的对象权限
SELECT * FROM sys_role_tab_privs WHERE grantee = 'role_name';

2. 如何实现角色的权限回收?

sql
-- 回收特定权限
REVOKE UPDATE ON TABLE table_name FROM role_name;

-- 回收所有权限
REVOKE ALL PRIVILEGES ON TABLE table_name FROM role_name;

-- 回收角色
REVOKE role_name FROM user_name;

3. 如何处理角色删除失败的情况?

sql
-- 查看角色关联的对象
SELECT * FROM sys_dependencies WHERE depender = 'role_name';

-- 强制删除角色及其关联对象
DROP ROLE role_name CASCADE;

4. 如何禁用角色的登录权限?

sql
ALTER ROLE user_name WITH NOLOGIN;

5. 如何临时切换角色?

sql
-- 切换到指定角色
SET ROLE role_name;

-- 恢复到原始角色
RESET ROLE;

6. 如何查看当前角色?

sql
SELECT current_role;

角色管理脚本示例

创建角色层次结构

sql
-- 创建基础角色
CREATE ROLE role_readonly;
CREATE ROLE role_readwrite;
CREATE ROLE role_admin;

-- 授予权限
GRANT CONNECT ON DATABASE test_db TO role_readonly;
GRANT USAGE ON SCHEMA public TO role_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO role_readonly;

GRANT role_readonly TO role_readwrite;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO role_readwrite;

GRANT role_readwrite TO role_admin;
GRANT ALL PRIVILEGES ON DATABASE test_db TO role_admin;

-- 创建用户并分配角色
CREATE ROLE user1 LOGIN PASSWORD 'pass1' IN ROLE role_readonly;
CREATE ROLE user2 LOGIN PASSWORD 'pass2' IN ROLE role_readwrite;
CREATE ROLE user3 LOGIN PASSWORD 'pass3' IN ROLE role_admin;

角色权限审查脚本

sql
-- 审查所有角色及其权限
SELECT 
  r.rolname,
  r.rolsuper,
  r.rolinherit,
  r.rolcreaterole,
  r.rolcreatedb,
  r.rolcanlogin,
  r.rolvaliduntil
FROM 
  sys_roles r
ORDER BY 
  r.rolname;

-- 审查角色成员关系
SELECT 
  m.member,
  m.roleid,
  r.rolname as role_name
FROM 
  sys_members m
JOIN 
  sys_roles r ON m.roleid = r.oid
ORDER BY 
  m.member, r.rolname;

通过合理的角色管理,可以实现KingBaseES数据库的安全访问控制,降低权限滥用的风险,同时提高管理效率。在实际生产环境中,应根据业务需求和安全策略,设计合理的角色体系,并定期进行审查和优化。