Kubernetes集群中TLS证书管理全指南

Kubernetes集群中TLS证书管理全指南

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

概述

在现代分布式系统中,TLS证书是确保服务间安全通信的基石。Kubernetes提供了强大的certificates.k8s.io API,允许管理员为集群中的工作负载提供由受控CA签名的TLS证书。本文将深入解析如何在Kubernetes集群中管理TLS证书的全过程。

核心概念

证书签发流程

  1. 证书签名请求(CSR)生成:工作负载生成私钥和CSR
  2. CSR提交:将CSR提交到Kubernetes API
  3. 审批流程:集群管理员或自动审批系统审批请求
  4. 证书签发:CA对审批通过的CSR进行签名
  5. 证书分发:将签名后的证书分发给工作负载

关键注意事项

  • 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并签发证书

  1. 生成CA证书:
cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
  "CN": "My Example Signer",
  "key": {
    "algo": "rsa",
    "size": 2048
  }
}
EOF
  1. 使用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
  1. 将签名后的证书上传到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:使用证书

  1. 下载证书:
kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' \
    | base64 --decode > server.crt
  1. 创建TLS Secret:
kubectl create secret tls server --cert server.crt --key server-key.pem
  1. 创建CA ConfigMap:
kubectl create configmap example-serving-ca --from-file ca.crt=ca.pem

安全最佳实践

  1. 最小权限原则:严格控制CSR审批权限
  2. 证书轮换:定期更新证书
  3. 证书验证:确保只信任必要的CA
  4. 审计日志:记录所有证书签发操作
  5. 自动化审批:对于大规模部署,考虑实现自动化审批控制器

集群配置建议

要让集群提供签名功能,需要在控制器管理器中配置:

  • --cluster-signing-cert-file:CA证书路径
  • --cluster-signing-key-file:CA私钥路径

常见问题解答

Q:为什么不应该使用集群根CA? A:这会导致安全边界模糊,如果根CA被泄露,整个集群的安全性都会受到威胁。

Q:如何验证CSR的合法性? A:需要验证两点:

  1. 请求者确实控制着用于生成CSR的私钥
  2. 请求者有权限在请求的上下文中操作

Q:证书有效期如何设置? A:可以在签发配置中设置,通常建议生产环境使用较短的有效期(如90天)。

通过本文的详细指导,您应该能够在Kubernetes集群中有效地管理TLS证书,为您的服务提供可靠的安全保障。

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

费然杨Bernadette

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值