YugabyteDB密钥管理架构及静态加密密钥相关技术问询
YugabyteDB 密钥管理实现机制详解
一、密钥存储方式(通用&静态块级加密场景)
- 通用场景(未启用静态加密):
YB仅对节点间通信、内部服务认证等场景使用密钥,这类密钥存储在节点本地配置目录,权限被严格限制为仅YB进程可读,不涉及磁盘数据加密。 - 启用静态块级加密时:
YB采用分层密钥结构,避免直接用主密钥加密大量数据:- 数据加密密钥(DEK):每个TServer节点的RocksDB实例会生成独立的DEK,用于加密磁盘上的SSTable、WAL等所有持久化数据块。
- 密钥加密密钥(KEK):DEK会被KEK加密后,存储在TServer本地的
yb-data/tserver/data/rocksdb/encryption_info元数据文件中。KEK的存储分两种模式:- 本地文件模式:用户将KEK写入指定本地文件,通过
--encrypt-at-rest-kek-path配置TServer读取,文件必须设置chmod 600权限,仅YB进程可访问。 - 外部KMS模式:KEK托管在第三方密钥服务(如AWS KMS、HashiCorp Vault),TServer通过预配置的凭证自动调用API获取。
- 本地文件模式:用户将KEK写入指定本地文件,通过
二、数据库停止与重启流程
- 停止流程:
- 集群收到停止指令后,Master、TServer节点依次优雅关闭。
- TServer关闭前会确保所有加密数据落盘,明文DEK仅存在于进程内存中,进程退出后内存被系统回收,无明文残留。
- 重启流程:
- Master节点优先启动,加载加密后的集群元数据(静态加密为全局启用,Master存储同样受加密保护)。
- TServer启动时,先读取本地加密元数据文件中的加密DEK,再获取KEK(本地文件读取或KMS调用),解密得到明文DEK后,用DEK解密磁盘数据,正常对外提供服务。
三、重启时是否需要管理员手动提供密钥?
绝大多数生产场景下不需要:
- 外部KMS模式:TServer通过预配置的IAM角色、API密钥等自动调用KMS获取KEK,无需人工干预。
- 本地文件模式:TServer自动读取预配置路径下的KEK文件,只要文件权限正确、YB进程可访问,就无需手动输入。
- 仅临时测试场景(KEK仅存于内存):重启时需要管理员重新输入KEK,但这不是生产环境的推荐方案。
四、本地KEK场景下的安全保障(无外部主密钥机制)
即便不用外部KMS,YB通过以下机制保障密钥安全:
- 操作系统级权限隔离:KEK文件、加密元数据文件均设置
chmod 600权限,仅YB进程可读,其他用户或进程无法访问。 - DEK加密存储:明文DEK仅在TServer运行时存在于进程内存,磁盘上只有被KEK加密后的DEK,攻击者拿到磁盘文件也无法解密DEK,进而无法读取原始数据。
- 内存保护:YB利用操作系统内存保护机制(如Linux的
mlock),防止明文DEK被换出到磁盘交换分区,减少泄露风险。 - 节点身份认证:集群节点间通信启用TLS,只有经过认证的节点才能访问加密存储资源,避免密钥在传输过程中被窃取。
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

