GKEのクラスタ認証情報のローテーションについて

こんにちは Development Team の滝波です。

今回はGKEの認証情報のローテーションについて共有したいと思います。

はじめに

AI Shiftでは2016年のサービス開始以来、メインとなるアプリケーションは全てGoogle Kubernetes Engine (GKE) 上に展開しています。
そんなGKEのクラスタにはルート認証局(CA)が存在しており、APIサーバーとkubeletのクライアントがTLS通信する上で必要な証明書に署名する役割を果たしてくれています。
ただ、この署名された証明書の有効期間がGKEの場合は5年間と設定されており、更新をせずに有効期間が過ぎてしまうとAPIサーバーとkubeletが通信できなくなるだけでなく、kubectl経由で対象のクラスタとの通信もできなくなってしまい、サービスに大きな障害を引き起こしかねない状態になってしまいます。
そのため、有効期間が過ぎる前に事前に認証情報のローテーションを行い、証明書の更新をする必要があります。

今回AI Shiftでも実際にローテーション作業を実施したので、簡単にその内容を共有したいと思います。

現在の有効期間の確認

まず、現状の有効期間の確認をしてみましょう。
下記コマンドを実行すると対象のクラスタの認証情報が取得できます。

kubectl config view --raw -o jsonpath="{.clusters[?(@.name == 'ClusterName')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity

結果

2016年1月18日に発行された証明書の期限が2021年1月17日までということがわかりますね。

Validity
    Not Before: Jan 18 05:05:44 2016 GMT
    Not After : Jan 17 06:05:44 2021 GMT

認証情報のローテーションを開始

% gcloud container clusters update your-cluster --start-credential-rotation --region your-region
This will start an IP and Credentials Rotation on cluster
[your-cluster]. The master will be updated to serve on a new IP
address in addition to the current IP address, and cluster credentials
 will be rotated. Kubernetes Engine will then recreate all nodes (x
nodes) to point to the new IP address. This operation is long-running
and will block other operations on the cluster (including delete)
until it has run to completion.
Do you want to continue (Y/n)?  Y
Updating your-cluster...done.
Updated [https://container.googleapis.com/.../your-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/...
kubeconfig entry generated for your-cluster.

APIクライアントを更新する

認証情報のローテーションを開始すると、マスターは元のIPアドレスに加えて、新しいIPアドレスでもサービスを開始するので、新しい認証情報が使用されるように更新を行います。

gcloud container clusters get-credentials your-cluster

認証情報のローテーションを完了する

% gcloud container clusters update your-cluster --region your-region --complete-credential-rotation
This will complete the in-progress Credential Rotation on cluster
[your-cluster]. The master will be updated to stop serving on the
 old IP address and only serve on the new IP address. Old cluster
credentials will be invalidated. Make sure all API clients have been
updated to communicate with the new IP address (e.g. by running
`gcloud container clusters get-credentials --project your-project
--zone your-zone your-cluster`). This operation is
long-running and will block other operations on the cluster (including
 delete) until it has run to completion.
Do you want to continue (Y/n)?  Y
Updating your-cluster...done.
Updated [https://container.googleapis.com/.../your-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/...
kubeconfig entry generated for your-cluster.

注意点

ローテーションを行うとAPI サーバーにわずかなダウンタイムが発生するため、サービスが一時的にダウンすることを許容しないといけません。
セキュリティの観点からも定期的にローテーションを行った方が良いのですが、そこはサービスダウンをどれくらいの頻度で許容できるかのトレードオフになりそうです。

まとめ

証明書の更新はGKEに限らずついつい忘れてしまいがちになりますが、セキュリティを担保する大事な要素なので、抜け漏れの無いよう対応していきたいですね。

参考

https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-trust

https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation

https://docs.microsoft.com/ja-jp/azure/aks/certificate-rotation