KingbaseES 用户权限隔离功能原理与实战
一、用户权限隔离核心概述
1.1 功能定位与价值
KingbaseES 的用户权限隔离功能,核心目标是让普通用户仅能查看和操作已获得授权的数据库对象,未授权对象对用户不可见——既无法通过查询语句获取,也无法在数据库工具中看到,从根源上杜绝越权访问风险。
这个功能主要依赖 security_utils 插件实现,开启后会对数据库中具有 ACL(访问控制列表)字段的系统表统一配置 RLS 策略,通过 RLS 筛选逻辑过滤未授权对象,确保数据访问的安全性与合规性。
1.2 核心语法:启用与禁用
针对数据库级开启或禁用用户权限隔离功能,使用以下命令:
-- 启用用户权限隔离
ALTER DATABASE database_name ENABLE OBJECT ISOLATION;
-- 禁用用户权限隔离
ALTER DATABASE database_name DISABLE OBJECT ISOLATION;
二、功能实现原理
2.1 底层依赖:行级安全策略(RLS)
该功能实现主要依赖行级安全策略(Row-Level Security, RLS),通过修改数据库状态,为当前数据库具有 ACL 字段的系统表统一添加配置好的 RLS,通过 RLS 筛选以实现普通用户只能查看有权访问的对象(表、函数、视图、字段等)的目的。
- 功能开启时,数据库自动修改系统状态,为
sys_class(表对象)、sys_database(数据库对象)、sys_trigger(触发器对象)等带 ACL 字段的系统表,统一添加预设的 RLS 策略; - 普通用户执行查询时,RLS 策略会自动筛选出该用户具有访问权限的对象,未授权对象直接从查询结果中过滤,实现'权限即所见'。
2.2 关键技术组件
2.2.1 核心结构体与列表
KingbaseES 为统一管理 RLS 策略,定义了 CreateRLSForSystemTable 结构体与 CreateRLSForSystemTableList 列表,以此用于记录每条 RLS 的属性与全局策略集合:
// CreateRLSForSystemTable 结构体:记录单条 RLS 策略属性
typedef struct {
int sysTabID; // 系统表 OID
char* relName; // 系统表名称
char* policyName; // RLS 策略名称
char* funcName; // 权限判断函数
char* schemaName; // 权限判断函数所属模式
char* relColname1; // 权限判断函数参数 1
char* relColname2; // 权限判断函数参数 2
char* privType;
} CreateRLSForSystemTable;
CreateRLSForSystemTable CreateRLSForSystemTableList[SYSTABLE_POLICY_MAXNUM] = {
{RelationRelationId,,,,,,,},
{DatabaseRelationId,,,,,,,},
{TriggerRelationId,,,,,,,}
};


