Azure Kubernetes Service (AKS) クラスターでの証明書ローテーション
Azure Kubernetes Service (AKS) では、そのコンポーネントの多くで認証に証明書が使用されています。 2022 年 3 月以降に作成された Azure ロールベースのアクセス制御 (Azure RBAC) を使用するクラスターでは、証明書の自動ローテーションが有効になっています。 セキュリティやポリシー上の理由から、それらの証明書の定期的なローテーションが必要になる場合があります。 たとえば、90 日おきにすべての証明書をローテーションするポリシーがある場合などです。
Note
証明書の自動ローテーションは、RBAC が有効な AKS クラスターでのみ既定で有効になります。
この記事では、AKS クラスターでの証明書のローテーションのしくみについて説明します。
準備
この記事では、Azure CLI バージョン 2.0.77 以降が必要です。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
AKS 証明書、証明機関、サービス アカウント
AKS では、次の証明書、証明機関 (CA)、およびサービス アカウント (SA) が生成されて使用されます。
- AKS API サーバーでは、クラスター CA と呼ばれる CA が作成されます。
- API サーバーには、API サーバーから kubelets への一方向の通信に使用する証明書に署名するクラスター CA があります。
- 各 kubelet では、kubelet から API サーバーへの通信のために証明書署名要求 (CSR) が作成され、クラスター CA によって署名されます。
- API アグリゲーターでは、他の API との通信に証明書を発行するためにクラスター CA が使用されます。 API アグリゲーターでは、これらの証明書を発行するための独自の CA を持つこともできますが、現在はクラスター CA が使用されています。
- 各ノードでは、クラスター CA が署名した SA トークンが使われます。
kubectl
クライアントには、AKS クラスターと通信するための証明書があります。
クラスター証明書を除き、このセクションで説明されているすべての証明書は Microsoft によって管理されます。
Note
- 2019 年 5 月より "前" に作成された AKS クラスターには、2 年後に期限切れになる証明書があります。
- 2019 年 5 月 "以降" に作成された AKS クラスターには、30 年後に期限切れになるクラスター CA 証明書があります。
クラスターがいつ作成されたかは、kubectl get nodes
コマンドを使って確認できます。このコマンドでは、ノード プールの "使用年数" が示されます。
証明書の有効期限を確認する
クラスター証明書の有効期限を確認する
クラスター証明書の有効期限を確認するには、
kubectl config view
コマンドを使います。kubectl config view --raw -o jsonpath="{.clusters[?(@.name == '')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity
API サーバー証明書の有効期限を確認する
API サーバー証明書の有効期限を確認するには、次の
curl
コマンドを使います。curl https://{apiserver-fqdn} -k -v 2>&1 | grep expire
VMAS エージェント ノード証明書の有効期限を確認する
VMAS エージェント ノード証明書の有効期限を確認するには、
az vm run-command invoke
コマンドを使います。az vm run-command invoke --resource-group MC_rg_myAKSCluster_region --name vm-name --command-id RunShellScript --query 'value[0].message' -otsv --scripts "openssl x509 -in /etc/kubernetes/certs/apiserver.crt -noout -enddate"
仮想マシン スケール セット エージェント ノードの証明書の有効期限を確認する
仮想マシン スケール セット エージェント ノードの証明書の有効期限を確認するには、
az vmss run-command invoke
コマンドを使います。az vmss run-command invoke --resource-group "MC_rg_myAKSCluster_region" --name "vmss-name" --command-id RunShellScript --instance-id 1 --scripts "openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" --query "value[0].message"
証明書の自動ローテーション
AKS で非 CA 証明書を自動的にローテーションするには、クラスターに TLS ブートストラップが必要です。これは、すべての Azure リージョンで既定で有効になります。
Note
- 既存のクラスターがある場合は、そのクラスターをアップグレードして、証明書の自動ローテーションを有効にする必要があります。
- ブートストラップを無効にして、自動ローテーションを有効にしたままにしないでください。
- 証明書の自動ローテーションの間にクラスターが停止状態になっていると、コントロール プレーンの証明書のみがローテーションされます。 この場合、証明書のローテーションの後でノード プールを作成し直して、ノード プール証明書のローテーションを開始する必要があります。
2022 年 3 月以降に作成またはアップグレードされた AKS クラスターの場合、Azure Kubernetes Service は、クラスターのダウンタイムなしで期限切れになる前に、クライアント証明書の有効期間の 80% 以内にコントロール プレーンとエージェント ノードの両方で非 CA 証明書を自動的にローテーションします。
現在のエージェント ノード プールで TLS ブートストラップが有効かどうかを確認する方法
次のいずれかのパスを参照することで、クラスターで TLS ブートストラップが有効になっているかどうかを確認します。
- Linux ノードの場合: /var/lib/kubelet/bootstrap-kubeconfig または /host/var/lib/kubelet/bootstrap-kubeconfig
- Windows ノードの場合: C:\k\bootstrap-config
詳しくは、「メンテナンスまたはトラブルシューティングのために Azure Kubernetes Service (AKS) クラスター ノードに接続する」をご覧ください。
Note
Kubernetes のバージョンが上がると、ファイルのパスが変わる可能性があります。
リージョンが構成されたら、新しいクラスターを作成するか、既存のクラスターをアップグレードして、クラスター証明書の自動ローテーションを設定します。 この機能を有効にするには、コントロール プレーンとノード プールをアップグレードする必要があります。
クラスター証明書を手動でローテーションする
警告
az aks rotate-certs
を使って証明書をローテーションすると、すべてのノード、仮想マシン スケール セット、ディスクが再作成され、AKS クラスターで最大 "30 分間のダウンタイム" が発生する可能性があります。
az aks get-credentials
コマンドを使ってクラスターに接続します。az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
az aks rotate-certs
を使って、クラスターのすべての証明書、CA、SA をローテーションします。az aks rotate-certs --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
重要
az aks rotate-certs
が完了するまでに最大で 30 分かかる場合があります。 コマンドが完了する前に失敗した場合は、az aks show
を使用して、クラスターの状態がaz aks show
になっていることを確認します。 クラスターがエラー状態になっている場合は、az aks rotate-certs
を再実行して、証明書をもう一度ローテーションします。kubectl get nodes
などの任意のkubectl
コマンドを使って、古い証明書が無効になっていることを確認します。kubectl get nodes
kubectl
で使われている証明書を更新していない場合は、次の出力例のようなエラーが表示されます。Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "ca")
az aks get-credentials
コマンドと--overwrite-existing
フラグを使って、kubectl
で使われている証明書を更新します。az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --overwrite-existing
kubectl get
コマンドを使って、証明書が更新されたことを確認します。kubectl get nodes
Note
AKS の上で実行されるサービスがある場合は、それらの証明書の更新が必要になることがあります。
次のステップ
この記事では、クラスターの証明書、CA、SA を手動および自動でローテーションする方法について説明しました。 詳しくは、「Azure Kubernetes Service (AKS) でのクラスターのセキュリティとアップグレードに関するベスト プラクティス」をご覧ください。
Azure Kubernetes Service