对于 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_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 会对每个加密文件(包括 LCP 和 TS 文件,以及重做和撤销日志)的标头中一个或多个随机生成的数据加密密钥 (DEK) 值进行加密(使用包装)。
数据加密密钥值 (DEK0, ..., DEKn) 用于加密每个文件中 [数据子集] 的数据。
密码短语会间接加密包含随机 NMK 的秘密文件,该文件会加密节点上每个加密文件的标头的一部分。加密的标头包含用于该文件中数据的随机数据密钥。
加密由数据节点中的 NDBFS
层透明地实现。 NDBFS
内部客户端块会像往常一样对其文件进行操作; NDBFS
会使用支持加密的额外标头和页脚信息来包装物理文件,并在从文件中读取数据和写入文件时进行加密和解密。包装后的文件格式被称为 ndbxfrm1
。
节点密码会使用 PBKDF2 和随机盐进行处理,以加密秘密文件,该文件包含用于加密每个加密文件中随机生成的数据加密密钥的随机生成的 NMK。
加密和解密工作是在 NDBFS I/O 线程中完成的(而不是在信号执行线程中完成,例如 main、tc、ldm 或 rep)。这与压缩 LCP 和压缩备份类似,通常会导致 I/O 线程 CPU 使用量增加;您可能希望调整与 I/O 线程相关的 ThreadConfig
(如果正在使用)。