透明数据加密
为了满足保护用户数据安全的需求,Cloudberry Database 支持透明数据加密(Transparent Data Encryption,简称 TDE)功能。
透明数据加密(TDE)是一种用于加密数据库数据文件的技术:
- 数据指的是数据库中的数据。
- 文件在硬盘上以密文存储, 在内存中以明文处理,TDE 用于保护静态数据,因此也叫静态数据加密。
- “透明”意味着用户无需改变操作习惯,TDE 自动管理加密/解密过程,无需用户或应用程序干预。
加密算法简介
基本概念
- DEK (Data Encryption Key):用于加密数据的密钥,由数据库生成,存储在内存中。
- DEK 明文:与 DEK 同义,只能保存在内存中。
- Master Key:主密钥,用于加密 DEK。
- DEK 密文:使用 Master Key 加密后的 DEK,持久化存储。
密钥管理模块
密钥管理模块是透明数据加密的核心组件,采用两层密钥结构:Master Key 和 DEK。Master Key 用于加密 DEK,存储在数据库外部;DEK 用于加密数据库数据,密文形式保存在数据库中。
算法分类
加密算法分为两类:
- 对称加密:加密和解密使用相同密钥。
- 非对称加密:公钥加密,私钥解密,适合一对多、多对一的加密需求。
对称加密中的分组加密算法是主流选择,性能优于流加密和非对称加密。Cloudberry Database 支持 AES 和 SM4 两种分组加密算法。
AES 加密算法
AES 是国际标准的分组加密算法,支持 128、192 和 256 位密钥,常见加密模式包括:
- ECB: 电子密码本模式
- CBC: 密码分组链表模式
- CFB: 密文反馈模式
- OFB: 输出反馈模式
- CTR: 计数器模式
更多 ISO/IEC 加密算法
更多 ISO/IEC 算法包括:
- ISO/IEC 14888-3/AMD1(即 SM2):非对称加密,基于 ECC,性能优于 RSA。
- ISO/IEC 10118-3:2018(即 SM3):消息摘要算法,类似 MD5,输出 256 位。
- ISO/IEC 18033-3:2010/AMD1:2021(即 SM4):无线局域网标准的对称加密算法,支持 128 位密钥和分组长度。
使用方法
在使用透明数据加密(TDE)功能前,请确保满足以下条件:
- 安装 OpenSSL:Cloudberry Database 节点上必须安装 OpenSSL。通常,Linux 发行版的操作系统会自带 OpenSSL。
- Cloudberry Database 版本:确保你的 Cloudberry Database 版本不低于 v1.6.0,该版本开始支持 TDE 功能。
在部署 Cloudberry Database 时,可以通过设置来开启 TDE 功能,之后的所有数据加密操作将对用户完全透明。要在数据库初始化时启用 TDE,使用 gpinitsystem
命令并指定 -T
参数。Cloudberry Database 支持两种加密算法:AES 和 SM4。以下是开启 TDE 的示例:
-
使用 AES256 加密算法:
gpinitsystem -c gpinitsystem_config -T AES256
-
使用 SM4 加密算法:
gpinitsystem -c gpinitsystem_config -T SM4
验证方法
透明数据加密功能对用户是透明的,开启或关闭此特性都不会影响用户的读写操作体验。然而,为了验证加密功能的有效性,可以通过以下步骤模拟密钥文件丢失场景,并确保数据库在没有密钥文件时无法启动。
密钥文件路径在 Coordinator 节点上, 要定位密钥文件的位置,先找到 Coordinator 节点的数据目录,例如:
COORDINATOR_DATA_DIRECTORY=/home/gpadmin/work/data0/master/gpseg-1
然后再找密钥文件:
$ pwd
/home/gpadmin/work/data0/master/gpseg-1
$ ls -l pg_cryptokeys/live/
total 8
-rw------- 1 gpadmin gpadmin 48 Apr 12 10:26 relation.wkey
-rw------- 1 gpadmin gpadmin 48 Apr 12 10:26 wal.wkey
其中 relation.wkey
是用来加密数据文件的密钥,wal.wkey
是用来加密 WAL 日志的密钥。现在只有 relation.wkey
有作用,WAL 日志还没有加密。
验证过程
-
创建表并写入数据。
-
创建一个附加存储(Append-Only,AO)表并插入数据:
postgres=# create table ao2 (id int) with(appendonly=true);
postgres=# insert into ao2 select generate_series(1,10); -
确认数据已成功插入。
-
-
停止数据库。
gpstop -a
-
模拟密钥文件丢失。
-
切换到密钥文件所在目录:
cd /home/gpadmin/work/data0/master/gpseg-1/pg_cryptokeys/
-
将密钥文件移至其他目录(模拟丢失密钥文件的场景):
mv live backup
-
-
尝试启动数据库。
-
使用
gpstart
命令启动数据库:gpstart -a
由于缺少密钥文件,数据库将无法启动。你可以在 Coordinator 节点的数据库日志中看到类似以下的错误日志:
FATAL: cluster has no data encryption keys
这说明数据库在密钥丢失的情况下无法启动,从而确保了数据的安全性。
-
-
恢复密钥文件,将之前备份的密钥文件移回原目录:
mv backup live
-
重新启动数据库并验证数据。
-
使用
gpstart
命令再次启动数据库:gpstart -a
-
数据库成功启动后,查询表
ao2
验证数据是否正常:postgres=# select * from ao2 order by id;
id
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
-
通过上述步骤,可以验证透明数据加密功能的有效性,即数据库在缺少密钥文件时无法启动,保证了静态数据的安全性。