Skip to content

KingBaseES 用户与权限管理(RBAC)

RBAC 基本概念

什么是 RBAC

RBAC(基于角色的访问控制)是一种权限管理模型,通过将权限分配给角色,再将角色分配给用户,实现了权限的集中管理和灵活分配。

RBAC 的核心组件

  • 用户(User):系统的使用者,可以是个人或应用程序
  • 角色(Role):一组权限的集合,代表了某种职责或功能
  • 权限(Permission):对资源的操作许可,如查询、修改、删除等
  • 资源(Resource):系统中受保护的对象,如表、视图、函数等

RBAC 的优势

  • 集中管理:通过角色集中管理权限,简化了权限管理的复杂度
  • 灵活分配:可以根据用户的职责和功能灵活分配角色
  • 最小权限原则:只授予用户完成工作所需的最小权限
  • 审计方便:可以通过角色跟踪用户的权限变更和操作
  • 易于维护:当用户职责变化时,只需调整角色分配,无需修改权限

KingBaseES 中 RBAC 的实现

KingBaseES 基于 PostgreSQL 开发,继承了 PostgreSQL 的 RBAC 实现,同时增加了一些企业级特性。

权限层次结构

KingBaseES 的权限分为以下几个层次:

  • 系统级权限:对整个数据库系统的操作权限,如创建数据库、创建角色等
  • 数据库级权限:对特定数据库的操作权限,如连接数据库、创建表等
  • 对象级权限:对特定对象的操作权限,如表、视图、函数等
  • 列级权限:对表中特定列的操作权限

内置角色

KingBaseES 提供了以下内置角色:

  • SYSADMIN:系统管理员角色,拥有所有权限
  • SECURITYADMIN:安全管理员角色,负责用户和角色管理
  • AUDITADMIN:审计管理员角色,负责审计配置和管理
  • MONITORADMIN:监控管理员角色,负责数据库监控
  • OPERATOR:操作员角色,负责日常操作维护
  • CONNECT:连接角色,拥有连接数据库的权限
  • RESOURCE:资源角色,拥有创建对象的权限

用户管理

创建用户

使用 CREATE USERCREATE ROLE 语句创建用户。

sql
-- 创建普通用户
CREATE USER user1 WITH PASSWORD 'password123';

-- 创建带有效期的用户
CREATE USER user2 WITH PASSWORD 'password123' VALID UNTIL '2025-12-31';

-- 创建具有创建数据库权限的用户
CREATE USER user3 WITH PASSWORD 'password123' CREATEDB;

-- 创建具有创建角色权限的用户
CREATE USER user4 WITH PASSWORD 'password123' CREATEROLE;

修改用户

使用 ALTER USERALTER ROLE 语句修改用户属性。

sql
-- 修改用户密码
ALTER USER user1 WITH PASSWORD 'newpassword123';

-- 延长用户有效期
ALTER USER user2 VALID UNTIL '2026-12-31';

-- 锁定用户
ALTER USER user3 ACCOUNT LOCK;

-- 解锁用户
ALTER USER user3 ACCOUNT UNLOCK;

-- 修改用户的连接限制
ALTER USER user1 CONNECTION LIMIT 10;

删除用户

使用 DROP USERDROP ROLE 语句删除用户。

sql
-- 删除用户(如果用户拥有对象,需要先删除对象或使用 CASCADE)
DROP USER user1;

-- 级联删除用户及其所有对象
DROP USER user2 CASCADE;

查看用户信息

使用系统视图查看用户信息。

sql
-- 查看所有用户
SELECT * FROM sys_user;

-- 查看用户的详细信息
SELECT * FROM sys_user WHERE username = 'user1';

-- 查看用户的权限
SELECT * FROM sys_user_privs WHERE grantee = 'user1';

角色管理

创建角色

使用 CREATE ROLE 语句创建角色。

sql
-- 创建普通角色
CREATE ROLE role1;

-- 创建可登录的角色(等同于用户)
CREATE ROLE role2 WITH LOGIN PASSWORD 'password123';

-- 创建具有创建表权限的角色
CREATE ROLE role3 WITH CREATEDB CREATEROLE;

修改角色

使用 ALTER ROLE 语句修改角色属性。

