Kubernetes Secrets 的最佳实践
在 Kubernetes 中,密钥是一个存储敏感信息的**对象**,例如密码、OAuth 令牌和 SSH 密钥。
密钥使您可以更好地控制敏感信息的使用方式,并降低意外泄露的风险。密钥值被编码为 base64 字符串,默认情况下以未加密方式存储,但可以配置为在存储时加密。
一个Pod 可以通过多种方式引用密钥,例如在卷挂载中或作为环境变量。密钥专为机密数据设计,而配置图 专为非机密数据设计。
以下最佳实践适用于集群管理员和应用程序开发人员。使用这些指南来提高您在密钥对象中的敏感信息的安全性和更有效地管理您的密钥。
集群管理员
本部分提供集群管理员可以用来提高集群中机密信息安全性的最佳实践。
配置存储时加密
默认情况下,密钥对象以未加密方式存储在etcd 中。您应该配置在 etcd
中加密您的密钥数据。有关说明,请参阅在存储时加密密钥数据。
配置对密钥的最小权限访问
在规划访问控制机制时,例如 Kubernetes基于角色的访问控制(RBAC),请考虑以下访问 密钥
对象的指南。您还应该遵循RBAC 最佳实践 中的其他指南。
- 组件:将
watch
或list
访问权限限制为仅最特权的系统级组件。仅在组件的正常行为需要密钥时授予get
访问权限。 - 人员:限制对密钥的
get
、watch
或list
访问权限。仅允许集群管理员访问etcd
。这包括只读访问。对于更复杂的访问控制,例如限制对具有特定注释的密钥的访问,请考虑使用第三方授权机制。
警告
授予对密钥的list
访问权限会隐式地允许主体获取密钥的内容。可以创建使用密钥的 Pod 的用户也可以看到该密钥的值。即使集群策略不允许用户直接读取密钥,同一用户也可以访问运行 Pod,然后该 Pod 会公开密钥。您可以检测或限制由用户使用此访问权限(有意或无意)公开的密钥数据造成的的影响。一些建议包括
- 使用短期密钥
- 实施在特定事件(例如单个用户同时读取多个密钥)时发出警报的审计规则
用于密钥管理的其他 ServiceAccount 注释
您还可以使用 ServiceAccount 上的 kubernetes.io/enforce-mountable-secrets
注释,以强制执行有关如何在 Pod 中使用密钥的特定规则。有关更多详细信息,请参阅有关此注释的文档。
改进 etcd 管理策略
考虑在 etcd
不再使用时擦除或粉碎 etcd
使用的持久性存储。
如果存在多个 etcd
实例,请配置实例之间加密的 SSL/TLS 通信,以保护传输中的密钥数据。
配置对外部密钥的访问
您可以使用第三方密钥存储提供商将您的机密数据保存在集群之外,然后配置 Pod 以访问这些信息。Kubernetes 密钥存储 CSI 驱动程序 是一个 DaemonSet,它允许 kubelet 从外部存储检索密钥,并将密钥作为卷安装到您授权访问数据的特定 Pod 中。
有关支持的提供商列表,请参阅密钥存储 CSI 驱动程序的提供商。
开发人员
本部分提供开发人员在构建和部署 Kubernetes 资源时可以用来提高机密数据安全性的最佳实践。
将密钥访问权限限制为特定容器
如果您在 Pod 中定义多个容器,并且其中只有一个容器需要访问密钥,请定义卷挂载或环境变量配置,以便其他容器无法访问该密钥。
在读取后保护密钥数据
应用程序在从环境变量或卷中读取机密信息的值后,仍然需要保护其值。例如,您的应用程序必须避免将密钥数据以明文形式记录或传输到不可信方。
避免共享密钥清单
如果您通过清单 配置密钥,并以 base64 编码的密钥数据形式共享此文件或将其签入源代码库,则意味着密钥对可以读取清单的每个人都可用。
警告
Base64 编码不是一种加密方法,它不会提供比纯文本更高的机密性。此页面上的项目指的是提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅CNCF 网站指南。
在建议添加额外第三方链接的更改之前,您应该阅读内容指南。