简介
在 Kubernetes 容器编排的复杂环境中,安全地管理敏感信息对于维护健壮且受保护的应用程序至关重要。本教程提供了关于在 Kubernetes 中部署机密信息的全面指南,探讨了配置技术、安全策略以及在容器化环境中处理机密数据的最佳实践。
Kubernetes 中的机密信息基础
什么是 Kubernetes 机密信息?
Kubernetes 机密信息是用于帮助管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥及其他机密数据。它们提供了一种将敏感配置数据与容器镜像和 Pod 规范分离的方式,从而增强了应用程序部署中的安全性和灵活性。
Kubernetes 机密信息的类型
Kubernetes 支持多种类型的机密信息,以适应不同的用例:
| 机密信息类型 | 描述 | 用例 |
|---|---|---|
| Opaque | 默认机密信息类型 | 通用键值对 |
| Docker Registry | 存储 Docker 镜像仓库凭证 | 拉取私有镜像 |
| TLS | 存储 TLS 证书 | HTTPS 及安全通信 |
| Service Account | 自动创建的令牌 | 向 API 服务器进行身份验证 |
机密信息创建机制
机密信息可通过多种方法创建:
graph TD
A[机密信息创建方法] --> B[kubectl 命令]
A --> C[YAML 配置]
A --> D[Kubernetes API]
A --> E[Helm 图表]
1. 使用 kubectl 命令
直接从命令行创建机密信息:
## 创建一个通用机密信息
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=mysecretpassword
## 从文件创建机密信息
kubectl create secret generic ssl-cert \
--from-file=tls.crt=server.crt \
--from-file=tls.key=server.key
2. YAML 配置
在 YAML 文件中定义机密信息以进行版本控制部署:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
stringData:
username: admin
password: mysecretpassword
机密信息编码
机密信息采用 Base64 编码,以确保安全存储和传输:
## 编码一个值
echo -n "mysecretpassword" | base64
## 解码一个值
echo "bXlzZWNyZXRwYXNzd29yZA==" | base64 --decode
关键注意事项
- 机密信息是命名空间作用域的
- 机密信息的最大大小为 1MB
- 机密信息存储在 etcd 中,并且可以在静态存储时进行加密
- 避免将机密信息提交到版本控制系统
用例
- 数据库连接凭证
- API 密钥和令牌
- TLS 证书
- Docker 镜像仓库认证
通过了解这些基础知识,你可以按照 LabEx 推荐的最佳实践,在你的 Kubernetes 集群中有效地管理敏感信息。
机密信息配置
机密信息配置方法
1. 从字面量值创建机密信息
## 使用字面量值创建通用机密信息
kubectl create secret generic app-credentials \
--from-literal=DB_USERNAME=myuser \
--from-literal=DB_PASSWORD=mysecretpassword
2. 从文件创建机密信息
## 从单个文件创建机密信息
kubectl create secret generic ssl-certs \
--from-file=tls.crt=./server.crt \
--from-file=tls.key=./server.key
## 从整个目录创建机密信息
kubectl create secret generic config-files \
--from-file=./config-directory
机密信息配置策略
graph TD
A[机密信息配置] --> B[直接创建]
A --> C[声明式 YAML]
A --> D[环境变量]
A --> E[卷挂载]
3. 声明式 YAML 配置
apiVersion: v1
kind: Secret
metadata:
name: database-secret
type: Opaque
stringData:
DB_HOST: localhost
DB_PORT: "5432"
DB_USERNAME: admin
DB_PASSWORD: securepassword
在 Pod 中使用机密信息
环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: myapp
image: myapp-image
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: database-secret
key: DB_USERNAME
卷挂载配置
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: myapp
image: myapp-image
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: database-secret
机密信息类型与配置
| 机密信息类型 | 用例 | 配置方法 |
|---|---|---|
| Opaque | 通用键值对机密信息 | kubectl create/YAML |
| Docker Registry | 镜像拉取凭证 | kubectl create-secret-docker-registry |
| TLS | SSL/TLS 证书 | kubectl create secret tls |
高级机密信息管理
不可变机密信息
apiVersion: v1
kind: Secret
metadata:
name: immutable-secret
type: Opaque
immutable: true
stringData:
key: value
Base64 编码注意事项
## 手动编码机密信息值
echo -n "mysecretvalue" | base64
机密信息配置的最佳实践
- 使用特定于环境的机密信息
- 定期轮换机密信息
- 限制对机密信息的访问
- 使用外部机密信息管理工具
借助 LabEx 的全面指南,你可以有效地配置和管理 Kubernetes 机密信息,以增强应用程序安全性。
机密信息最佳实践
安全建议
1. 静态加密
apiVersion: v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64编码后的密钥>
2. 访问控制策略
graph TD
A[机密信息访问控制] --> B[基于角色的访问控制(RBAC)策略]
A --> C[命名空间隔离]
A --> D[最小权限原则]
机密信息管理技术
轮换机密信息
## 机密信息轮换脚本示例
#!/bin/bash
NEW_PASSWORD=$(openssl rand -base64 16)
kubectl create secret generic db-credentials \
--from-literal=password=$NEW_PASSWORD \
--dry-run=client -o yaml | kubectl apply -f -
外部机密信息管理
| 工具 | 功能 | 集成方式 |
|---|---|---|
| HashiCorp Vault | 高级机密信息管理 | 原生Kubernetes集成 |
| AWS Secrets Manager | 云原生机密信息 | 外部机密信息存储库 |
| Azure Key Vault | 微软生态系统 | Kubernetes容器存储接口(CSI)驱动程序 |
安全的机密信息处理
避免常见错误
## 不良实践
apiVersion: v1
kind: Secret
metadata:
name: bad-secret
stringData:
password: "明文密码" ## 避免这样做!
## 良好实践
apiVersion: v1
kind: Secret
metadata:
name: good-secret
type: Opaque
data:
password: base64编码后的值
监控与审计
机密信息访问日志记录
## 启用API服务器审计日志记录
kube-apiserver \
--audit-log-path=/var/log/kubernetes/audit.log \
--audit-log-maxage=30 \
--audit-log-maxbackup=3
最佳实践清单
- 切勿将机密信息提交到版本控制系统
- 使用短期凭证
- 实施自动轮换
- 尽量减少机密信息暴露
- 使用外部机密信息管理工具
高级安全配置
Pod安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-secrets
spec:
readOnlyRootFilesystem: true
forbiddenSysctls:
- "*"
实际建议
- 使用特定于环境的机密信息
- 实施严格的基于角色的访问控制(RBAC)策略
- 对静态机密信息进行加密
- 定期审计机密信息访问
- 尽可能使用不可变机密信息
借助LabEx的全面指南,你可以在Kubernetes中实施强大的机密信息管理,确保最大程度的安全性和合规性。
总结
在Kubernetes中理解并实施恰当的机密信息管理,对于维护应用程序安全和操作完整性至关重要。通过遵循上述最佳实践,开发者和DevOps专业人员能够有效地保护敏感信息,将安全风险降至最低,并确保机密凭证在Kubernetes集群中无缝部署。


