Kubernetes的秘密-好的,坏的和丑陋的

秘密,顾名思义,应该保密,无论你使用什么工具。虽然有很多最佳实践来保持你的Kubernetes秘密实际上是秘密的,但有一些漏洞可以损害它们的安全性,并可能被恶意实体利用。这篇文章将介绍在Kubernetes上保护您的秘密的流行最佳实践,以及一些秘密管理的新方法。

Kubernetes机密vs.敏感信息的默认处理

Kubernetes秘密负责存储敏感和机密信息,例如密码、OAuth令牌和ssh密钥,这样它们就不会被公开访问并被加密。将机密信息存储在Secret中总是比存储在Pod定义中或用于创建Pod的Docker Image本身更安全。

如果未使用K8s Secrets,则凭据将在应用程序代码中硬编码或保存在文件中。此应用程序代码在推送到源代码管理系统时,将在其中硬编码凭据。完全不建议这样做,因为凭证可能会受到损害。

如果不使用Kubernetes机密,则在应用程序代码中硬编码凭据。

*红点代表秘密

什么是K8s的秘密,它是如何工作的?

Kubernetes Secrets是一种机制,允许在名为etcd的集中存储库中存储秘密,本质上是一个包含集群完整信息的键值存储库。然后,这些秘密可以作为数据卷挂载或作为环境变量公开,供Pod中的容器使用。

因此,K8s Secrets的最大好处主要是将秘密与应用程序代码解耦,并帮助在集群中在需要时重用它们。

Kubernetes Secrets在etcd中存储秘密

*红点代表秘密

小心默认的K8s Secrets

问题:Etcd以非加密形式存储秘密——base64,这是一种编码方法,而不是加密方法。

以下是缓解上述问题的五种方法:

  1. 启用Encryption-at-rest。为了以加密的形式存储etcd中的数据,Kubernetes支持etcd中的数据的静态加密,默认情况下它是不启用的。可以启用此设置,以加密存储在etcd中的数据。
  2. 仅限制管理员用户访问etcd。Etcd是一种分布式的、一致的、高可用的键值存储,用于Kubernetes中存储所有集群数据,可能包含与已部署服务访问相关的敏感信息。为了限制对此信息的访问,只有admin用户应该有权访问etcd数据库。
  3. 在Etcd和您的pod之间启用TLS/SSL。通过在Etcd和pods之间启用TLS/SSL, Kubernetes集群中的内部通信可以得到保护。
  4. 擦除磁盘。如果磁盘没有被妥善处理,就有可能有人恢复机密。为了确保驱动器上的数据不再可读,应该将磁盘擦除。
  5. 不要共享或检查包含base64秘密的YAML / JSON文件到回购。任何有权访问存储库的人都可以带走您的凭据。

有关上述预防措施的详情,请参阅加密静态机密数据而且运行Kubernetes的etcd集群

然而这还不是全部……

不幸的是,即使在所有这些之后,秘密仍然暴露在某个豆荚中的所有容器中。也就是说,任何对你的舱有管理权限的人都能读取你的秘密。这是有问题的(至少可以这么说),因为不存在适当的职责分离,因为多个具有不同安全内容的应用程序能够在pod中运行。结果是,最低特权原则没有得到维护,恶意软件可以简单地复制这些秘密并窃取它们。

为了缓解这种情况,您可以选择以下方法之一:

  1. 遵循K8s的最佳实践,避免在一个pod中运行多个容器。这就是所谓的“一箱一荚”模式。要了解更多信息,请参阅这里是Kubernetes文档。
  2. 使用一个秘密管理方案支持容器隔离模式。

此外,您绝对应该考虑通过以下方式加强您的Admin访问:

  1. 通过对Kubectl命令执行MFA,确保管理员是他们自己。
  2. 使用即时访问解决方案,其中没有人拥有访问您的K8s集群的长期权限,并且仅在需要时才提供访问权限,使用短期TLS证书。
  3. 审计任何管理员正在使用的任何Kubectl命令。

《K8s Secrets》无法解决的其他问题

即使上面所有的配置都完成了,仍然有两个设计问题会让你的秘密暴露:

  1. 应用程序倾向于暴露审计日志和监视系统中的秘密
  2. 同样的秘密也可能在你的其他DevOps平台(CI/CD/CM)中暴露出来。

及时访问:一劳永逸地消除机密泄露的风险

即时访问是一个让你不再担心长期许可的概念,这意味着秘密。这是我们研究的一种秘密管理方法Akeyless通过并相信这是当今复杂的多云和多区域工作环境的唯一合理的方法。

它是如何工作的?在使用临时或按需创建的访问权限/凭据时,仅在需要的时间内向任何人(人或机器)提供访问权限。其次,当短寿命秘密在使用后过期时,它消除了潜在的泄漏问题,因为秘密只在需要时创建,然后过期。

想象一下:一个完整的环境,没有持久的权限,没有人可以访问任何资源。不需要清洁过程,也没有可以严重泄露的秘密。

现在让我们看看准时制方法如何适用于Kubernetes。对于每个请求秘密的容器,它实际上会得到一个临时秘密,这个秘密是在容器被赋予生命时才创建的。每当容器关闭时,特定的秘密要么被删除,要么直接过期。

这样,即使有人通过管理员或应用程序写入的日志文件获取了秘密,潜在的损害也仅限于临时秘密的时间范围。

下载我们的免费指南,“自动伸缩和其他6个Kubernetes自动化挑战”