sql
-- 修改角色名称
ALTER ROLE role1 RENAME TO newrole1;

-- 修改角色密码
ALTER ROLE role2 WITH PASSWORD 'newpassword123';

-- 为角色添加属性
ALTER ROLE role3 WITH CONNECTION LIMIT 5;

删除角色

使用 DROP ROLE 语句删除角色。

sql
-- 删除角色
DROP ROLE role1;

-- 级联删除角色及其所有依赖
DROP ROLE role2 CASCADE;

查看角色信息

使用系统视图查看角色信息。

sql
-- 查看所有角色
SELECT * FROM sys_roles;

-- 查看角色的详细信息
SELECT * FROM sys_roles WHERE rolename = 'role1';

-- 查看角色的权限
SELECT * FROM sys_role_privs WHERE grantee = 'role1';

权限管理

授予权限

使用 GRANT 语句授予权限。

sql
-- 授予用户连接数据库的权限
GRANT CONNECT ON DATABASE kingbase TO user1;

-- 授予用户在模式中创建对象的权限
GRANT CREATE ON SCHEMA public TO user1;

-- 授予用户对表的所有权限
GRANT ALL PRIVILEGES ON TABLE table1 TO user1;

-- 授予用户对表的查询和插入权限
GRANT SELECT, INSERT ON TABLE table1 TO user1;

-- 授予用户对表的特定列的权限
GRANT SELECT (id, name), UPDATE (name) ON TABLE table1 TO user1;

-- 授予用户执行函数的权限
GRANT EXECUTE ON FUNCTION func1 TO user1;

授予角色给用户

使用 GRANT 语句将角色授予用户。

sql
-- 将角色授予用户
GRANT role1 TO user1;

-- 将角色授予多个用户
GRANT role1 TO user1, user2, user3;

-- 授予角色并允许用户将角色授予其他用户
GRANT role1 TO user1 WITH ADMIN OPTION;

回收权限

使用 REVOKE 语句回收权限。

sql
-- 回收用户对表的插入权限
REVOKE INSERT ON TABLE table1 FROM user1;

-- 回收用户的所有权限
REVOKE ALL PRIVILEGES ON TABLE table1 FROM user1;

-- 回收用户的角色
REVOKE role1 FROM user1;

-- 回收用户及其从该角色获得的所有权限
REVOKE role1 FROM user1 CASCADE;

查看权限信息

使用系统视图查看权限信息。

sql
-- 查看用户的系统权限
SELECT * FROM sys_user_sys_privs WHERE grantee = 'user1';

-- 查看用户的对象权限
SELECT * FROM sys_user_tab_privs WHERE grantee = 'user1';

-- 查看角色的权限
SELECT * FROM sys_role_sys_privs WHERE grantee = 'role1';

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

权限继承和回收

权限继承

KingBaseES 中的权限继承是指用户可以继承其所属角色的权限。

sql
-- 创建角色并授予权限
CREATE ROLE role_read;
GRANT SELECT ON TABLE table1 TO role_read;

-- 创建用户并授予角色
CREATE USER user_read WITH PASSWORD 'password123';
GRANT role_read TO user_read;

-- 用户可以继承角色的权限,无需额外授权
-- user_read 可以查询 table1

权限回收

当回收角色的权限时,所有继承该角色的用户的相应权限也会被回收。

sql
-- 回收角色的权限
REVOKE SELECT ON TABLE table1 FROM role_read;

-- 所有继承 role_read 的用户将失去查询 table1 的权限

审计和监控

审计用户和角色操作

KingBaseES 提供了审计功能,可以审计用户和角色的操作。

sql
-- 启用审计
ALTER SYSTEM SET audit_enabled = on;
ALTER SYSTEM SET audit_directory = '/opt/kingbase/audit';
ALTER SYSTEM SET audit_filename = 'kingbase-audit-%Y-%m-%d.log';
ALTER SYSTEM SET audit_rotation_age = '1d';
ALTER SYSTEM SET audit_rotation_size = 100MB;
ALTER SYSTEM SET audit_statement = 'role,login,ddl';

-- 查看审计日志
SELECT * FROM sys_audit_log WHERE action IN ('CREATE ROLE', 'DROP ROLE', 'GRANT', 'REVOKE');

