Linkerd 2.10(Step by Step)—手动轮换控制平面 TLS 凭证

简介: Linkerd 2.10(Step by Step)—手动轮换控制平面 TLS 凭证

Linkerd 的自动 mTLS 功能 使用一组 TLS 凭据为代理生成 TLS 证书:信任锚、颁发者证书和私钥。信任锚的有效期有限:365 天(如果由 linkerd install 生成)或 自定义值(如果手动生成)。


因此,对于预计会超过此生命周期的集群,您必须手动轮换信任锚。在本文档中,我们描述了如何在不停机的情况下完成此操作。


先决条件



这些说明使用 step 和 jq CLI 工具。


了解系统的当前状态



从运行以下命令开始:


linkerd check --proxy


如果您的配置有效并且您的凭据不会很快过期,您应该会看到类似于以下内容的输出:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust root
linkerd-identity-data-plane
---------------------------
√ data plane proxies certificate match CA


但是,如果您看到一条消息警告您您的信任锚("trust root")或 颁发者证书即将到期,那么您必须轮换它们。


请注意,本文档仅适用于信任根和颁发者证书当前有效的情况。如果您的信任锚或颁发者证书已过期,请改为遵循替换过期证书指南。


例如,如果您的颁发者证书已过期,您将看到类似于以下内容的消息:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
× issuer cert is within its validity period
issuer certificate is not valid anymore. Expired on 2019-12-19T09:02:01Z
see https://linkerd.io/checks/#l5d-identity-issuer-cert-is-time-valid for hints


如果您的信任锚已过期,您将看到类似于以下内容的消息:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
× trust roots are within their validity period
Invalid roots:
* 79461543992952791393769540277800684467 identity.linkerd.cluster.local not valid anymore. Expired on 2019-12-19T09:11:30Z
see https://linkerd.io/checks/#l5d-identity-roots-are-time-valid  for hints


轮换信任锚



在不停机的情况下轮换信任锚是一个多步骤的过程:您必须生成一个新的信任锚, 将其与旧信任锚捆绑在一起,轮换颁发者证书和密钥对, 最后从捆绑中删除旧信任锚。如果您只需要轮换颁发者证书和密钥对, 则可以直接跳到轮换身份颁发者证书并忽略信任锚轮换步骤。


生成新的信任锚



首先,生成一个新的信任锚证书和私钥:


step certificate create root.linkerd.cluster.local ca-new.crt ca-new.key --profile root-ca --no-password --insecure


请注意,我们使用 --no-password --insecure 来避免使用 passphrase 对这些文件进行加密。将私钥存储在安全的地方,以便将来可以使用它来生成新的颁发者证书。


将您的原始信任锚与新信任锚捆绑在一起



接下来,我们需要将 Linkerd 当前使用的信任锚与新锚捆绑在一起。以下命令使用 kubectl 获取 Linkerd 配置, jq/yq 提取当前信任锚, 并且 step 将其与新生成的信任锚合并:


kubectl -n linkerd get cm linkerd-config -o=jsonpath='{.data.values}' \
  | yq e .identityTrustAnchorsPEM - > original-trust.crt
step certificate bundle ca-new.crt original-trust.crt bundle.crt
rm original-trust.crt


将新 bundle 部署到 Linkerd



此时你可以使用 linkerd upgrade 命令来指示 Linkerd 使用新的信任包:


linkerd upgrade --identity-trust-anchors-file=./bundle.crt | kubectl apply -f -


这将重新启动 Linkerd 控制平面中的代理,并将使用新的信任锚重新配置它们。

最后,您必须为集群中所有注入的工作负载重新启动代理。例如,对 emojivoto 命名空间执行此操作将如下所示:


kubectl -n emojivoto rollout restart deploy


现在您可以运行 check 命令以确保一切正常:


linkerd check --proxy


您可能需要稍等片刻,直到所有 pod 都重新启动并配置了正确的信任锚。同时,您可能会观察到警告:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
‼ issuer cert is valid for at least 60 days
    issuer certificate will expire on 2019-12-19T09:51:19Z
    see https://linkerd.io/checks/#l5d-identity-issuer-cert-not-expiring-soon for hints
√ issuer cert is issued by the trust root
linkerd-identity-data-plane
---------------------------
‼ data plane proxies certificate match CA
    Some pods do not have the current trust bundle and must be restarted:
        * emojivoto/emoji-d8d7d9c6b-8qwfx
        * emojivoto/vote-bot-588499c9f6-zpwz6
        * emojivoto/voting-8599548fdc-6v64k
        * emojivoto/web-67c7599f6d-xx98n
        * linkerd/linkerd-sp-validator-75f9d96dc-rch4x
        * linkerd/linkerd-tap-68d8bbf64-mpzgb
        * linkerd/linkerd-web-849f74b7c6-qlhwc
    see https://linkerd.io/checks/#l5d-identity-data-plane-proxies-certs-match-ca for hints


