
一、概述
电科金仓数据库(KingbaseES)在用户管理和授权方面提供了完善的安全机制。本文将深入探讨KingbaseES在用户管理、权限控制、身份验证等方面的安全特性,为数据库管理员提供实用的操作指南。
二、用户与角色管理体系
2.1 用户类型
KingbaseES支持两种类型的用户:
特权用户
数据库初始化后自动创建三个特权用户:
- 数据库管理员(system): 拥有超级用户权限,负责数据库日常管理和自主存取控制
- 安全管理员(sso): 负责强制访问规则制定和管理,监督审计管理员和普通用户
- 审计管理员(sao): 负责数据库审计,监督数据库管理员和安全管理员
普通用户
通过CREATE USER语句创建的用户,用于访问数据库和运行应用程序。普通用户被授予superuser权限后将成为超级用户。
2.2 三权分立机制
KingbaseES安全版本实现了三权分立的安全管理机制,参照行政、立法、司法三权分立原则设计,解决了数据库超级用户权力过度集中的问题。
基础功能
三个管理员只能在各自权限范围内创建和维护用户:
- 数据库管理员不能创建或修改安全员和审计员
- 安全管理员只能创建和修改安全员
- 审计管理员只能创建和修改审计员
特权用户职责划分
| 用户类型 | 主要职责 | 审计约束 | 安全约束 |
|---|---|---|---|
| 数据库管理员(system) | 数据库日常管理和自主存取控制 | 不支持修改审计参数、定义审计策略、查看审计记录 | 不支持安全功能操作 |
| 安全管理员(sso) | 强制访问规则制定和管理 | 支持设置审计策略、查看审计记录 | 支持开启安全开关、设置安全策略 |
| 审计管理员(sao) | 数据库审计 | 支持开启审计参数、设置审计策略、查看审计记录 | 不支持安全功能操作 |
实现方式
通过sepapower插件实现三权分立功能,该插件在数据库启动时默认加载:
sql
-- 查看插件状态
\c - system
CREATE EXTENSION sepapower;
-- 配置由sso用户控制DCL(需要时)
ALTER SYSTEM SET sepapower.separate_power_grant = on;
SELECT sys_reload_conf();
2.3 用户管理操作
创建用户
sql
-- 创建普通用户
CREATE USER test WITH PASSWORD '123456';
-- 创建用户并设置资源限制
CREATE USER user1 WITH
PASSWORD '12345678ab'
CONNECTION LIMIT 100
VALID UNTIL '2026-12-31'
CONNECTION INTERVALS '09:00:00 TO 18:00:00';
修改用户
sql
-- 修改密码
ALTER USER test PASSWORD '新密码123';
-- 修改连接限制
ALTER USER test CONNECTION LIMIT 1000;
-- 设置用户为只读状态
CALL alteruserreadonly('test', 'user1', true);
删除用户
sql
-- 终止用户会话
SELECT sys_terminate_backend('PID');
-- 删除用户对象
DROP OWNED BY user1 CASCADE;
-- 删除用户
DROP USER user1;
三、口令安全管理
3.1 口令加密认证
KingbaseES支持多种口令加密算法:
- scram-sha-256: 默认算法,基于RFC 7677的挑战-响应方案
- sm3: 国密散列函数标准(GM/T0004-2012)
- scram-sm3: 国密算法的scram身份认证
- sm4: 基于GM/T 0091-2020标准的加密认证
配置口令加密算法:
sql
-- 在kingbase.conf中设置
password_encryption = 'scram-sha-256'
-- 重启数据库后生效
3.2 口令复杂度管理
通过passwordcheck插件实现口令复杂度检查:
sql
-- 加载插件
-- 在kingbase.conf中配置
shared_preload_libraries = 'passwordcheck'
-- 重启数据库后创建扩展
CREATE EXTENSION passwordcheck;
-- 配置复杂度参数(由sso用户操作)
\c - sso
ALTER SYSTEM SET passwordcheck.enable = on;
ALTER SYSTEM SET passwordcheck.password_length = 10;
ALTER SYSTEM SET passwordcheck.password_condition_letter = 3;
ALTER SYSTEM SET passwordcheck.password_condition_digit = 3;
ALTER SYSTEM SET passwordcheck.password_condition_punct = 2;
SELECT sys_reload_conf();
复杂度参数说明
| 参数 | 取值范围 | 默认值 | 描述 |
|---|---|---|---|
| passwordcheck.enable | true/false | false | 复杂度功能开关 |
| passwordcheck.password_length | [8,63] | 8 | 密码最小长度 |
| passwordcheck.password_condition_letter | [2,61] | 2 | 最少包含字母数 |
| passwordcheck.password_condition_digit | [2,61] | 2 | 最少包含数字数 |
| passwordcheck.password_condition_punct | [0,59] | 0 | 最少包含特殊字符数 |
3.3 口令有效期管理
通过identity_pwdexp插件实现口令过期检查:
sql
-- 加载插件
shared_preload_libraries = 'identity_pwdexp'
-- 创建扩展
CREATE EXTENSION identity_pwdexp;
-- 配置有效期(由sso用户操作)
\c - sso
ALTER SYSTEM SET identity_pwdexp.password_change_interval = 90;
ALTER SYSTEM SET identity_pwdexp.max_password_change_interval = 180;
SELECT sys_reload_conf();
3.4 口令历史管理
防止用户重复使用近期密码:
sql
-- 加载插件
shared_preload_libraries = 'passwordhistory'
-- 创建扩展并配置
CREATE EXTENSION passwordhistory;
\c - system
ALTER SYSTEM SET passwordhistory.enable = on;
ALTER SYSTEM SET passwordhistory.password_time = 90; -- 90天内不能重复
SELECT sys_reload_conf();
3.5 账户异常登录锁定
通过sys_audlog插件实现账户锁定功能:
sql
-- 加载插件
shared_preload_libraries = 'sys_audlog'
-- 创建扩展
CREATE EXTENSION sys_audlog;
-- 配置锁定策略(由sso用户操作)
\c - sso
ALTER SYSTEM SET sys_audlog.max_error_user_connect_times = 10;
ALTER SYSTEM SET sys_audlog.error_user_connect_times = 5; -- 连续失败5次锁定
ALTER SYSTEM SET sys_audlog.error_user_connect_interval = 30; -- 锁定30分钟
SELECT sys_reload_conf();
-- 手动解锁用户
ALTER USER username WITH LOGIN;
四、权限管理体系
4.1 系统特权
基本系统特权
- SUPERUSER: 超级用户权限,可绕过所有权限检查
- CREATEDB: 创建数据库权限
- CREATEROLE: 创建角色权限
- LOGIN: 登录数据库权限
- REPLICATION: 流复制权限
- BYPASSRLS: 绕过行级安全策略权限
系统ANY权限
通过sysprivilege插件实现,允许用户对某类对象执行特定操作:
sql
-- 加载插件
shared_preload_libraries = 'sysprivilege'
CREATE EXTENSION sysprivilege;
-- 授予ANY权限
GRANT SELECT ANY TABLE TO user1;
GRANT CREATE ANY TABLE TO user1;
GRANT EXECUTE ANY PROCEDURE TO user1;
-- 查询ANY权限
SELECT * FROM user_any_privs;
-- 撤销ANY权限
REVOKE SELECT ANY TABLE FROM user1;
常用ANY权限类型
| 权限名称 | 描述 |
|---|---|
| CREATE ANY TABLE | 在任何模式下创建表 |
| ALTER ANY TABLE | 修改任何模式下的表 |
| SELECT ANY TABLE | 查询任何模式下的表 |
| INSERT ANY TABLE | 向任何表插入数据 |
| EXECUTE ANY PROCEDURE | 执行任何存储过程 |
| DUMP ANY TABLE | 导出任何有SELECT权限的表 |
4.2 对象权限
主要对象权限类型
- SELECT: 查询权限
- INSERT: 插入权限
- UPDATE: 更新权限
- DELETE: 删除权限
- TRUNCATE: 清空表权限
- REFERENCES: 创建外键约束权限
- TRIGGER: 创建触发器权限
- EXECUTE: 执行函数/过程权限
授予对象权限
sql
-- 授予表权限
GRANT SELECT, INSERT, UPDATE ON orders TO user1;
-- 授予列级权限
GRANT INSERT (orderid, orderdate) ON orders TO user1;
-- 授予所有权限
GRANT ALL PRIVILEGES ON orders TO user1 WITH GRANT OPTION;
-- 授予视图权限
GRANT SELECT ON order_view TO user1;
-- 授予存储过程权限
GRANT EXECUTE ON PROCEDURE proc_name TO user1;
撤销对象权限
sql
-- 撤销表权限
REVOKE INSERT, UPDATE ON orders FROM user1;
-- 撤销列级权限
REVOKE INSERT (orderid, orderdate) ON orders FROM user1;
-- 级联撤销
REVOKE SELECT ON orders FROM user1 CASCADE;
4.3 角色管理
创建和管理角色
sql
-- 创建角色
CREATE ROLE app_role;
-- 授予权限给角色
GRANT SELECT, INSERT ON orders TO app_role;
GRANT EXECUTE ON PROCEDURE proc1 TO app_role;
-- 将角色授予用户
GRANT app_role TO user1, user2;
-- 设置默认角色
ALTER USER user1 DEFAULT ROLE app_role;
-- 切换当前角色
SET ROLE app_role;
-- 查看当前角色
SELECT SESSION_USER, CURRENT_USER;
角色启用和禁用
通过roledisable插件实现:
sql
-- 加载插件
shared_preload_libraries = 'roledisable'
CREATE EXTENSION roledisable;
-- 禁用角色
ALTER ROLE role1 DISABLE;
-- 启用角色
ALTER ROLE role1 ENABLE;
-- 查看角色状态
SELECT * FROM roledisable.sys_role_status;
五、身份验证机制
5.1 客户端认证配置
通过sys_hba.conf文件配置客户端认证规则:
# TYPE DATABASE USER ADDRESS METHOD
# 本地连接使用trust
local all all trust
# IPv4本地连接使用scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
# IPv6本地连接
host all all ::1/128 scram-sha-256
# 允许特定网段使用sm3认证
host all all 192.168.1.0/24 sm3
5.2 来源限制
通过src_restrict插件实现基于IP、MAC、时间段的访问控制:
sql
-- 插件默认加载,配置开关
ALTER SYSTEM SET src_restrict.enable = on;
SELECT sys_reload_conf();
-- 添加白名单规则
SELECT src_restrict.add_rules(
0, -- 0为白名单,1为黑名单
'user1',
'192.168.1.*',
'',
'ip_range=192.168.1.10~192.168.1.100;time_range=20260101-08:00:00~20261231-18:00:00'
);
-- 添加黑名单规则
SELECT src_restrict.add_rules(
1,
'user2',
'10.0.0.*',
'',
'mac=aa:bb:cc:dd:ee:ff'
);
-- 查看规则
SELECT * FROM src_restrict.show_rules;
-- 删除规则
SELECT src_restrict.remove_rules(0, 'user1', '192.168.1.*', '...');
5.3 弱口令扫描
通过security_utils插件实现弱口令检查和扫描:
sql
-- 加载插件
shared_preload_libraries = 'security_utils'
CREATE EXTENSION security_utils CASCADE;
-- 开启弱口令检查
ALTER SYSTEM SET security_utils.weak_pwd_check_enable = on;
SELECT sys_reload_conf();
-- 配置弱口令字典
SET WEAK PASSWORD '123456', 'password', 'admin123';
-- 执行弱口令扫描
SELECT * FROM security_utils.weak_passwd_scan_result;
-- 删除弱口令字典
REMOVE WEAK PASSWORD IF EXISTS '123456', 'password';
六、高级安全特性
6.1 受限DBA
通过restricted_dba插件限制DBA权限:
sql
-- 加载插件
shared_preload_libraries = 'restricted_dba, sepapower'
CREATE EXTENSION restricted_dba;
-- 由sso用户开启受限DBA
\c - sso
ALTER SYSTEM SET restricted_dba.restricted_enable = true;
SELECT sys_reload_conf();
开启后,DBA将不能读取、更改和执行不属于他的对象。
6.2 数据导出控制
控制用户导出数据的权限:
sql
-- 开启导出控制
ALTER SYSTEM SET enable_allowdump = on;
SELECT sys_reload_conf();
-- 授予表导出权限
GRANT DUMPTABLE ON table1 TO user1;
-- 授予全局导出权限
GRANT DUMP ANY TABLE TO user1;
-- 撤销导出权限
REVOKE DUMPTABLE ON table1 FROM user1;
REVOKE DUMP ANY TABLE FROM user1;
6.3 空闲自动断开
配置客户端空闲超时:
sql
-- 设置当前会话空闲5分钟断开
SET client_idle_timeout = 300;
-- 设置全局空闲30分钟断开
ALTER SYSTEM SET client_idle_timeout = 1800;
SELECT sys_reload_conf();
-- 关闭功能
ALTER SYSTEM SET client_idle_timeout = 0;
七、权限查询与审计
7.1 查询用户权限
sql
-- 查询所有用户信息
SELECT * FROM sys_user;
-- 查询用户的系统特权
SELECT usename, usecreatedb, usesuper, userepl
FROM sys_user
WHERE usename = 'user1';
-- 查询用户的对象权限
SELECT * FROM DBA_TAB_PRIVS
WHERE grantee = 'user1';
-- 查询用户的ANY权限
SELECT * FROM user_any_privs;
-- 查询当前会话信息
SELECT SESSION_USER, CURRENT_USER;
7.2 查询角色信息
sql
-- 查询所有角色
SELECT * FROM sys_roles;
-- 查询角色成员关系
SELECT rolname, member
FROM sys_auth_members
WHERE rolname = 'app_role';
-- 查询角色状态
SELECT * FROM roledisable.sys_role_status;
7.3 账户登录信息
sql
-- 查询当前用户登录信息
SELECT * FROM sys_audlog.sys_user_audit_userlog;
-- 删除30天前的登录信息
SELECT sys_audlog.sys_del_user_logonlog_before_days(30);
-- 删除指定IP的登录信息
SELECT sys_audlog.sys_del_user_logonlog_by_ip('192.168.1.100');
-- 删除指定用户的登录信息
SELECT sys_audlog.sys_del_user_logonlog_by_name('user1');
八、总结
电科金仓数据库在用户管理和授权方面提供了完善的安全机制,包括:
- 完善的用户体系: 支持特权用户和普通用户,实现三权分立
- 多层次权限控制: 系统特权、对象权限、列级权限的细粒度控制
- 强大的口令管理: 复杂度检查、有效期管理、历史管理、异常锁定
- 灵活的身份验证: 支持多种加密算法和认证方式
- 精细的访问控制: IP、MAC、时间段等多维度限制
- 丰富的安全插件: 通过插件扩展实现各类安全功能
通过合理配置和使用这些安全特性,可以构建一个安全可靠的数据库访问控制体系,满足各类应用场景的安全需求。数据库管理员应根据实际业务需求和安全要求,选择合适的安全策略并严格执行,确保数据库系统的安全性和合规性。
