外观
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 USER 或 CREATE 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 USER 或 ALTER 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 USER 或 DROP 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 实现,同时增加了一些企业级特性,如强密码策略、审计功能等。
在实际应用中,建议遵循最小权限原则,使用角色管理权限,定期审查权限,配置强密码策略,定期修改密码,禁用或删除不再使用的用户和角色,使用清晰、统一的命名规范,确保数据库的安全性和可管理性。
