Azure Kubernetes Service (AKS) クラスターでの証明書ローテーション

Azure Kubernetes Service (AKS) では、そのコンポーネントの多くで認証に証明書が使用されています。 2022 年 3 月以降に作成された 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 -g MC_rg_myAKSCluster_region -n vm-name --command-id RunShellScript --query 'value[0].message' -otsv --scripts "openssl x509 -in /etc/kubernetes/certs/apiserver.crt -noout -enddate"
    

仮想マシン スケール セット エージェント ノード証明書の有効期限を確認する

  • 仮想マシン スケール セット エージェント ノード証明書の有効期限を確認するには、az vm 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 /etc/kubernetes/certs/apiserver.crt -noout -enddate" --query "value[0].message"
    

証明書の自動ローテーション

AKS で非 CA 証明書を自動的にローテーションするには、クラスターに TLS ブートストラップが必要です。これは、すべての Azure リージョンで既定で有効になります。

Note

  • 既存のクラスターがある場合は、そのクラスターをアップグレードして、証明書の自動ローテーションを有効にする必要があります。
  • ブートストラップを無効にして、自動ローテーションを有効にしたままにしないでください。
  • 証明書の自動ローテーションの間にクラスターが停止状態になっていると、コントロール プレーンの証明書のみがローテーションされます。 この場合、証明書のローテーションの後でノード プールを作成し直して、ノード プール証明書のローテーションを開始する必要があります。

2022 年 3 月以降に作成またはアップグレードされた AKS クラスターの場合、Azure Kubernetes Service は、クラスターのダウンタイムなしで期限切れになる前に、クライアント証明書の有効期間の 80% 以内にコントロール プレーンとエージェント ノードの両方で非 CA 証明書を自動的にローテーションします。

現在のエージェント ノード プールで TLS ブートストラップが有効かどうかを確認する方法

  1. 次のいずれかのパスを参照することで、クラスターで TLS ブートストラップが有効になっているかどうかを確認します。

    • Linux ノードの場合: /var/lib/kubelet/bootstrap-kubeconfig または /host/var/lib/kubelet/bootstrap-kubeconfig
    • Windows ノードの場合: C:\k\bootstrap-config

    詳しくは、「メンテナンスまたはトラブルシューティングのために Azure Kubernetes Service (AKS) クラスター ノードに接続する」をご覧ください。

    Note

    Kubernetes のバージョンが上がると、ファイルのパスが変わる可能性があります。

  2. リージョンが構成されたら、新しいクラスターを作成するか、既存のクラスターをアップグレードして、クラスター証明書の自動ローテーションを設定します。 この機能を有効にするには、コントロール プレーンとノード プールをアップグレードする必要があります。

クラスター証明書を手動でローテーションする

警告

az aks rotate-certs を使って証明書をローテーションすると、すべてのノード、仮想マシン スケール セット、ディスクが再作成され、AKS クラスターで最大 "30 分間のダウンタイム" が発生する可能性があります。

  1. az aks get-credentials コマンドを使ってクラスターに接続します。

    az aks get-credentials -g $RESOURCE_GROUP_NAME -n $CLUSTER_NAME
    
  2. az aks rotate-certs を使って、クラスターのすべての証明書、CA、SA をローテーションします。

    az aks rotate-certs -g $RESOURCE_GROUP_NAME -n $CLUSTER_NAME
    

    重要

    az aks rotate-certs が完了するまでに最大で 30 分かかる場合があります。 コマンドが完了する前に失敗した場合は、az aks show を使用して、クラスターの状態が az aks showになっていることを確認します。 クラスターがエラー状態になっている場合は、az aks rotate-certs を再実行して、証明書をもう一度ローテーションします。

  3. 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")
    
  4. az aks get-credentials コマンドと --overwrite-existing フラグを使って、kubectl で使われている証明書を更新します。

    az aks get-credentials -g $RESOURCE_GROUP_NAME -n $CLUSTER_NAME --overwrite-existing
    
  5. kubectl get コマンドを使って、証明書が更新されたことを確認します。

    kubectl get nodes
    

    Note

    AKS の上で実行されるサービスがある場合は、それらの証明書の更新が必要になることがあります。

次のステップ

この記事では、クラスターの証明書、CA、SA を自動的にローテーションする方法について説明しました。 詳しくは、「Azure Kubernetes Service (AKS) でのクラスターのセキュリティとアップグレードに関するベスト プラクティス」をご覧ください。