监控用户活动

使用系统视图监控用户的活动。

sql
-- 查看当前连接的用户
SELECT * FROM sys_stat_activity;

-- 查看用户的连接历史
SELECT * FROM sys_connection_history;

-- 查看用户的资源使用情况
SELECT * FROM sys_resource_usage;

最佳实践

1. 遵循最小权限原则

只授予用户完成工作所需的最小权限,避免过度授权。

sql
-- 错误示例:授予用户所有权限
GRANT ALL PRIVILEGES ON DATABASE kingbase TO user1;

-- 正确示例:只授予用户必要的权限
GRANT CONNECT ON DATABASE kingbase TO user1;
GRANT SELECT, INSERT, UPDATE ON TABLE table1 TO user1;

2. 使用角色管理权限

通过角色集中管理权限,简化权限管理的复杂度。

sql
-- 创建角色并授予权限
CREATE ROLE role_admin;
GRANT ALL PRIVILEGES ON DATABASE kingbase TO role_admin;

CREATE ROLE role_read;
GRANT CONNECT ON DATABASE kingbase TO role_read;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO role_read;

CREATE ROLE role_write;
GRANT CONNECT ON DATABASE kingbase TO role_write;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO role_write;

-- 将角色授予用户
GRANT role_admin TO admin_user;
GRANT role_read TO read_user;
GRANT role_write TO write_user;

3. 定期审查权限

定期审查用户和角色的权限,确保权限分配符合业务需求和安全要求。

sql
-- 审查用户的系统权限
SELECT grantee, privilege_type FROM sys_user_sys_privs;

-- 审查用户的对象权限
SELECT grantee, table_name, privilege_type FROM sys_user_tab_privs;

-- 审查角色的权限
SELECT grantee, privilege_type FROM sys_role_sys_privs;

4. 使用强密码策略

配置强密码策略,确保用户密码的安全性。

sql
-- 配置密码策略
ALTER SYSTEM SET password_policy = 'strong';
ALTER SYSTEM SET password_length = 12;
ALTER SYSTEM SET password_digits = 2;
ALTER SYSTEM SET password_letters = 2;
ALTER SYSTEM SET password_special_chars = 1;
ALTER SYSTEM SET password_history = 10;

5. 定期修改密码

要求用户定期修改密码,避免密码泄露。

sql
-- 配置密码有效期
ALTER SYSTEM SET password_valid_until = '90';

-- 修改用户密码
ALTER USER user1 WITH PASSWORD 'newpassword123';

6. 禁用或删除不再使用的用户和角色

及时禁用或删除不再使用的用户和角色,避免安全风险。

sql
-- 禁用用户
ALTER USER user1 ACCOUNT LOCK;

-- 删除用户
DROP USER user1;

-- 删除角色
DROP ROLE role1;

7. 使用命名规范

使用清晰、统一的命名规范,便于管理和维护。

-- 用户命名规范
<前缀><功能或部门><编号>
例如:u_admin_01, u_read_01, u_write_01

-- 角色命名规范
<前缀><功能或权限><编号>
例如:r_admin, r_read_all, r_write_table1

常见问题(FAQ)

Q:如何查看用户的所有权限?

A:可以使用以下SQL语句查看用户的所有权限:

sql
-- 查看用户的系统权限
SELECT * FROM sys_user_sys_privs WHERE grantee = 'user1';

-- 查看用户的对象权限
SELECT * FROM sys_user_tab_privs WHERE grantee = 'user1';

-- 查看用户继承的角色权限
SELECT * FROM sys_role_tab_privs WHERE grantee IN (
  SELECT role_name FROM sys_user_roles WHERE user_name = 'user1'
);

Q:如何创建一个只读用户?

A:可以使用以下SQL语句创建一个只读用户:

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

-- 授予角色连接数据库的权限
GRANT CONNECT ON DATABASE kingbase TO role_read_only;

-- 授予角色查询所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO role_read_only;

-- 授予角色查询将来创建的表的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO role_read_only;

-- 创建用户并授予角色
CREATE USER read_only_user WITH PASSWORD 'password123';
GRANT role_read_only TO read_only_user;

Q:如何回收用户的所有权限?

