电科金仓KingbaseES数据库用户管理与权限控制安全实践指南

一、概述

电科金仓数据库(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、时间段等多维度限制
  • 丰富的安全插件: 通过插件扩展实现各类安全功能

通过合理配置和使用这些安全特性,可以构建一个安全可靠的数据库访问控制体系,满足各类应用场景的安全需求。数据库管理员应根据实际业务需求和安全要求,选择合适的安全策略并严格执行,确保数据库系统的安全性和合规性。

相关推荐
言之。12 小时前
DDIA第四章 数据库存储引擎面试问题集
数据库·面试·职场和发展·ddia
wangbing112512 小时前
redis的存储问题
数据库·redis·缓存
剑来.12 小时前
一次完整的 MySQL 性能问题排查思路(线上实战总结)
数据库·mysql·oracle
2301_8002561112 小时前
【数据库】查找距离最近的电影院 pgSQL 存储过程片段
大数据·数据库·excel
2501_9418072612 小时前
在迪拜智能机场场景中构建行李实时调度与高并发航班数据分析平台的工程设计实践经验分享
java·前端·数据库
week_泽12 小时前
小程序云数据库查询操作_2
数据库·小程序
lbb 小魔仙12 小时前
Linux 安全攻防 2025:从 SELinux 配置到漏洞应急响应全流程
linux·python·安全
一 乐12 小时前
餐厅点餐|基于springboot + vue餐厅点餐系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
小王和八蛋12 小时前
TDDL、Amoeba、Cobar、MyCAT 架构比较
数据库
jnrjian12 小时前
Oracle 列A=列A 相当于列不为空,条件无意义
数据库·sql