Kubernetes集群中TLS证书管理全指南
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在现代分布式系统中,TLS证书是确保服务间安全通信的基石。Kubernetes提供了强大的certificates.k8s.io
API,允许管理员为集群中的工作负载提供由受控CA签名的TLS证书。本文将深入解析如何在Kubernetes集群中管理TLS证书的全过程。
核心概念
证书签发流程
- 证书签名请求(CSR)生成:工作负载生成私钥和CSR
- CSR提交:将CSR提交到Kubernetes API
- 审批流程:集群管理员或自动审批系统审批请求
- 证书签发:CA对审批通过的CSR进行签名
- 证书分发:将签名后的证书分发给工作负载
关键注意事项
- Kubernetes使用专用CA进行证书签名,而非集群根CA
- 证书应包含完整的DNS名称和IP地址标识
- 审批过程需要严格验证请求者的身份和权限
实战演练
准备工作
确保已安装以下工具:
cfssl
:一款开源的PKI/TLS工具包jq
:JSON处理工具kubectl
:Kubernetes命令行工具
步骤1:生成CSR
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
"hosts": [
"my-svc.my-namespace.svc.cluster.local",
"my-pod.my-namespace.pod.cluster.local",
"192.0.2.24",
"10.0.34.2"
],
"CN": "my-pod.my-namespace.pod.cluster.local",
"key": {
"algo": "ecdsa",
"size": 256
}
}
EOF
此命令会生成:
server-key.pem
:私钥文件server.csr
:证书签名请求文件
步骤2:创建CertificateSigningRequest对象
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: my-svc.my-namespace
spec:
request: $(cat server.csr | base64 | tr -d '\n')
signerName: example.com/serving
usages:
- digital signature
- key encipherment
- server auth
EOF
步骤3:审批CSR
kubectl certificate approve my-svc.my-namespace
步骤4:创建CA并签发证书
- 生成CA证书:
cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
"CN": "My Example Signer",
"key": {
"algo": "rsa",
"size": 2048
}
}
EOF
- 使用CA签发服务证书:
kubectl get csr my-svc.my-namespace -o jsonpath='{.spec.request}' | \
base64 --decode | \
cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
cfssljson -bare ca-signed-server
- 将签名后的证书上传到Kubernetes:
kubectl get csr my-svc.my-namespace -o json | \
jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/my-svc.my-namespace/status -f -
步骤5:使用证书
- 下载证书:
kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' \
| base64 --decode > server.crt
- 创建TLS Secret:
kubectl create secret tls server --cert server.crt --key server-key.pem
- 创建CA ConfigMap:
kubectl create configmap example-serving-ca --from-file ca.crt=ca.pem
安全最佳实践
- 最小权限原则:严格控制CSR审批权限
- 证书轮换:定期更新证书
- 证书验证:确保只信任必要的CA
- 审计日志:记录所有证书签发操作
- 自动化审批:对于大规模部署,考虑实现自动化审批控制器
集群配置建议
要让集群提供签名功能,需要在控制器管理器中配置:
--cluster-signing-cert-file
:CA证书路径--cluster-signing-key-file
:CA私钥路径
常见问题解答
Q:为什么不应该使用集群根CA? A:这会导致安全边界模糊,如果根CA被泄露,整个集群的安全性都会受到威胁。
Q:如何验证CSR的合法性? A:需要验证两点:
- 请求者确实控制着用于生成CSR的私钥
- 请求者有权限在请求的上下文中操作
Q:证书有效期如何设置? A:可以在签发配置中设置,通常建议生产环境使用较短的有效期(如90天)。
通过本文的详细指导,您应该能够在Kubernetes集群中有效地管理TLS证书,为您的服务提供可靠的安全保障。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考