一、概述
电科金仓数据库(KingbaseES)在用户管理和授权方面提供了完善的安全机制。本文将深入探讨KingbaseES在用户管理、权限控制、身份验证等方面的安全特性,为数据库管理员提供实用的操作指南。
二、用户与角色管理体系
2.1 用户类型
KingbaseES支持两种类型的用户:
特权用户
数据库初始化后自动创建三个特权用户:
- 数据库管理员(system): 拥有超级用户权限,负责数据库日常管理和自主存取控制
- 安全管理员(sso): 负责强制访问规则制定和管理,监督审计管理员和普通用户
- 审计管理员(sao): 负责数据库审计,监督数据库管理员和安全管理员
普通用户
通过CREATE USER语句创建的用户,用于访问数据库和运行应用程序。普通用户被授予superuser权限后将成为超级用户。
2.2 三权分立机制
KingbaseES安全版本实现了三权分立的安全管理机制,参照行政、立法、司法三权分立原则设计,解决了数据库超级用户权力过度集中的问题。
基础功能
三个管理员只能在各自权限范围内创建和维护用户:
- 数据库管理员不能创建或修改安全员和审计员
- 安全管理员只能创建和修改安全员
- 审计管理员只能创建和修改审计员
特权用户职责划分
| 用户类型 | 主要职责 | 审计约束 | 安全约束 |
|---|---|---|---|
| 数据库管理员(system) | 数据库日常管理和自主存取控制 | 不支持修改审计参数、定义审计策略、查看审计记录 | 不支持安全功能操作 |
| 安全管理员(sso) | 强制访问规则制定和管理 | 支持设置审计策略、查看审计记录 | 支持开启安全开关、设置安全策略 |
| 审计管理员(sao) | 数据库审计 | 支持开启审计参数、设置审计策略、查看审计记录 | 不支持安全功能操作 |
实现方式
通过sepapower插件实现三权分立功能,该插件在数据库启动时默认加载:
-- 查看插件状态\c-systemCREATEEXTENSION sepapower;-- 配置由sso用户控制DCL(需要时)ALTERSYSTEMSETsepapower.separate_power_grant=on;SELECTsys_reload_conf();2.3 用户管理操作
创建用户
-- 创建普通用户CREATEUSERtestWITHPASSWORD'123456';-- 创建用户并设置资源限制CREATEUSERuser1WITHPASSWORD'12345678ab'CONNECTIONLIMIT100VALID UNTIL'2026-12-31'CONNECTION INTERVALS'09:00:00 TO 18:00:00';修改用户
-- 修改密码ALTERUSERtest PASSWORD'新密码123';-- 修改连接限制ALTERUSERtest CONNECTIONLIMIT1000;-- 设置用户为只读状态CALLalteruserreadonly('test','user1',true);删除用户
-- 终止用户会话SELECTsys_terminate_backend('PID');-- 删除用户对象DROPOWNEDBYuser1CASCADE;-- 删除用户DROPUSERuser1;三、口令安全管理
3.1 口令加密认证
KingbaseES支持多种口令加密算法:
- scram-sha-256: 默认算法,基于RFC 7677的挑战-响应方案
- sm3: 国密散列函数标准(GM/T0004-2012)
- scram-sm3: 国密算法的scram身份认证
- sm4: 基于GM/T 0091-2020标准的加密认证
配置口令加密算法:
-- 在kingbase.conf中设置password_encryption='scram-sha-256'-- 重启数据库后生效3.2 口令复杂度管理
通过passwordcheck插件实现口令复杂度检查:
-- 加载插件-- 在kingbase.conf中配置shared_preload_libraries='passwordcheck'-- 重启数据库后创建扩展CREATEEXTENSION passwordcheck;-- 配置复杂度参数(由sso用户操作)\c-ssoALTERSYSTEMSETpasswordcheck.enable=on;ALTERSYSTEMSETpasswordcheck.password_length=10;ALTERSYSTEMSETpasswordcheck.password_condition_letter=3;ALTERSYSTEMSETpasswordcheck.password_condition_digit=3;ALTERSYSTEMSETpasswordcheck.password_condition_punct=2;SELECTsys_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插件实现口令过期检查:
-- 加载插件shared_preload_libraries='identity_pwdexp'-- 创建扩展CREATEEXTENSION identity_pwdexp;-- 配置有效期(由sso用户操作)\c-ssoALTERSYSTEMSETidentity_pwdexp.password_change_interval=90;ALTERSYSTEMSETidentity_pwdexp.max_password_change_interval=180;SELECTsys_reload_conf();3.4 口令历史管理
防止用户重复使用近期密码:
-- 加载插件shared_preload_libraries='passwordhistory'-- 创建扩展并配置CREATEEXTENSION passwordhistory;\c-systemALTERSYSTEMSETpasswordhistory.enable=on;ALTERSYSTEMSETpasswordhistory.password_time=90;-- 90天内不能重复SELECTsys_reload_conf();3.5 账户异常登录锁定
通过sys_audlog插件实现账户锁定功能:
-- 加载插件shared_preload_libraries='sys_audlog'-- 创建扩展CREATEEXTENSION sys_audlog;-- 配置锁定策略(由sso用户操作)\c-ssoALTERSYSTEMSETsys_audlog.max_error_user_connect_times=10;ALTERSYSTEMSETsys_audlog.error_user_connect_times=5;-- 连续失败5次锁定ALTERSYSTEMSETsys_audlog.error_user_connect_interval=30;-- 锁定30分钟SELECTsys_reload_conf();-- 手动解锁用户ALTERUSERusernameWITHLOGIN;四、权限管理体系
4.1 系统特权
基本系统特权
- SUPERUSER: 超级用户权限,可绕过所有权限检查
- CREATEDB: 创建数据库权限
- CREATEROLE: 创建角色权限
- LOGIN: 登录数据库权限
- REPLICATION: 流复制权限
- BYPASSRLS: 绕过行级安全策略权限
系统ANY权限
通过sysprivilege插件实现,允许用户对某类对象执行特定操作:
-- 加载插件shared_preload_libraries='sysprivilege'CREATEEXTENSION sysprivilege;-- 授予ANY权限GRANTSELECTANYTABLETOuser1;GRANTCREATEANYTABLETOuser1;GRANTEXECUTEANYPROCEDURETOuser1;-- 查询ANY权限SELECT*FROMuser_any_privs;-- 撤销ANY权限REVOKESELECTANYTABLEFROMuser1;常用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: 执行函数/过程权限
授予对象权限
-- 授予表权限GRANTSELECT,INSERT,UPDATEONordersTOuser1;-- 授予列级权限GRANTINSERT(orderid,orderdate)ONordersTOuser1;-- 授予所有权限GRANTALLPRIVILEGESONordersTOuser1WITHGRANTOPTION;-- 授予视图权限GRANTSELECTONorder_viewTOuser1;-- 授予存储过程权限GRANTEXECUTEONPROCEDUREproc_nameTOuser1;撤销对象权限
-- 撤销表权限REVOKEINSERT,UPDATEONordersFROMuser1;-- 撤销列级权限REVOKEINSERT(orderid,orderdate)ONordersFROMuser1;-- 级联撤销REVOKESELECTONordersFROMuser1CASCADE;4.3 角色管理
创建和管理角色
-- 创建角色CREATEROLE app_role;-- 授予权限给角色GRANTSELECT,INSERTONordersTOapp_role;GRANTEXECUTEONPROCEDUREproc1TOapp_role;-- 将角色授予用户GRANTapp_roleTOuser1,user2;-- 设置默认角色ALTERUSERuser1DEFAULTROLE app_role;-- 切换当前角色SETROLE app_role;-- 查看当前角色SELECTSESSION_USER,CURRENT_USER;角色启用和禁用
通过roledisable插件实现:
-- 加载插件shared_preload_libraries='roledisable'CREATEEXTENSION roledisable;-- 禁用角色ALTERROLE role1DISABLE;-- 启用角色ALTERROLE role1ENABLE;-- 查看角色状态SELECT*FROMroledisable.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 sm35.2 来源限制
通过src_restrict插件实现基于IP、MAC、时间段的访问控制:
-- 插件默认加载,配置开关ALTERSYSTEMSETsrc_restrict.enable=on;SELECTsys_reload_conf();-- 添加白名单规则SELECTsrc_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');-- 添加黑名单规则SELECTsrc_restrict.add_rules(1,'user2','10.0.0.*','','mac=aa:bb:cc:dd:ee:ff');-- 查看规则SELECT*FROMsrc_restrict.show_rules;-- 删除规则SELECTsrc_restrict.remove_rules(0,'user1','192.168.1.*','...');5.3 弱口令扫描
通过security_utils插件实现弱口令检查和扫描:
-- 加载插件shared_preload_libraries='security_utils'CREATEEXTENSION security_utilsCASCADE;-- 开启弱口令检查ALTERSYSTEMSETsecurity_utils.weak_pwd_check_enable=on;SELECTsys_reload_conf();-- 配置弱口令字典SETWEAK PASSWORD'123456','password','admin123';-- 执行弱口令扫描SELECT*FROMsecurity_utils.weak_passwd_scan_result;-- 删除弱口令字典REMOVE WEAK PASSWORDIFEXISTS'123456','password';六、高级安全特性
6.1 受限DBA
通过restricted_dba插件限制DBA权限:
-- 加载插件shared_preload_libraries='restricted_dba, sepapower'CREATEEXTENSION restricted_dba;-- 由sso用户开启受限DBA\c-ssoALTERSYSTEMSETrestricted_dba.restricted_enable=true;SELECTsys_reload_conf();开启后,DBA将不能读取、更改和执行不属于他的对象。
6.2 数据导出控制
控制用户导出数据的权限:
-- 开启导出控制ALTERSYSTEMSETenable_allowdump=on;SELECTsys_reload_conf();-- 授予表导出权限GRANTDUMPTABLEONtable1TOuser1;-- 授予全局导出权限GRANTDUMPANYTABLETOuser1;-- 撤销导出权限REVOKEDUMPTABLEONtable1FROMuser1;REVOKEDUMPANYTABLEFROMuser1;6.3 空闲自动断开
配置客户端空闲超时:
-- 设置当前会话空闲5分钟断开SETclient_idle_timeout=300;-- 设置全局空闲30分钟断开ALTERSYSTEMSETclient_idle_timeout=1800;SELECTsys_reload_conf();-- 关闭功能ALTERSYSTEMSETclient_idle_timeout=0;七、权限查询与审计
7.1 查询用户权限
-- 查询所有用户信息SELECT*FROMsys_user;-- 查询用户的系统特权SELECTusename,usecreatedb,usesuper,usereplFROMsys_userWHEREusename='user1';-- 查询用户的对象权限SELECT*FROMDBA_TAB_PRIVSWHEREgrantee='user1';-- 查询用户的ANY权限SELECT*FROMuser_any_privs;-- 查询当前会话信息SELECTSESSION_USER,CURRENT_USER;7.2 查询角色信息
-- 查询所有角色SELECT*FROMsys_roles;-- 查询角色成员关系SELECTrolname,memberFROMsys_auth_membersWHERErolname='app_role';-- 查询角色状态SELECT*FROMroledisable.sys_role_status;7.3 账户登录信息
-- 查询当前用户登录信息SELECT*FROMsys_audlog.sys_user_audit_userlog;-- 删除30天前的登录信息SELECTsys_audlog.sys_del_user_logonlog_before_days(30);-- 删除指定IP的登录信息SELECTsys_audlog.sys_del_user_logonlog_by_ip('192.168.1.100');-- 删除指定用户的登录信息SELECTsys_audlog.sys_del_user_logonlog_by_name('user1');八、总结
电科金仓数据库在用户管理和授权方面提供了完善的安全机制,包括:
- 完善的用户体系: 支持特权用户和普通用户,实现三权分立
- 多层次权限控制: 系统特权、对象权限、列级权限的细粒度控制
- 强大的口令管理: 复杂度检查、有效期管理、历史管理、异常锁定
- 灵活的身份验证: 支持多种加密算法和认证方式
- 精细的访问控制: IP、MAC、时间段等多维度限制
- 丰富的安全插件: 通过插件扩展实现各类安全功能
通过合理配置和使用这些安全特性,可以构建一个安全可靠的数据库访问控制体系,满足各类应用场景的安全需求。数据库管理员应根据实际业务需求和安全要求,选择合适的安全策略并严格执行,确保数据库系统的安全性和合规性。