A:可以使用以下SQL语句回收用户的所有权限:

sql
-- 回收用户的系统权限
REVOKE ALL PRIVILEGES FROM user1;

-- 回收用户的对象权限
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM user1;

-- 回收用户的角色
REVOKE ALL ROLES FROM user1;

Q:如何查看角色的继承关系?

A:可以使用以下SQL语句查看角色的继承关系:

sql
-- 查看用户所属的角色
SELECT * FROM sys_user_roles;

-- 查看角色所属的角色
SELECT * FROM sys_role_roles;

-- 查看角色的权限继承
SELECT * FROM sys_role_hierarchy;

Q:如何限制用户的连接数?

A:可以使用以下SQL语句限制用户的连接数:

sql
-- 创建用户时限制连接数
CREATE USER user1 WITH PASSWORD 'password123' CONNECTION LIMIT 5;

-- 修改现有用户的连接数限制
ALTER USER user1 CONNECTION LIMIT 10;

-- 查看用户的连接数限制
SELECT username, connection_limit FROM sys_user;

Q:如何配置密码策略?

A:可以使用以下SQL语句配置密码策略:

sql
-- 配置密码复杂度
ALTER SYSTEM SET password_policy = 'strong';

-- 配置密码长度
ALTER SYSTEM SET password_length = 12;

-- 配置密码包含数字的个数
ALTER SYSTEM SET password_digits = 2;

-- 配置密码包含字母的个数
ALTER SYSTEM SET password_letters = 2;

-- 配置密码包含特殊字符的个数
ALTER SYSTEM SET password_special_chars = 1;

-- 配置密码历史记录
ALTER SYSTEM SET password_history = 10;

-- 配置密码有效期
ALTER SYSTEM SET password_valid_until = '90';

Q:如何审计用户的操作?

A:可以使用以下SQL语句配置审计:

sql
-- 启用审计
ALTER SYSTEM SET audit_enabled = on;

-- 配置审计日志目录
ALTER SYSTEM SET audit_directory = '/opt/kingbase/audit';

-- 配置审计日志文件名格式
ALTER SYSTEM SET audit_filename = 'kingbase-audit-%Y-%m-%d.log';

-- 配置审计日志轮换时间
ALTER SYSTEM SET audit_rotation_age = '1d';

-- 配置审计日志轮换大小
ALTER SYSTEM SET audit_rotation_size = 100MB;

-- 配置审计的语句类型
ALTER SYSTEM SET audit_statement = 'ddl,function,role,login';

-- 查看审计日志
SELECT * FROM sys_audit_log WHERE username = 'user1';

Q:如何监控用户的活动?

A:可以使用以下SQL语句监控用户的活动:

sql
-- 查看当前连接的用户
SELECT * FROM sys_stat_activity;

-- 查看用户的连接历史
SELECT * FROM sys_connection_history;

-- 查看用户的资源使用情况
SELECT * FROM sys_resource_usage;

-- 查看用户的慢查询
SELECT * FROM sys_slow_queries WHERE username = 'user1';

Q:如何禁用或启用用户?

A:可以使用以下SQL语句禁用或启用用户:

sql
-- 禁用用户
ALTER USER user1 ACCOUNT LOCK;

-- 启用用户
ALTER USER user1 ACCOUNT UNLOCK;

-- 查看用户的状态
SELECT username, account_status FROM sys_user;

Q:如何备份和恢复用户和角色?

A:可以使用以下方法备份和恢复用户和角色:

bash
-- 备份用户和角色
pg_dumpall -h localhost -p 54321 -U system -r > roles_backup.sql

-- 恢复用户和角色
psql -h localhost -p 54321 -U system -f roles_backup.sql

结论

RBAC 是一种强大的权限管理模型,通过将权限分配给角色,再将角色分配给用户,实现了权限的集中管理和灵活分配。KingBaseES 继承了 PostgreSQL 的 RBAC 实现,同时增加了一些企业级特性,如强密码策略、审计功能等。

在实际应用中,建议遵循最小权限原则,使用角色管理权限,定期审查权限,配置强密码策略,定期修改密码,禁用或删除不再使用的用户和角色,使用清晰、统一的命名规范,确保数据库的安全性和可管理性。