如果我可以解码 Kubernetes 秘密,那么它们有什么意义呢?

What is the point of Kubernetes secrets if I can decode them?

Kubernetes.

中存储的秘密我可以轻松获取
$ kubectl get secret my-app-secrets -o yaml

Select 来自我要解码的输出的秘密值。

示例ZXhwb3NlZC1wYXNzd29yZAo=

$ echo ZXhwb3NlZC1wYXNzd29yZAo= | base64 --decode
> exposed-password

我不确定我是否了解 Kubernetes 生态系统中秘密资源的有效性,因为它很容易获得。

base64是编码,不是加密,它可以让您以方便的方式对信息进行简单的编码。

您编码的数据可能包含很多无法识别的字符、换行等,因此编码起来很方便。

在 kubernetes 中,您可以使用此 instruction.

启用加密

但是 kubernetes 不应该是唯一的真相来源,相反,kubernetes 从您需要 select 的外部保险库加载这些秘密,例如 hashicorp's vault,如评论中所示。

除了 hashicorp 保险库之外,还有多种方法可以在 git 中存储秘密:

您可能还对kubesec项目感兴趣,可以用来分析kubernetes资源的安全风险。

重点是在 Kubernetes 中,秘密允许您通过 控制对secret,而不是加密它。

它有几种机制:

就是说,如果出现问题,Sealed Secrets created by Bitnami 或其他解决方案(请参阅 Mokrecov 的回答)已经出现,可以使问题更加稳健,以防不速之客获取您的秘密.

kubernetes 中的秘密是单独的清单,不是为了保护您的秘密数据,而是为了将您的秘密数据与您的 deployment/pod 配置分开。

然后由您决定如何保护您的秘密,有很多选择各有利弊(请参阅 Mokrecov 的回答)。与其他类型相比,秘密也有一些优势。像命名空间限制,单独的访问管理,在需要之前在pod中不可用,它们不写在本地磁盘存储中。

让我们反过来想,假设在 kubernetes 中没有任何秘密。现在,您的秘密数据将在您的 deployment/pod/configmap 中。你有几个问题。例如:

  1. 您想向所有用户授予对部署清单的访问权限,但仅将对机密的访问权限限制为 A 和 B。你是怎么做到的?
  2. 如果要加密机密,则必须将所有数据连同部署数据一起加密,这将使维护变得不可能。或者你可以加密每个秘密值,但你必须为它们中的每一个提出一些解密机制,并且解密密钥无论如何在那个阶段都是不可用的。
  3. 您可以使用 ConfigMap 将机密数据与配置分开。但是当你想添加加密机制,或者对它进行一些访问限制时,你就会受到ConfigMap特性的限制,因为它的本意只是存储非机密数据。使用 Secrets,您可以轻松选择添加 encryption/restrictions.