首批通过分布式安全可靠测评,为关键业务系统打造
列加密权限管理
更新时间:2026-06-22 08:13:55
在配置好列加密规则后,合理的权限管理是确保数据安全的关键环节。本文档将详细介绍 OceanBase 列加密功能的权限体系和管理语法,帮助你建立完善的权限控制机制,确保敏感数据只对授权用户可见。
准备工作
在创建列加密规则前,需要配置密钥获取方式,获取主密钥:
-- 设置透明表空间加密的方式,取值参见 tde_method(如 internal、obcloud、ocp 等)
ALTER SYSTEM SET tde_method = '<encryption_method>';
-- 创建 Keystore
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE keystore_name IDENTIFIED BY oceanbase_password;
-- 开启 Keystore
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY oceanbase_password;
-- 设置主密钥,首次执行需要等待 20 秒使主密钥生效
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY oceanbase_password;
tde_method 参数具体说明请参见 tde_method。
权限类型
列加密功能采用基于规则的权限类型,通过数据保护规则控制用户对敏感列的访问权限。OceanBase 在 Oracle 权限体系中新增了专门的权限类型来支持列加密功能,包含系统权限和敏感规则级权限。
系统权限
| 权限名称 | 说明 | 默认拥有者 | 升级处理 | 权限限制 | 功能范围 | 包含关系 |
|---|---|---|---|---|---|---|
| CREATE SENSITIVE RULE | 允许用户创建和删除敏感规则。 | SYS 用户。 | 系统升级时自动赋予。 | SYS 用户权限不能被 REVOKE。 |
可使用 CREATE/DROP SENSITIVE RULE 语法。 |
包含在 ALL PRIVILEGES 中。 |
| PLAINACCESS | 允许用户访问所有明文数据,不受数据保护规则影响。 | SYS 用户。 | 系统升级时自动赋予。 | SYS 用户权限不能被 REVOKE。 |
可访问所有明文数据,不受任何数据保护规则影响。 | 不包含在 ALL PRIVILEGES 中。 |
规则级权限
| 权限名称 | 说明 | 权限范围 | 自动授权 |
|---|---|---|---|
| PLAINACCESS | 允许用户访问特定规则所关联列的明文数据。 | 拥有某条规则上的 PLAINACCESS 权限的用户可以访问这条规则所关联的列的明文数据。 |
创建规则的用户不会自动拥有这条规则的 PLAINACCESS 权限。 |
权限管理
授予权限语法及示例
语法如下:
-- 授予用户/角色创建敏感规则的权限. 该权限只有系统级
GRANT CREATE SENSITIVE RULE TO <user_or_role_list>;
-- 授予用户/角色系统级的明文访问权限
GRANT PLAINACCESS ANY SENSITIVE RULE TO <user_or_role_list>;
参数说明如下:
| 参数 | 说明 | 示例 |
|---|---|---|
user_or_role_list |
用户或角色列表,多个用户用逗号分隔 | u1, u2, r1 |
示例如下:
-- 授予用户 u1 系统级的创建敏感规则的权限
GRANT CREATE SENSITIVE RULE TO u1;
-- 可以一次性对多个用户/角色授予权限
-- 授予用户 u2 和角色 r1 创建敏感规则的权限
GRANT CREATE SENSITIVE RULE TO u2, r1;
语法如下:
-- 规则级赋权。注意需要使用 SENSITIVE RULE 关键字
GRANT PLAINACCESS ON SENSITIVE RULE <rule_name> TO <user_or_role_list>;
参数说明如下:
| 参数 | 说明 | 示例 |
|---|---|---|
rule_name |
敏感规则的名称 | 'salary_encryption', 'credit_card_rule' |
user_or_role_list |
用户或角色列表,多个用户用逗号分隔 | u1, u2, r1 |
示例如下:
-- 授予 u1 系统级的明文访问权限(同理可以对多个用户/角色同时授予权限)
GRANT PLAINACCESS ANY SENSITIVE RULE TO u1;
-- 授予 u1 对于规则 r1 的明文访问权限
-- 同理可以对多个用户/角色同时授予权限(但一次只能授予一个规则上的权限)
GRANT PLAINACCESS ON SENSITIVE RULE r1 TO u1;
注意,不支持更细粒度(表、列级)的 PLAINACCESS 权限的赋权。使用如下形式的语法会报错:
-- 错误示例
GRANT PLAINACCESS ON <database>.<table> (<col_list>) TO <user_or_role_list>;
撤销权限语法及示例
语法如下:
-- 撤回用户/角色创建敏感规则的权限. 该权限只有系统级
REVOKE CREATE SENSITIVE RULE FROM <user_or_role_list>;
-- 撤回用户/角色系统级的明文访问权限
REVOKE PLAINACCESS ANY SENSITIVE RULE FROM <user_or_role_list>;
参数说明如下:
| 参数 | 说明 | 示例 |
|---|---|---|
user_or_role_list |
用户或角色列表,多个用户用逗号分隔 | u1, u2, r1 |
示例如下:
-- 撤权
REVOKE CREATE SENSITIVE RULE FROM u1;
-- 可以一次性对多个用户/角色撤回权限
-- 撤回用户 u2 和角色 r1 创建敏感规则的权限
REVOKE CREATE SENSITIVE RULE FROM u2, r1;
语法如下:
-- 规则级撤权。注意需要使用 SENSITIVE RULE 关键字
REVOKE PLAINACCESS ON SENSITIVE RULE <rule_name> FROM <user_or_role_list>;
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
rule_name |
敏感规则的名称 | 'salary_encryption', 'credit_card_rule' |
user_or_role_list |
用户或角色列表,多个用户用逗号分隔 | u1, u2, r1 |
示例如下:
-- 撤回 u1 系统级的明文访问权限(同理可以对多个用户/角色同时撤回权限)
REVOKE PLAINACCESS ANY SENSITIVE RULE FROM u1;
-- 撤回 u1 对于规则 r1 的明文访问权限
-- 同理可以对多个用户/角色同时撤回权限(但一次只能撤回一个规则上的权限)
REVOKE PLAINACCESS ON SENSITIVE RULE r1 FROM u1;
注意,不支持更细粒度(表、列级)的 PLAINACCESS 权限的撤权。使用如下形式的语法会报错:
-- 错误示例
REVOKE PLAINACCESS ON <database>.<table> (<col_list>) FROM <user_or_role_list>;
查看权限
支持查看当前租户下的所有敏感数据保护规则,或查看指定表、指定用户关联的所有敏感规则。支持使用 LIKE 子句过滤规则名。
语法如下:
SHOW SENSITIVE RULES opt_show_condition
| SHOW SENSITIVE RULES from_or_in relation_factor from_or_in USER user_factor opt_show_condition
| SHOW SENSITIVE RULES from_or_in USER user_factor opt_show_condition;
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
opt_show_condition |
可选的显示条件,如 LIKE 子句 |
LIKE '%rule1%' |
from_or_in |
可选的从子句 | FROM 或 IN |
relation_factor |
表名 | tb1, employees |
user_factor |
用户名 | u1, u2 |
示例如下:
-- 查看当前租户下所有的 sensitive rules
SHOW SENSITIVE RULES;
-- 查看 tb1 关联的所有数据保护规则
SHOW SENSITIVE RULES FROM tb1;
-- 查看 u1.tb1 关联的所有数据保护规则
SHOW SENSITIVE RULES FROM tb1 FROM u1;
-- 查看 u1 用户关联的所有数据保护规则
SHOW SENSITIVE RULES FROM USER u1;
-- 使用 LIKE 子句过滤规则名
SHOW SENSITIVE RULES LIKE '%rule1%';
SHOW SENSITIVE RULES FROM tb1 LIKE '%rule1%';
SHOW SENSITIVE RULES FROM tb1 FROM u1 LIKE '%rule1%';
SHOW SENSITIVE RULES FROM USER u1 LIKE '%rule1%';
返回结果形式示例如下:
| 列名 | rule_id | rule_name | POLICY | METHOD | ENABLED | PROTECT_COLS |
|---|---|---|---|---|---|---|
| 示例 | 1 | 'ENCRYPT_COL' | 'ENCRYPTION' | 'AES-256-ECB' | 'YES' | 'user1.tbl1(col_1, col_2), user2.tbl2(col_3), user3.tbl4(col_4, col_5)' |
返回结果字段说明:
| 字段名 | 说明 | 示例值 |
|---|---|---|
rule_id |
规则 ID,系统自动生成 | 1, 2 |
rule_name |
规则名称 | 'ENCRYPT_COL' |
POLICY |
策略类型 | 'ENCRYPTION' |
METHOD |
加密方法 | 'AES-256-ECB' |
ENABLED |
是否启用 | 'YES', 'NO' |
PROTECT_COLS |
受保护的列,格式为 user.table(columns) |
'user1.tbl1(col_1, col_2)',不同表之间以逗号隔开。 |
Oracle 模式下不支持使用 SHOW GRANTS 语句查看相关权限信息,需要使用以下视图查看:
| 视图名称 | 说明 |
|---|---|
| DBA_OB_SENSITIVE_RULE_PLAINACCESS_USERS | 查看所有拥有明文访问权限的用户。 |
ALL_OBJECTS、DBA_OBJECTS、USER_OBJECTS |
可查看敏感规则的保护对象。 |
DBA_TAB_PRIVS、DBA_SYS_PRIVS、ALL_TAB_PRIVS、USER_TAB_PRIVS、ROLE_TAB_PRIVS |
可查看被授予的规则级明文访问(PLAINACCESS)权限。 |
USER_SYS_PRIVS、ROLE_SYS_PRIVS |
可查看被授予的系统级创建敏感规则(CREATE SENSITIVE RULE)权限和明文访问(PLAINACCESS)权限。 |