Kubernetes是管理容器化应用程序的基石,让组织可以高效部署、扩展和维护复杂的工作负载,但是这样环境中处理API密钥、密码、令牌/证书等敏感数据依然是一大挑战。在应用程序配置中通过纯文本形式公开这些关键信息可能会引发严重保护漏洞。
为了证实这点,Kubernetes提供一项功能用于安全存储和检索机密数据,被称为Secrets。能消除把机密信息直接嵌入应用程序代码/配置文件的要求,有利于保证安全性减低意外暴露风险,简化授权应用程序的访问。
Kubernetes Secrets是用于密码保护、API密钥、SSH凭证和证书等机密数据专用对象。确保信息不回直接嵌入应用程序代码/配置文件中。同环境变量不同的是Kubernetes Secrets 增强了安全性和灵活性。Kubernetes 中机密用base64编码格式存储,Kubernetes集群中启用机密的静态加密很关键,这项功能能确保机密数据在存储和检索中得到保护。
Pod能在运行时动态引用Secrets,应用程序可以获取并使用关键数据,Secrets能作为环境变量或容器内文件安装,开发人员可以安全的把敏感信息集成到工作流程中。
Kubernetes Secrets有几种类型每种都是针对特定情况设计。有效使用Kubernetes Secrets需要涉及四个关键步骤,创建、配置、访问和轮换。使用kubectl命令行工具或 YAML 清单创建Kubernetes中的机密。选择的方法取决于您的工作流程偏好和自动化需求。
使用kubectl工具提供了一种直接从命令行构建Secret的快速方法。如当需要创建含用户名和密码不透明 Secret:
kubectl 创建 secret generic my-secret –from-literal=username=admin –from-literal=password=pass123
使用YAML清单,为获取更结构化和可重用方法,可以在YAML文件定义Secret。当将Secret作为基础设施及代码策略一部分进行管理时,如下:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # Base64 encoded 'admin'
password: cGFzczEyMw== # Base64 encoded 'pass123'
You can apply this YAML file using the kubectl apply -f secret.yaml command.
在Pod安装Secret,Kubernetes允许您将Secret挂载为文件或环境变量。可以把Secrets 注入到 pod 的环境变量中,以便应用程序轻松访问。以下是示例配置:
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
另一种方法是将 Secrets 作为文件挂载到 pod 中。此方法提供了更大的灵活性,通常是管理复杂数据结构或证书的首选方法。示例:
volumes:
- name: secret-volume
secret:
secretName: my-secret
containers:
- name: app-container
volumeMounts:
- mountPath: /etc/secrets
name: secret-volume
访问机密需要注意动态更新,通过文件形式挂载Secret 会在 pod 中动态更新。还要注意环境变量访问和安全处理。如果作为环境变量挂载,应用程序可以使用标准环境变量访问方法来获取Secret,但是需要重启pod。应用程序代码需要涉及为安全的获取和使用机密。避免在日志中打印机机密或在错误消息中暴露他们。