基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建列加密规则
更新时间:2026-11-03 09:36:43
本文档将详细介绍创建列加密规则的语法、参数及限制说明,并为你提供实用的示例,帮助你快速掌握列加密规则的配置方法。
准备工作
在使用敏感规则之前,需要开启 TDE 加密功能,并创建主密钥:
-- 设置透明表空间加密的方式,取值参见 tde_method(如 internal、obcloud、ocp 等)
ALTER SYSTEM SET tde_method = '<encryption_method>';
ALTER INSTANCE ROTATE INNODB MASTER KEY; -- 首次执行需要等待约 20 秒使秘钥生效
tde_method 参数具体说明请参见 tde_method。
语法
在开始创建列加密规则之前,需先了解相关的语法结构。OceanBase 提供了完整的 DDL 语句来管理列加密规则,包括创建、删除和修改操作。
创建列加密规则
CREATE SENSITIVE RULE <rule_name>
ON <sensitive_field_list>
USING ENCRYPTION [ = <encryption_method>];
详细说明请参见 CREATE SENSITIVE RULE。
删除列加密规则
当您需要移除某个列加密规则时,可以使用以下语法:
DROP SENSITIVE RULE <rule_name>;
详细说明请参见 DROP SENSITIVE RULE。
修改列加密规则
在实际使用过程中,您可能需要根据业务需求调整列加密规则。OceanBase 提供了灵活的修改语法来满足这些需求:
-- 新增敏感列
ALTER SENSITIVE RULE <rule_name> ADD COLUMN <sensitive_field_list>;
-- 删除敏感列
ALTER SENSITIVE RULE <rule_name> DROP COLUMN <sensitive_field_list>;
-- 启用规则
ALTER SENSITIVE RULE <rule_name> ENABLE;
-- 禁用规则
ALTER SENSITIVE RULE <rule_name> DISABLE;
-- 修改加密算法
ALTER SENSITIVE RULE <rule_name> USING ENCRYPTION [= <encryption_method>];
详细说明请参见 ALTER SENSITIVE RULE。
示例
通过以下具体示例可以加深对列加密规则操作的理解。这些示例涵盖了创建、删除和修改规则的主要场景。
创建
-- 创建敏感规则 r1, 保护 tbl1(a), tbl2(b, c), db2.tbl3(e,f);
-- 不加参数时使用默认加密算法 AES-256-ECB,等价于 USING ENCRYPTION = 'aes-256'
CREATE SENSITIVE RULE r1 on tbl1(a), tbl2(b, c), db2.tbl3(e,f)
USING ENCRYPTION;
-- 创建敏感规则 r2, 保护 tbl4(x, y), tbl5(z);
-- 使用 SM4-CBC 加密算法
CREATE SENSITIVE RULE r2 on tbl4(x, y), tbl5(z)
USING ENCRYPTION = 'sm4-cbc';
删除
DROP SENSITIVE RULE r1;
修改
-- 向敏感规则 r1 中增加 tbl2(c), db2.tbl3(x);
ALTER SENSITIVE RULE r1 ADD COLUMN tbl2(c), db2.tbl3(x);
-- 从敏感规则 r1 中删除 tbl2(c)
ALTER SENSITIVE RULE r1 DROP COLUMN tbl2(c);
-- 启用敏感规则 r1
ALTER SENSITIVE RULE r1 ENABLE;
-- 禁用敏感规则 r1
ALTER SENSITIVE RULE r1 DISABLE;
-- 修改敏感规则 r1 的加密算法为默认算法
ALTER SENSITIVE RULE r1 USING ENCRYPTION;
-- 修改敏感规则 r1 的加密算法为 sm4-cbc
ALTER SENSITIVE RULE r1 USING ENCRYPTION = 'sm4-cbc';
从创建规则到查询验证的完整示例
本示例在 MySQL 模式测试租户中保护 enc_demo.enc_employees 表的 phone 列,演示普通用户在授予和回收规则级明文访问权限前后的查询结果。示例使用 OceanBase 数据库 V5.0.1 和 OBClient V2.2.10 验证。
请使用独立测试租户,并确保示例中的数据库、表、用户和规则名称尚未使用。连接命令中的 <host>、<port>、<tenant_name> 和 SQL 中的 <reader_password> 需替换为实际值。不要在已有业务租户中覆盖密钥配置。
说明
列加密控制查询结果中的明文访问,不等同于表空间的存储加密。root 用户默认具有明文访问权限,因此使用新建的普通用户 enc_reader 验证规则效果。查询表还需要 SELECT 权限,PLAINACCESS 不替代 SELECT 权限。
使用
root用户连接目标 MySQL 租户。此处不是连接 sys 租户。$ obclient -h<host> -P<port> -uroot@<tenant_name> -p配置主密钥。本例使用
internal方式;已按本文「准备工作」完成主密钥配置的租户可跳过此步。首次设置后,按「准备工作」中的说明等待主密钥生效,再执行后续步骤。obclient> ALTER SYSTEM SET tde_method='internal'; Query OK, 0 rows affected obclient> ALTER INSTANCE ROTATE INNODB MASTER KEY; Query OK, 0 rows affected创建数据库和测试表,插入两行数据。
obclient> CREATE DATABASE enc_demo; Query OK, 1 row affected obclient> USE enc_demo; obclient> CREATE TABLE enc_employees (id INT PRIMARY KEY, phone VARCHAR(32)); Query OK, 0 rows affected obclient> INSERT INTO enc_employees VALUES (1, '13800000001'), (2, '13800000002'); Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 obclient> COMMIT; Query OK, 0 rows affected obclient> SELECT id, phone FROM enc_employees ORDER BY id; +------+-------------+ | id | phone | +------+-------------+ | 1 | 13800000001 | | 2 | 13800000002 | +------+-------------+ 2 rows in set创建普通用户
enc_reader,授予表的SELECT权限,再创建保护phone列的敏感规则r_phone。此时不授予明文访问权限。obclient> CREATE USER enc_reader IDENTIFIED BY '<reader_password>'; Query OK, 0 rows affected obclient> GRANT SELECT ON enc_employees TO enc_reader; Query OK, 0 rows affected obclient> CREATE SENSITIVE RULE r_phone ON enc_employees(phone) USING ENCRYPTION='aes-256'; Query OK, 0 rows affected保留管理员会话,在另一个终端使用
enc_reader登录同一租户的enc_demo数据库并查询。$ obclient -h<host> -P<port> -uenc_reader@<tenant_name> -p --binary-as-hex enc_demo--binary-as-hex使 OBClient 以十六进制显示二进制密文,避免直接显示不可打印字符。密文与密钥有关,实际值可能与本例不同。obclient> SELECT id, phone FROM enc_employees ORDER BY id; +------+------------------------------------+ | id | phone | +------+------------------------------------+ | 1 | 0x1AE6C8C6D1328E85E8D9E7A547196C4E | | 2 | 0xA34CFA09540F1847FA0E569AFCBF1E78 | +------+------------------------------------+ 2 rows in setid列正常显示,phone列返回密文,说明只有SELECT权限的用户不能读取受保护列的明文。在管理员会话中,为
enc_reader授予r_phone的明文访问权限。obclient> GRANT PLAINACCESS ON SENSITIVE RULE r_phone TO enc_reader; Query OK, 0 rows affected退出
enc_reader的会话,使用步骤 5 的连接命令重新登录后查询。obclient> SELECT id, phone FROM enc_employees ORDER BY id; +------+-------------+ | id | phone | +------+-------------+ | 1 | 13800000001 | | 2 | 13800000002 | +------+-------------+ 2 rows in setphone列恢复为插入时的电话号码,说明规则级明文访问授权生效。在管理员会话中回收明文访问权限,保留表的
SELECT权限。obclient> REVOKE PLAINACCESS ON SENSITIVE RULE r_phone FROM enc_reader; Query OK, 0 rows affected退出
enc_reader的会话,使用步骤 5 的连接命令重新登录后查询。obclient> SELECT id, phone FROM enc_employees ORDER BY id; +------+------------------------------------+ | id | phone | +------+------------------------------------+ | 1 | 0x1AE6C8C6D1328E85E8D9E7A547196C4E | | 2 | 0xA34CFA09540F1847FA0E569AFCBF1E78 | +------+------------------------------------+ 2 rows in set查询仍然成功,但
phone列再次返回密文,说明明文访问权限已回收。本示例采用重新登录的方式验证授权结果,不用于判断已有会话的权限刷新时机。
相关文档
- 列加密概述
- 列加密权限管理
- 查看敏感规则的定义及其属性,请参见 oceanbase.DBA_OB_SENSITIVE_RULES