KSA 署名鍵をローテーションする

Kubernetes サービス アカウント(KSA)は、Pod で実行されるプロセスの ID を提供します。

Kubernetes サービス アカウントは、アプリケーションが Google Cloud APIs への承認済み呼び出しを行うために使用する Google Cloud サービス アカウントとは異なります。

Google Distributed Cloud は、秘密暗号鍵を使用して Pod に発行する KSA トークンに署名します。それは、Pod が Kubernetes API サーバーにリクエストを送信する際に、対応する公開鍵を使用してトークンを検証します。Pod が Workload Identity を使用して Google Cloud APIs を呼び出す場合、Google Cloud は同じ公開鍵を使用して Pod の ID を認証します。

ユーザー クラスタの作成中に、Google Distributed Cloud は秘密鍵と公開鍵を生成します。また、クラスタの作成中に、Google Distributed Cloud はクラスタをフリートに登録し、公開鍵を Google Cloud に提供します。

後で、秘密鍵と公開鍵のペアをローテーションできます。ローテーションによって、新しい秘密鍵で署名された新しいトークンが自動的に発行されます。ローテーションの終了時に、クラスタには新しい秘密鍵、新しい公開鍵、更新されたトークンがあります。また、Google Cloud には新しい公開鍵もあります。

バウンド トークンとレガシー トークン

Pod は、Kubernetes API サーバーを呼び出す際に、認証と認可のためにレガシー トークンまたはバウンド トークンのいずれかを使用します。バウンド トークンの有効期間は制限されており、計画された量を使用して Pod に配布されます。レガシー トークンには有効期限がなく、Kubernetes の Secret に保持されます。バウンド トークンは、安全性が高いため、使用することをおすすめします。

バウンド トークンとレガシー トークンの両方が、鍵のローテーション中に更新されます。

鍵のローテーションを開始する

鍵のローテーションを開始する前に、次の点を検討します。

  • 鍵のローテーション中は、別の鍵のローテーション、認証局のローテーション、クラスタの更新を開始できません。

  • 鍵のローテーションの一時停止やロールバックはできません。古い鍵はすべて削除されます。

  • 鍵のローテーションにより、既存のクラスタノードが削除され、新しいノードが作成されます。

鍵のローテーションを開始するには:

gkectl update credentials ksa-signing-key rotate \
    --config USER_CLUSTER_CONFIG \
    --kubeconfig ADMIN_CLUSTER_KUBECONIFG \
    [--skip-prompt]

次のように置き換えます。

  • USER_CLUSTER_CONFIG: ユーザー クラスタの構成ファイルのパス

  • ADMIN_KUBECONFIG_FILE: 管理クラスタの kubeconfig ファイルのパス

プロンプトを表示したくない場合は、--skip-prompt を含めます。

鍵のローテーションのステータスを表示する

鍵のローテーションのステータスを表示するには:

gkectl update credentials ksa-signing-key status \
    --config USER_CLUSTER_CONFIG \
    --kubeconfig ADMIN_CLUSTER_KUBECONIFG

鍵のローテーションがすでに完了している場合は、次のようなメッセージが表示されます。

State of KSASigningKeyRotation with KSASigningKeyVersion 2 is -
status: True,
reason: KSASigningKeyRotationCompleted,
message:{"tokenVersion":2,"privateKeyVersion":2,"publicKeyVersions":[2]}

KSA 署名鍵のローテーションが進行中の場合は、次のようなメッセージが表示されます。

State of KSASigningKeyRotation with KSASigningKeyVersion 2 is -
status: False,
reason: KSASigningKeyRotationProcessedReason,
message:{"tokenVersion":2,"privateKeyVersion":2,"publicKeyVersions":[1,2]}