如何在Kubernetes静态加密场景下保护加密密钥文件?
如何保护Kubernetes静态加密的密钥文件?
针对你提到的——用--encryption-provider-config=/etc/kubernetes/config/encryption.yaml配置API Server,ETCD已加密但解密密钥仍存留在主节点的安全问题,这里有几个实际可行的解决方案:
1. 用节点级加密存储保护密钥文件
把存放encryption.yaml的目录(比如/etc/kubernetes/config)挂载到LUKS加密分区上。这样就算主节点的磁盘被物理窃取,没有解密密码也无法读取密钥文件。
- 操作流程:先备份当前的加密配置文件,创建LUKS加密分区,将分区挂载到目标目录,恢复配置文件,最后更新
/etc/fstab确保开机自动挂载(可以结合TPM模块实现无交互自动解锁,避免每次重启手动输密码)。
2. 切换到外部KMS管理密钥
放弃本地密钥文件,改用外部密钥管理服务(KMS)来处理加密解密逻辑。API Server只需要配置KMS的连接信息,实际密钥完全由KMS托管,主节点本地不会存储明文密钥。
- 示例
encryption.yaml配置(以自托管KMS为例):
apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets - configmaps providers: - kms: name: internalKms endpoint: unix:///var/run/kms/connector.sock cachesize: 1000 timeout: 3s
主流的KMS选项包括HashiCorp Vault、AWS KMS、Azure Key Vault等,根据你的环境选择即可。
3. 严格限制密钥文件的系统权限
给encryption.yaml设置最小权限,避免非授权用户读取:
- 执行命令设置权限:
chmod 600 /etc/kubernetes/config/encryption.yaml,同时确保文件属主属组为root:root。 - 可以配合Linux ACL进一步缩小访问范围,只允许API Server进程的运行用户(通常是
root或kube-apiserver)访问该文件。
4. 定期轮换密钥并彻底清理旧密钥
就算密钥文件存在,定期轮换能降低泄露后的影响范围:
- 在
encryption.yaml中添加新密钥作为首选加密项,保留旧密钥用于解密存量资源;等所有资源都完成新密钥加密后,再移除旧密钥条目。 - 删除旧密钥文件时,用
shred -u /path/to/old-key.yaml彻底覆盖文件内容,避免被数据恢复工具找回。
5. 强化主节点的访问控制
从源头减少密钥文件被接触的可能:
- 主节点禁用密码登录,只允许SSH密钥认证,并且禁止root用户远程登录。
- 用防火墙限制只有管理IP能访问主节点的SSH、API端口。
- 启用Linux审计日志,监控对
/etc/kubernetes/config目录的访问操作,一旦有异常读取行为能及时告警。
内容的提问来源于stack exchange,提问作者Hlex
相关产品推荐
相关产品推荐

