クラスタのセキュリティ キーをローテーションする

鍵のローテーション

鍵のローテーションは、鍵暗号鍵(KEK)に含まれる基盤となる暗号マテリアルを変更する動作です。このオペレーションは、スケジュール設定されたローテーションの一環として自動的にトリガーできます。また、鍵が不正使用された可能性があるセキュリティ インシデントの後に手動で行うこともできます。鍵のローテーションによって、暗号鍵と復号鍵の元データを含む鍵の単一フィールドのみが置き換えられます。

鍵の自動ローテーション

AWS Key Management Service(KMS)は、KMS 鍵の自動ローテーションをサポートしています。有効にすると、AWS は年に 1 回、鍵の新しい暗号鍵マテリアルを自動的に生成します。手動での対応は必要ありません。

鍵のローテーション後、GKE on AWS により新しい Secret が新しい鍵で暗号化されます。以前に作成された Secret は、引き続き元の鍵で復号されます。このため、AWS は CMK の古い鍵マテリアルを無期限に保持し、古い Secret が読み取られたときに古い DEK を復号できるようにしています。

KMS 鍵の自動ローテーションが有効になっているかどうかを確認するには、次のコマンドを使用します。

aws kms get-key-rotation --key-id KMS_KEY_ID

KMS_KEY_ID は、AWS KMS 鍵 ID に置き換えます。

鍵の自動ローテーションを有効にするには、このコマンドを実行します。

aws kms enable-key-rotation --key-id KMS_KEY_ID

手動による鍵のローテーション

このセクションでは、コントロール プレーンまたはノードプール構成の鍵を手動でローテーションする方法について説明します。

コントロール プレーン構成の鍵

コントロール プレーン構成の鍵を手動でローテーションするには、次の操作を行います。

  1. 新しい Cloud Key Management Service 鍵を作成します。KMS 鍵の ARN の値を保存します。これは後で使用します。

  2. クラスタに関連付けられた IAM ロールに、新しい鍵を使用して暗号化と復号を行う権限があることを確認します。

  3. gcloud container aws clusters update コマンドを使用して暗号鍵を更新します。

     gcloud container aws clusters update CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --config-encryption-kms-key-arn=CONFIG_ENCRYPTION_KMS_KEY_ARN
    

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

コントロール プレーンのルート ボリューム

コントロール プレーンのルート ボリュームの鍵を手動でローテーションするには、次の操作を行います。

  1. 新しい Cloud Key Management Service 鍵を作成します。KMS 鍵の ARN の値を保存します。これは後で使用します。

  2. クラスタに関連付けられた IAM ロールに、新しい鍵を使用して暗号化と復号を行う権限があることを確認します。

  3. gcloud container aws clusters update コマンドを使用して暗号鍵を更新します。

     gcloud container aws clusters update CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --root-volume-kms-key-arn=ROOT_VOLUME_KMS_KEY_ARN
    

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

    • CLUSTER_NAME: クラスタの名前
    • GOOGLE_CLOUD_LOCATION: クラスタを管理するサポート対象の Google Cloud リージョン(例: us-west1
    • ROOT_VOLUME_KMS_KEY_ARN: ルート ボリュームを暗号化するための AWS KMS 鍵の Amazon Resource Name(ARN)

ノードプール構成の鍵

ノードプール構成の鍵を手動でローテーションするには、次の操作を行います。

  1. 新しい Cloud Key Management Service 鍵を作成します

  2. クラスタに関連付けられた IAM ロールに、新しい鍵を使用して暗号化と復号を行う権限があることを確認します。

  3. 使用中の KMS エイリアスを更新します。

     aws kms update-alias --alias-name KEY_ALIAS \
         --target-key-id CONFIG_ENCRYPTION_KMS_KEY_ARN
    

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

    • KEY_ALIAS: 既存の鍵のエイリアス
    • CONFIG_ENCRYPTION_KMS_KEY_ARN: 新しい KMS 鍵の ARN
  4. 新しい暗号鍵を使用してすべてのクラスタ Secret の再暗号化を強制的に実行します。

     kubectl get secrets --all-namespaces -o json | \
     kubectl annotate --overwrite -f - encryption-key-rotation-time=`date +"%Y%m%d-%H%M%S"`
    
  5. 古い AWS KMS 鍵を無効にします。詳細については、鍵の有効化と無効化をご覧ください。

ノードプールのルート ボリューム

ノードプールのルート ボリュームの鍵を手動でローテーションするには、次の操作を行います。

  1. 新しい Cloud Key Management Service 鍵を作成します

  2. クラスタに関連付けられた IAM ロールに、新しい鍵を使用して暗号化と復号を行う権限があることを確認します。

  3. 使用中の KMS エイリアスを更新します。

     aws kms update-alias --alias-name KEY_ALIAS \
         --target-key-id ROOT_VOLUME_KMS_KEY_ARN
    

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

    • KEY_ALIAS: 既存の鍵のエイリアス
    • ROOT_ENCRYPTION_KMS_KEY_ARN: 新しい KMS 鍵の ARN
  4. ノードプールを更新します。

     gcloud container aws node-pools update NODE_POOL_NAME \
         --root-volume-kms-key-arn=ROOT_VOLUME_KMS_KEY_ARN
    

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

    • NODE_POOL_NAME: ノードプールの名前
    • ROOT_VOLUME_KMS_KEY_ARN: ルート ボリュームを暗号化するための AWS KMS 鍵の Amazon Resource Name(ARN)
  5. 古い AWS KMS 鍵を無効にします。詳細については、鍵の有効化と無効化をご覧ください。