架构原理
核心原理
对象权限管理
对象权限是当用户要对某个数据库对象进行操作所需拥有的合法操作权限,仅当用户对此对象拥有合法操作的权限,才允许用户对此对象执行相应的操作。访问控制列表(Access Control List,ACL)是实现数据库对象权限管理和权限检查的基础,每个对象都具有一个由AclItem构成的访问控制列表来存储该对象的所有授权信息。当用户访问对象时,如果用户在对象的访问控制列表中并且具有所需的权限就能够访问该对象。
每个访问控制列表是由1个或多个AclItem构成的链表,每个AclItem由授权者、被授权者和权限位3部分构成,记录着可在对象上进行操作的用户及其权限。GaussDB将对对象执行DML类操作和DDL类操作的权限分别记在两个AclItem结构中,最终实现对于每一个数据库对象,相同的授权者和被授权者对应两个不同的AclItem,分别表示记录DML类操作权限和DDL类操作权限,每个权限参数代表的权限如表1所示。
| 参数 | 对象权限 | 参数 | 对象权限 |
|---|---|---|---|
| a | INSERT | T | TEMPORARY |
| r | SELECT | c | CONNECT |
| w | UPDATE | p | COMPUTE |
| d | DELETE | R | READ |
| D | TRUNCATE | W | WRITE |
| x | REFERENCES | A | ALTER |
| t | TRIGGER | P | DROP |
| X | EXECUTE | m | COMMENT |
| U | USAGE | i | INDEX |
| C | CREATE | v | VACUUM |
数据库对象权限管理通过使用SQL命令GRANT/REVOKE授予或回收一个或多个角色在对象上的权限。GRANT/REVOKE命令通过修改访问控制列表中用来记录该用户拥有对此对象执行相应操作权限的AclItem来实现对象权限的授予或回收。详细的ACL权限校验流程如图1所示。
角色管理
角色是拥有数据库对象和权限的实体,在GaussDB中角色和用户是基本相同的,区别是创建角色时不会同时创建同名schema,默认也没有连接数据库的权限。角色组内的用户自动继承角色组的权限,当有多个用户需要对同一个或一组对象进行操作时,权限不直接分配给用户,而是先分配给角色,然后再将角色分配给用户。用户通过扮演角色来获得权限。即将这一个或一组对象的权限赋给一个用户组,再把需要操作这一个或一组对象的用户全部放到该用户组里,而不是对每一用户进行赋权。
- 核心关系:
- 用户分配 (UA): 用户 <=> 角色 的多对多关系。
- 权限分配 (PA): 权限 <=> 角色 的多对多关系。
- 权限判定过程:
- 校验当前用户权限:当前用户是否具有需要的权限。
- 收集角色:首先找到用户 Alice 被分配了哪些角色(例如 Role_Manager 和 Role_Reviewer)。这需要查询 UA关系表。
- 校验被分配角色的权限:逐个找到每一个角色都被赋予了哪些权限,校验每个角色是否具有需要的权限。
- 特点:
- 优点:简化权限管理。例如,给100个员工升职为经理,只需将角色从 Employee 改为 Manager,无需修改大量ACL。
- 缺点:如果角色设计不当可能会导致“角色爆炸”,增加管理复杂度。
GaussDB提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限的操作的访问,可以将这些角色GRANT给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当谨慎,以确保它们被用在需要的地方。表2描述了内置角色允许的权限范围。
| 角色 | 权限描述 |
|---|---|
| gs_role_signal_backend | 具有调用函数pg_cancel_backend、pg_terminate_backend和pg_terminate_session来取消或终止其他会话的权限,或调用函数pg_terminate_active_session_socket来关闭活跃会话和客户端的socket连接,但不能操作属于初始用户和PERSISTENCE用户的会话。 |
| gs_role_tablespace | 具有创建表空间(tablespace)的权限。 |
| gs_role_replication | 具有调用逻辑复制相关函数的权限。 |
| gs_role_account_lock | 具有加解锁用户的权限,但不能加解锁初始用户和PERSISTENCE用户。 |
| gs_role_pldebugger | 具有执行dbe_pldebugger下调试函数的权限。 |
| gs_role_public_dblink_drop | 具有执行删除public database link对象的权限。 |
| gs_role_public_dblink_alter | 具有执行修改public database link对象的权限。 |
| gs_role_seclabel | 具有创建、删除和应用安全标签的权限。 |
| gs_role_public_synonym_create | 具有创建public同义词的权限。 |
| gs_role_public_synonym_drop | 具有删除public同义词的权限。 |
系统权限管理
系统权限是指用户执行特定数据库操作的权限,如创建数据库、创建用户、查看审计信息等,不同的管理员拥有不同的系统权限,系统权限不会通过角色继承。
初始用户、安全管理员和三权分立关闭状态下的系统管理员可以授予/撤销用户的系统权限。数据库支持开启三权分立,三权分立开启后可以保证系统管理员、安全管理员、审计管理员三个角色权限分离。初始用户是在数据库安装过程中自动生成的账户,如果安装时不指定初始用户名称则该账户与进行数据库安装的操作系统用户同名。初始用户的权限不受三权分立设置影响,因此建议仅使用初始用户用于系统权限管理以及安全逃生,而非业务应用。
ANY权限管理
ANY权限是GaussDB中一种特殊的系统权限,允许用户对特定类型的所有数据库对象执行操作,而不需要显式指定每个对象。这种权限通常用于管理大量对象时的批量授权场景。
目前支持以下ANY权限:CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、SELECT ANY TABLE、INSERT ANY TABLE、UPDATE ANY TABLE、DELETE ANY TABLE、TRUNCATE ANY TABLE、CREATE ANY SEQUENCE、CREATE ANY INDEX、CREATE ANY FUNCTION、EXECUTE ANY FUNCTION、 CREATE ANY PACKAGE、EXECUTE ANY PACKAGE、CREATE ANY TYPE、ALTER ANY TYPE、DROP ANY TYPE、ALTER ANY SEQUENCE、DROP ANY SEQUENCE、SELECT ANY SEQUENCE、ALTER ANY INDEX、DROP ANY INDEX、CREATE ANY SYNONYM、DROP ANY SYNONYM、CREATE ANY TRIGGER、ALTER ANY TRIGGER、DROP ANY TRIGGER。
基于标签的强制访问控制(MAC)
基于标签的强制访问控制特性支持用户对主体和客体设置安全标签,并基于系统设定好的强制访问控制策略规则执行访问控制。通过给主体(用户或角色)和客体(表或表的列)设置合适的安全标签来控制用户/角色可以操作数据库的表或表的列。
系统新增语法和系统表支持安全标签的创建、删除和记录,然后在针对数据库表或表的列进行权限校验的位置,增加主体和客体安全标签的比较逻辑,通过比较安全标签级别和范围是否符合强制访问控制策略规则来决定校验是否通过,不通过则拒绝访问。
系统会按照严格的强制访问控制策略进行访问控制,规则由系统决定,不能更改,从而对数据库中的敏感信息提供更严格的权限控制。
首先,用户根据业务需要创建由等级和范围组成的安全标签,并将安全标签分别应用到主体(用户或角色)和客体(表或表的列)上。然后当强制访问控制检查开关打开(enable_mac_check=on),用户执行DML操作时,系统会自动根据内置的基于安全标签的强制访问控制策略校验主体是否被允许访问客体,如果校验不通过,则访问失败。MAC校验流程如图2所示。
MAC规则如下:
- 初始用户、具有SYSADMIN权限的用户或者继承了内置角色gs_role_seclabel权限的用户有权限创建、删除和应用安全标签。
- 安全标签由等级和范围两部分组成,两者中间用冒号分隔,形式如:等级类别:范围类别,其中等级类别有且仅由一个等级组成,范围类别可由多个范围组成,但至少需要有一个范围,例如“L1:G2,G41,G6-G27”。
- 等级分类中有1024个等级,命名为Li,其中1≤i≤1024,等级满足偏序关系(若i ≤ j,则Li ≤ Lj),例如等级L1小于等级L3。
- 范围分类中有1024个范围,命名为Gi,其中1≤i≤1024,范围之间无法比较大小,但可以进行集合运算,多个范围之间用逗号分隔,连字符表示区间,例如{G2-G5}表示{G2,G3,G4,G5},集合{G1}是集合{G1,G6}的子集。
- 等级和范围的首字母L和G均为大写;L和G之后至少要有一个数字字符,且第一位非零,不允许出现其他非数字字符;{Gxxx-Gyyy}形式中数字yyy必须大于等于xxx。
- 不符合要求的等级和范围均为非法输入,系统会报错。
方案优势
提供多种访问控制模型,用户可以根据数据机密等级、管理方式、用户角色等维度选择一个或多个模型进行访问控制。通过对权限的精细管理,保证了数据安全。

