广告

Kubernetes秘密管理:3种方法,9个最佳实践

  • 浏览(180)
  • 评论(0)
  • 译者:k8s

开发人员必须在早期设计中选择如何存储秘密、如何检索秘密以及如何在应用程序中提供秘密。

秘密,如用户名、密码、API令牌和TLS证书,包含可用于验证和授权用户、组或实体的秘密数据。顾名思义,秘密不能被别人知道或看到。我们该如何保护它们的安全呢?

保护秘密的关键在于管理秘密的方式。在将应用程序或微服务迁移到Kubernetes时,开发人员必须在早期设计中选择如何存储秘密、如何检索秘密以及如何在应用程序中使用秘密。这种设计选择的一部分是为了确保秘密可以在不影响应用程序安全性的情况下可用。

在本文中,笔者将介绍在Kubernetes中管理秘密的方法和推荐的最佳实践。

如何在Kubernetes中进行秘密管理

让我们从一些方法开始。以下是笔者为Kubernetes秘密管理推荐的三种方法。

etcd

etcd是Kubernetes支持的数据存储,许多开发人员选择以Base64编码格式将秘密作为键值对存储在etcd中。存储在etcd中的秘密可以作为环境变量从Kubernetes部署规范中获取——该环境变量存储在内存中,使秘密更难提取。秘密也可以作为卷挂载从容器内部获取,但由于卷挂载将秘密存储在容器文件系统上,因此与环境变量相比,从中提取秘密更容易。如果你担心灵活性和安全性,那么会很高兴etcd访问是通过Kubernetes基于角色的访问控制(RBAC)进行控制的。

通过强并发原语、API和线性化读取,可以使用etcd大规模管理秘密。然而,也有缺点:秘密是以明文(Base64编码)存储、检索和发送的。笔者强烈建议不要以明文形式存储秘密,因为这意味着任何人或任何机器都可以在你不知情的情况下轻松读取你的机密数据。这个问题可以通过配置etcd来使用TLS加密传输中或静止的数据来解决。

请注意,对etcd的访问不受审核,这意味着任何有权访问它的人都可以访问所有秘密。存储在etcd中的秘密也不能进行版本控制或恢复。对于那些需要大规模组织秘密管理的人来说,etcd可能不是正确的选择,因为它是一个Kubernetes数据存储。

秘密管理服务

大多数公共云提供商提供秘密管理服务。最受欢迎的秘密管理服务包括Google Secret Manager、Azure Key Vault和AWS Secrets Manager。

HashiCorp Vault是另一种选择,因为它提供密钥管理、加密、轮换、公钥基础设施(PKI)和其他基本服务。作为集中式秘密管理器,Vault可以与云提供商的秘密管理服务一起使用。使用Vault,运维人员可以避免处理明文密钥,因为当Vault初始化时,初始密钥可以被加密并存储在云密钥管理服务(KMS)中。

容器存储接口驱动程序

容器存储接口(CSI)驱动程序是一个秘密存储,自Kubernetes1.13版本以来可用。CSI驱动程序通过CSI将外部秘密存储(如Azure、AWS、GCP和HashiCorp的Vault)合并到Kubernetes中。

通过卷属性验证秘密存储服务并将必要的秘密装载到pod中,CSI驱动程序方法避免使用Kubernetes etcd数据存储。这使你能够有效地管理秘密,并在需要时进行扩展。

Kubernetes秘密管理的最佳实践

避免秘密扩散

当应用程序秘密存储在不同的地方时,比如在配置文件、git存储库和YAML中,秘密就会扩散。秘密扩散意味着没有秘密管理工作流程。

通过实施集中的秘密管理,降低秘密扩散的风险。建立一个可以安全地存储和检索凭证的地方,并通过适当的授权、监控和日志机制让整个组织都可以使用凭证。

在传输和静止时加密数据

默认情况下,Kubernetes不会安全地存储或传输秘密。因此,至关重要的是要有一个使用端到端TLS加密对传输中的秘密进行加密的结构,以及一个以加密形式存储秘密的解决方案。

使用自动秘密轮换

组织通常对不同的秘密有不同的轮换时间表,以在发生攻击时控制曝光。云秘密管理服务和外部解决方案通常能够提供自动秘密轮换,因此根据数据敏感性,秘密可以每小时轮换一次。

拥有审核日志

了解秘密的活动是个好主意。如果发生入侵,审计日志将提供可见性,并帮助评估事件,包括妥协是否是故意的、受影响的区域和其他调查步骤。

实施反亲和规则

秘密管理解决方案应该是在有限数量的指定VM或主机上的单个进程。如果在Kubernetes上作为一个微服务运行,这个进程将在一个专用的pod中运行。要指定pod应该在哪个节点上运行,可以实现一个反亲和规则来控制pod在设置为运行秘密管理解决方案的节点上的分布。

利用动态秘密

动态秘密是按需生成的短暂秘密,寿命有限。即使攻击者通过泄漏的应用程序代码或调试日志等方式访问秘密,秘密也会在短时间内更改,从而限制暴露并保护应用程序。动态秘密还可以更容易地确定攻击者发现秘密的时间范围,并加快调查。

使用自定义证书颁发机构

作为深度防御方法的一部分,可以使用自定义证书颁发机构(CA)来实现端到端TLS。组织可以选择用自己的CA签署证书,这意味着必须出示组织签署的证书才能访问服务。

在容器内存中存储秘密

将秘密存储在内存中会使攻击者在破解时更难找到秘密。每当容器化应用程序接收到秘密时,它应该存储在内存中,而不是存储在磁盘或主机中可用的volumnMount中。

保护秘密0

许多秘密管理解决方案通常采用信封加密,其中数据加密密钥(DEK)由密钥加密密钥(KEK)保护。在这里,KEK被认为是秘密0,最终的主密钥。如果KEK被泄露,攻击者可以解密DEK,从而解密由DEK加密的数据。

要保护秘密0,请将选择的云服务提供商的身份和访问管理框架(IAM)与密钥管理服务器(KMS)结合使用。请注意,IAM和KMS在信任链中都有自己的秘密0,这也应被视为敏感数据。

总结

当涉及到保护敏感数据时,最有效的方法是坚持零信任模型,假设妥协,并采取措施来降低风险。本文推荐的方法和最佳实践为秘密管理奠定了基础。

原文链接:Kubernetes Secrets Management: 3 Approaches, 9 Best Practices

  • 分享到:
  • icon
  • icon
  • icon
  • icon
箭头