简介
在现代云原生应用程序中,安全地管理诸如凭证和配置数据等敏感信息至关重要。本教程提供了关于向Kubernetes Pod注入机密信息的全面指导,帮助开发人员和DevOps专业人员在容器化环境中实施强大的安全策略来管理机密信息。
Kubernetes 中的机密信息
什么是 Kubernetes 机密信息?
Kubernetes 机密信息是用于帮助管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥及其他机密数据。它们提供了一种将敏感配置数据与 Pod 和容器定义分离的方式,增强了应用程序部署中的安全性和灵活性。
Kubernetes 机密信息的类型
Kubernetes 支持多种类型的机密信息,以适应不同的用例:
| 机密信息类型 | 描述 | 常见用例 |
|---|---|---|
| Opaque | 默认机密信息类型 | 通用键值对 |
| Docker Registry | 存储容器镜像仓库的凭证 | 拉取私有镜像 |
| TLS | 存储 TLS 证书 | HTTPS 配置 |
| Service Account | 认证令牌 | 集群访问管理 |
机密信息管理工作流程
graph TD
A[创建敏感数据] --> B[对数据进行编码]
B --> C[创建 Kubernetes 机密信息]
C --> D[在 Pod 中挂载机密信息]
D --> E[在容器中访问机密信息]
关键特性
- 机密信息是按命名空间作用域的
- 数据采用 base64 编码
- 可以手动或自动创建
- 支持多种使用方式
示例:创建基本机密信息
## 从文字值创建机密信息
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=mysecretpassword
## 从文件创建机密信息
kubectl create secret generic ssl-cert \
--from-file=./tls.crt \
--from-file=./tls.key
安全注意事项
- 机密信息存储在 etcd 中,并且可以在静止时进行加密
- 建议使用 RBAC 来限制对机密信息的访问
- 对于高级场景,考虑使用外部机密信息管理工具
LabEx 建议
为了实际操作 Kubernetes 机密信息,LabEx 提供了交互式环境,使你能够在安全、可控的环境中试验机密信息的创建和管理。
注入方法
机密信息注入技术概述
Kubernetes 提供了多种将机密信息注入 Pod 的方法,每种方法都有其独特的用例和优势。
1. 环境变量
基本环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: myapp
image: ubuntu:22.04
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: username
2. 卷挂载
将机密信息挂载为文件
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: myapp
image: ubuntu:22.04
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-credentials
注入方法比较
| 方法 | 优点 | 缺点 |
|---|---|---|
| 环境变量 | 简单、快速 | 仅限于小数据 |
| 卷挂载 | 支持大文件 | 需要更多配置 |
| projected 卷 | 灵活、多源 | 更复杂 |
3. projected 卷
高级机密信息投影
apiVersion: v1
kind: Pod
metadata:
name: projected-secrets-pod
spec:
containers:
- name: myapp
image: ubuntu:22.04
volumeMounts:
- name: projected-secrets
mountPath: "/projected-secrets"
volumes:
- name: projected-secrets
projected:
sources:
- secret:
name: db-credentials
- secret:
name: ssl-certs
机密信息注入工作流程
graph TD
A[创建 Kubernetes 机密信息] --> B{注入方法}
B --> |环境变量| C[直接注入到 Pod 环境]
B --> |卷挂载| D[基于文件的机密信息]
B --> |projected 卷| E[多个机密信息源]
最佳实践
- 对于较大的机密信息使用卷挂载
- 尽量减少机密信息暴露
- 定期轮换机密信息
- 使用 RBAC 控制对机密信息的访问
LabEx 提示
LabEx 提供交互式实验,以便在真实的 Kubernetes 环境中练习不同的机密信息注入技术。
安全最佳实践
Kubernetes 机密信息安全框架
1. 静态加密
对存储在 etcd 中的机密信息实施加密:
## 启用静态加密
sudo vi /etc/kubernetes/manifests/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${ENCRYPTION_KEY}
2. 访问控制策略
RBAC 机密信息管理
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
机密信息安全矩阵
| 安全维度 | 建议 | 实施级别 |
|---|---|---|
| 加密 | 使用 AES - 256 | 集群级别 |
| 访问控制 | 最小化 RBAC | 命名空间级别 |
| 机密信息轮换 | 自动轮换 | 应用程序级别 |
3. 机密信息管理工作流程
graph TD
A[创建机密信息] --> B{验证}
B --> |通过| C[加密]
C --> D[应用 RBAC]
D --> E[定期轮换]
E --> F[审计日志记录]
4. 外部机密信息管理
集成外部机密信息管理器
- HashiCorp Vault
- AWS 机密信息管理器
- Azure 密钥保管库
5. 运行时安全实践
容器级保护
- 避免在容器镜像中嵌入机密信息
- 使用短期凭证
- 实施最小权限原则
高级机密信息处理
## 自动机密信息轮换脚本
#!/bin/bash
CURRENT_SECRET=$(kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -d)
NEW_SECRET=$(openssl rand -base64 32)
kubectl create secret generic db-credentials-new --from-literal=password=$NEW_SECRET
监控与审计
跟踪机密信息访问
- 启用 Kubernetes 审计日志记录
- 实施实时机密信息访问监控
- 使用安全工具进行全面跟踪
LabEx 安全建议
LabEx 提供全面的实验,以便在可控环境中实践和验证 Kubernetes 机密信息安全配置。
关键要点
- 对静态机密信息进行加密
- 实施严格的 RBAC
- 定期轮换机密信息
- 使用外部机密信息管理工具
- 持续监控和审计机密信息访问
总结
在 Kubernetes 中理解并实施恰当的机密信息注入技术对于维护应用程序安全至关重要。通过利用 Kubernetes 原生的机密信息管理功能并遵循最佳实践,团队能够在确保容器化应用程序无缝部署和配置的同时,有效地保护敏感数据。


