数据加密概述
GBase 8a 数据加密是提供对数据库落地数据的软加密功能, 用来满足用户的安全需求,提高系统的安全性。数据加密按照 seg 文件中的 DC 为最小单位进行,可以实现表级或者列级不同粒度的加密要求。数据库中所有加密数据都使用同一个密钥,系统启动时会自动读取已创建的密钥文件内容。数据使用密钥文件内容加解密后,密钥文件内容就不能再改变。下图是数据加密功能原理图:
数据加密支持的操作如下:
- 支持加密关键字 encrypt 建表;
- 支持表级或者列级不同粒度的加密要求;
- 支持表加密属性的查询;
- 支持密钥证书管理包括密钥证书的创建、打开、关闭、口令修改、密钥转换操作
- 支持密钥类型转换,即从明文密钥转换到密文密钥,或从密文密钥转换到明文密钥:
明文密钥:无须用户口令,可随机生成也可手动输入;
密文密钥:须用户输入口令,根据口令对随机生成的密钥加密存储;
- 支持查询当前密钥证书状态;
- 支持行存列加密。
数据加密操作
创建加密表和列:
用户通过建表命令 create table 和 encrypt 关键字创建带 encrypt 属性的表或者列,也可以通过 create table like 命令建表。但是不支持 alter 命令修改。
创建加密表示例如下:
create table t1 (a int, b varchar(5)) encrypt; |
创建加密列示例如下:
create table t1 (a int, b varchar(5) encrypt); |
查看加密属性
使用 show create table 可以查询加密属性,表的加密属性会传递给列,列的加密属性不会影响表。
gbase> create table tb(a int encrypt, b varchar(10) encrypt);
Query OK, 0 rows affected (Elapsed: 00:00:00.03)
gbase> show create table tb;
+-------+-------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------
+
| tb | CREATE TABLE "tb" (
"a" int(11) DEFAULT NULL ENCRYPT ,
"b" varchar(10) DEFAULT NULL ENCRYPT
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+--------------------------------------------------------------------------
---+
1 row in set (Elapsed: 00:00:00.07)
密钥证书管理
密钥证书的管理需要管理员用户通过 SQL 方式处理。证书存放在 config 目录,集群环境下, gnode 与 gcluster 都会生成相同密钥证书文件:
gnode: $GBASE_BASE/config/encryption.crt gcluster: $GCLUSTER_BASE/config/encryption.crt |
创建证书
CREATE ENCRYPTION CERTIFICATE IDENTIFIED BY ’ password’ [CONTENT ‘密钥内容’ ] |
-----------创建明文密钥证书示例 gbase> create encryption certificate identified by „‟; Query OK, 0 rows affected (Elapsed: 00:00:00.00) -----------证书重复创建 gbase> create encryption certificate identified by „‟; ERROR 1835 (HY000): encryption certificate already exists. -----------创建密文密钥证书示例 gbase> create encryption certificate identified by 'ddd22'; Query OK, 0 rows affected (Elapsed: 00:00:00.00) -----------证书重复创建 gbase> create encryption certificate identified by 'ddd22'; ERROR 1835 (HY000): encryption certificate already exists. -----------口令检测不正确(启用了密码安全检查,须配置 password_format_option、 password_min_length 参数) gbase> create encryption certificate identified by 'ddd~'; ERROR 1802 (HY000): Invalid password format,length should >= 4 and contain 'number'. |
打开和关闭证书
ALTER ENCRYPTION CERTIFICATE OPEN IDENTIFIED BY ‘password’ |
根据口令打开密文密钥证书, 需要用户输入口令对证书解密获取加密密钥,才能对存储数据加密/解密。
ALTER ENCRYPTION CERTIFICATE CLOSE; |
关闭密钥证书, 关闭后无法对数据加密,会影响加密列的 DML 操作, 示例如下:
-----------打开密钥证书示例 gbase> alter encryption certificate open identified by '1111'; Query OK, 0 rows affected (Elapsed: 00:00:04.76) ------------重复 open gbase> alter encryption certificate open identified by '1111'; ERROR 1829 (HY000): encryption certificate already open. -----------证书不存在 gbase> alter encryption certificate open identified by '1111'; ERROR 1829 (HY000): encryption certificate not exists. -----------解密失败 gbase> alter encryption certificate open identified by '2222'; ERROR 1829 (HY000): decrypt failed, please check password. -----------关闭密钥证书 gbase> alter encryption certificate close; Query OK, 0 rows affected (Elapsed: 00:00:00.00) gbase> insert into t1 values(4); ERROR 1838 (HY000): Encrypt key invalid. gbase> select * from t1; ERROR 1838 (HY000): Decrypt key invalid. |
显示证书状态
SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS; |
增加视图 ENCRYPTION_CERTIFICATE_STATUS,显示证书状态,示例如下:
gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
|
修改证书口令
ALTER ENCRYPTION CERTIFICATE IDENTIFIED BY ‘old_pwd’ TO ‘new_pwd’ |
修改密文密钥口令, old_pwd、 new_pwd 均非空;
为了提高口令的安全性,可以对原证书口令进行二次修改,修改口令不会改变加密密钥,只是使用新口令对原有密钥重新加密生成新证书;
gbase> alter encryption certificate identified by '1111' to '2222'; Query OK, 0 rows affected (Elapsed: 00:00:00.00) ------------旧口令解密失败 gbase> alter encryption certificate identified by '1111' to '2222'; ERROR 1829 (HY000): decrypt failed, please check password. |
明文、密文密钥转换
ALTER ENCRYPTION CERTIFICATE IDENTIFIED BY ‘’ TO ’ password’ |
明文密钥转换为密文密钥, password 不能为空;
明文加密转换为密文加密,即通过口令将明文密钥加密作为密文密钥证书,数据加密所用密钥不变。
ALTER ENCRYPTION CERTIFICATE IDENTIFIED BY ‘ password‘ TO ‗‘ |
密文密钥转换为明文密钥, password 不能为空;密文密钥转换为明文密钥,即通过口令将密文密钥解密获取到的密钥作为明文密钥证书,数据加密所用密钥不变;
-----------明文密钥转密文密钥
|
数据加密的集群配置
密钥证书的口令管理同密码安全,如果开启密码检测须设置 password_format_option、 password_min_length,如果未开启,则口令规则及长度不做限制;
在 gnode 节点 config 目录下的配置文件增加 encrypt_server_host,encrypt_server_port 参数,用于密文加密情况下,集群 gnode 节点重启服务后主动向 server 端获取密钥数据;
如果整个集群都重启的话,针对密文方式,需要手动执行 open(打开密钥)操作方可对加密列做相关 dml 操作。