当部署完成时,您的 check 命令应该停止警告您需要重新启动 pod。但是,它可能仍会警告您,您的颁发者证书即将到期:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
‼ issuer cert is valid for at least 60 days
    issuer certificate will expire on 2019-12-19T09:51:19Z
    see https://linkerd.io/checks/#l5d-identity-issuer-cert-not-expiring-soon for hints
√ issuer cert is issued by the trust root
linkerd-identity-data-plane
---------------------------
√ data plane proxies certificate match CA


轮换身份颁发者证书



要轮换颁发者证书和密钥对,首先生成一个新对:


step certificate create identity.linkerd.cluster.local issuer-new.crt issuer-new.key \
--profile intermediate-ca --not-after 8760h --no-password --insecure \
--ca ca-new.crt --ca-key ca-new.key


如果信任锚没有过期,并且如果最近轮换了所有代理, 则所有代理都已更新为包括一个工作信任锚(如上一节所述), 现在可以安全地再次使用 upgrade 命令轮换身份颁发者证书:


linkerd upgrade --identity-issuer-certificate-file=./issuer-new.crt --identity-issuer-key-file=./issuer-new.key | kubectl apply -f -


此时,Linkerd 的 identity 控制平面服务应检测 到 secret 的更改并自动更新其颁发者证书。

为确保发生这种情况,您可以检查特定的 Kubernetes 事件:


kubectl get events --field-selector reason=IssuerUpdated -n linkerd
LAST SEEN   TYPE     REASON          OBJECT                        MESSAGE
9s          Normal   IssuerUpdated   deployment/linkerd-identity   Updated identity issuer


为集群中所有注入的工作负载重新启动代理,以确保它们的代理获取新颁发者颁发的证书:


kubectl -n emojivoto rollout restart deploy


运行 check 命令以确保一切按预期进行:


linkerd check --proxy


您应该看到没有任何证书过期警告的输出(除非仍然需要删除过期的信任锚):


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust root
linkerd-identity-data-plane
---------------------------
√ data plane proxies certificate match CA


删除旧的信任锚



我们现在可以从之前创建的信任 bundle 中删除旧的信任锚。 upgrade 命令可以为 Linkerd 组件执行此操作:


linkerd upgrade  --identity-trust-anchors-file=./ca-new.crt  | kubectl apply -f -


请注意,./ca-new.crt 文件与您在此过程开始时创建的信任锚相同。此外,您可以使用 rollout restart 命令更新其他注入资源的配置:


kubectl -n emojivoto rollout restart deploy
linkerd check --proxy


最后,check 命令的输出不应产生任何警告或错误:


linkerd-identity
----------------
√ certificate config is valid
√ trust roots are using supported crypto algorithm
√ trust roots are within their validity period
√ trust roots are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust root
linkerd-identity-data-plane
---------------------------
√ data plane proxies certificate match CA


相关文章
|
Prometheus Cloud Native 数据可视化
Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例
Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例
142 0
|
JSON Kubernetes 安全
Linkerd 2.10(Step by Step)—多集群通信
Linkerd 2.10(Step by Step)—多集群通信
276 0
Linkerd 2.10(Step by Step)—多集群通信
|
存储 数据可视化 应用服务中间件
Linkerd 2.10(Step by Step)—使用 Linkerd 进行分布式跟踪
Linkerd 2.10(Step by Step)—使用 Linkerd 进行分布式跟踪
230 0
Linkerd 2.10(Step by Step)—使用 Linkerd 进行分布式跟踪
|
Kubernetes API 容器
Linkerd 2.10(Step by Step)—使用请求跟踪调试 gRPC 应用程序
Linkerd 2.10(Step by Step)—使用请求跟踪调试 gRPC 应用程序
143 0
Linkerd 2.10(Step by Step)—使用请求跟踪调试 gRPC 应用程序
|
JSON Prometheus Kubernetes
Linkerd 2.10(Step by Step)—使用每个路由指标调试 HTTP 应用程序
Linkerd 2.10(Step by Step)—使用每个路由指标调试 HTTP 应用程序
139 0
Linkerd 2.10(Step by Step)—使用每个路由指标调试 HTTP 应用程序
|
存储 Kubernetes 监控
Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS 与 Webhook TLS 凭证
Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS 与 Webhook TLS 凭证
168 0
|
Java Go Perl
Linkerd 2.10(Step by Step)—控制平面调试端点
Linkerd 2.10(Step by Step)—控制平面调试端点
|
算法 数据安全/隐私保护 Perl
Linkerd 2.10(Step by Step)—生成您自己的 mTLS 根证书
Linkerd 2.10(Step by Step)—生成您自己的 mTLS 根证书
380 0
Linkerd 2.10(Step by Step)—修改代理日志级别
Linkerd 2.10(Step by Step)—修改代理日志级别
176 0
|
Kubernetes Java Linux
Linkerd 2.10(Step by Step)—配置代理并发
Linkerd 2.10(Step by Step)—配置代理并发
173 0