怎样在 Kubernetes 中存储 Secret

什么是秘密?

Kubernetes Secret 是一个使我们能够存储和管理敏感信息的对象。 Secret 可以包含 SSH 密钥、OAuth 数据或其他用户身份验证信息(如密码)等数据。 它通常以 Kubernetes 原生的方式存储在集群中。 使用 Secret 对象可以更精细地控制高度敏感数据的使用方式。 它还降低了数据暴露给未经授权方的风险。

防范措施

默认情况下,任何有权访问 Kubernetes 中的 API 或 etcd(底层数据存储)的人都可以查看 Secret。 当我们创建 Secrets 资源时,API 服务器将数据以 base64 编码形式存储在 etcd 中。 Base64 不是加密! 为了安全地使用 Secrets,请立即调整最小推荐值。

  • 为机密启用“静态加密”。
  • 快速启用或重新配置限制 Secret 读写的 RBAC 规则。 请注意,任何有权创建 pod 的人都可以隐式获取秘密。

为什么要保护秘密?

通常,Kubernetes 默认是不安全的。 所有 pod 都使用 CAP_NET_RAW 权限级别。 默认情况下允许将原始数据包注入网络的能力是完成特定启动任务的有用且有效的工具。 但是,由于所有 pod 都可以打开原始套接字,因此强烈建议不要在配置后启用此状态。

允许这些默认设置保持超过必要的时间允许攻击者接管单个 Pod,可能会将恶意数据包注入整个 Kubernetes 集群。 应快速使用机密的初始权限级别,然后对其进行修改以锁定系统。

一个快速 etcd 搜索 揭示了数千个可公开访问的 etcd 服务器,突出了提高安全性的必要性。 etcd 是一个开源、分布式、键值对存储,用于容纳和管理 Kubernetes 的配置数据、状态数据和元数据。

秘密怎样运作?

Secret 可以作为卷挂载,也可以作为环境变量公开给 Kubernetes Pod 中的容器。 有两种类型的秘密:

  1. 内置秘密:Kubernetes 服务帐户自动创建秘密并使用 API 凭证将它们附加到容器。 如果引发其他安全问题,可以覆盖或禁用此方法。
  2. 自定义机密:在这里我们可以定义我们的敏感或私有数据并创建一个 Secret 来存储它。

这些机密可以放在 YAML 文件或其他指定位置,并被要求验证访问权限、确定权限级别或用于其他验证目的。

怎样保护秘密

我们通过假设会发生妥协来开始保护秘密的过程。 这个概念是零信任安全的基本原则之一。 此外,我们应该对所有传输中的 Secret 使用 TLS 加密。 这种编码应该发生在应用层。

定期更改秘密,就像密码一样,也是一个很好的做法。 使用隔离将机密与所有其他对象分开只会进一步减少攻击面。 最后,在所有访问门户、日志和其他服务网关中采用可靠的审计实践可以提高安全性。 这些步骤提供了一个更精细的安全控制过程,可以保护您的秘密。

用于访问我们的秘密的三种方法可以分类如下:

  • 彻底的攻击:黑客、入侵者或其他渗透者经常扫描或设计进入集群以获取信息。
  • 意外曝光:秘密可能会从存储在存储桶中或位于存储库中的文件中意外泄露。
  • 错误配置的权限: 如果权限设置太低或组用户被授予额外权限,则会出现安全问题。

信封加密

信封加密是 Kubernetes 使用另一个密钥加密密钥的一种方法。 它位于 Kubernetes API 和 etcd 服务器之间,对通过它的数据进行加密,因此没有未加密的信息存储在 etcd 上。 Kubernetes 1.7 将此功能整合到核心 Kubernetes 系统中。

Kubernetes 使用的另一个工具是密封的秘密。 密封的秘密 是一个开源工具,用于管理将敏感信息部署到 Kubernetes 集群。 它还将机密安全地存储在 Git 存储库中,从而允许集成到 CI/CD 管道中。

创建一个秘密

我们可以使用以下方法之一创建 Secret 对象。

自动地

我们可以使用 kubectl create secret 命令。 这是创建 Secret 的格式。

[email protected] [~]# kubectl create secret (type) (name) (data)
  • 类型:该类型被定义为通用、TLS 或 docker-registry 元素。
  • 姓名: 这是秘密的名字。
  • 数据:这是目录路径或键值对。

手动

我们可以通过多种方式手动创建秘密。 我们可以将 Secret 信息添加到 JSON 或 YAML 文件并使用 kubectl apply 命令。 此调用将文件中包含的对象定义为 Secret。 然后使用以下命令部署该对象。

[email protected] [~]# kubectl create -f filename.yaml 

此外,可以使用以下标志 –from-file 或 –from-env-file 从一个或多个文件生成 Secret。 使用 –from-file 标志创建 Secret 时,文件的全部内容就是 Secret 本身。 如果 Secret 的值包含多个键值对,我们使用 –from-env-file 标志来代替。 使用这些标志,我们可以传递单个文件或多个文件。

[email protected] [~]# kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2 

可以按照这种格式使用包含多个文件的目录。

[email protected] [~]# kubectl create secret type name --from-file /path/to/directory. 

以下命令分别使用两个文件(user.txt 和 pass.txt)创建 Secret。 以下命令从这些文件中的数据设置密钥。

[email protected] [~]# kubectl create secret generic authme --from-file ./user.txt --from-file ./pass.txt 

自定义

最后,我们可以使用 自定义. 此工具是一种独立方法,用于通过 kustomization 文件自定义 Kubernetes 中的对象。 它允许用户自定义原始 YAML 文件,同时保持原始 YAML 文件不受干扰。

编辑密钥

可以使用以下命令编辑当前 Secret。

[email protected] [~]#kubectl edit secrets authme

此命令打开默认配置编辑器,它允许我们更新数据字段中包含的 base64 编码的 Secret 参数。

使用秘密

要使用 Secret,Pod 需要对 Secret 的引用。 Pod 以三种方式使用秘密:

  • 作为包含文件或驻留在一个或多个容器上的已安装卷。
  • 作为容器的环境变量。
  • 使用 kubelet 为 Pod 拉取镜像时。

注意:Secret 对象的名称必须是完全限定域名 (FQDN) 的子域。

系统的不同部分也可以使用秘密而不直接暴露给 Pod。 关于怎样使用秘密的完整描述将填补另一篇文章,所以我们到此结束。

结论

k8s.secrets3

机密是包含敏感数据(如密码、SSH 密钥或 OAuth 令牌)的对象。 将这些机密信息存储在 Secret 中比将其存储在 Pod 的定义中或容器映像中更安全,并且在更大程度上也是一种更灵活的方法。 确保我们的集群安全可靠是使用 Secrets 的主要目标,同时允许轻松访问那些需要访问的用户和服务。

号召性用语

我们的解决方案团队由知识渊博、经验丰富的托管顾问组成,他们对本文讨论的技术有深入的了解。 如果您对此信息有任何疑问,我们将始终每天 24 小时、每周 7 天、每年 365 天回答与本文相关的任何询问。

我们将解释您怎样使用我们的托管平台来利用这些平台 Cloud 或私人 Cloud 由 VMware 和 NetApp 提供支持! 如果您在完全托管的 VPS 服务器上, Cloud 专用、私有父服务器或专用服务器所有者并希望对其中一个平台进行更改,请致电 800.580.4985 联系我们,或与我们进行聊天或咨询以了解怎样操作!