25.6.14.2 NDB 文件系统加密实现
对于 NDB
透明数据加密(TDE),数据节点在静止状态下对用户数据进行加密,安全性由文件系统密码提供,该密码用于每个数据节点上的秘密文件的加密和解密。秘密文件包含一个节点主钥(NMK),这个钥匙稍后用来对不同类型的用于持久性的文件进行加密。NDB
TDE 加密了用户数据文件,包括 LCP 文件、重做日志文件、表空间文件和未决日志文件。
您可以使用 ndbxfrm 工具来查看一个文件是否加密,如下所示:
> ndbxfrm -i ndb_5_fs/LCP/0/T2F0.Data
File=ndb_5_fs/LCP/0/T2F0.Data, compression=no, encryption=yes
> ndbxfrm -i ndb_6_fs/LCP/0/T2F0.Data
File=ndb_6_fs/LCP/0/T2F0.Data, compression=no, encryption=no
可以使用 ndb_secretsfile_reader 程序来从加密的 NDB 数据文件中获取钥匙信息,如下所示:
> ndb_secretsfile_reader --filesystem-password=54kl14 ndb_5_fs/D1/NDBCNTR/S0.sysfile
ndb_secretsfile_reader: [Warning] Using a password on the command line interface can be insecure.
cac256e18b2ddf6b5ef82d99a72f18e864b78453cc7fa40bfaf0c40b91122d18
每个节点的钥匙层次结构可以表示如下:
-
用户提供的密码(P)通过一个密钥派生函数使用随机盐来生成一个唯一的密码钥(PK)。
-
每个节点上的 PK 加密了该节点上数据的所有数据在其自己的秘密文件中。
-
秘密文件中的数据包括一个唯一、随机生成的节点主钥(NMK)。
-
NMK 使用包装加密一个或多个随机生成的数据加密钥(DEK)值在每个加密文件的头部中,包括 LCP 和 TS 文件,以及重做和未决日志。
-
数据加密密钥值(DEK0,…,DEKn)用于对每个文件中的[子集]数据进行加密。
密码直接加密包含随机NMK的秘密文件,该NMK加密了每个加密文件在节点上的头部部分。加密后的文件头包含用于该文件中数据的随机数据密钥。
加密由NDBFS
层在数据节点中实现透明地。NDBFS
内部客户端块对其文件进行正常操作;NDBFS
将物理文件包装成额外的头部和脚本信息,支持加密,并在读取或写入文件时对数据进行加密和解密。被包装的文件格式称为ndbxfrm1
。
节点密码与随机盐一起使用PBKDF2来加密秘密文件,该文件包含用于加密每个加密文件中数据加密密钥的随机NMK。
加密和解密的工作是在NDBFS I/O线程(而不是信号执行线程,如主、tc、ldm或rep)中进行。这与压缩LCPs和压缩备份类似,通常会导致I/O线程CPU使用率增加;您可能需要根据实际情况调整ThreadConfig
(如果适用)以调整I/O线程的配置。