サービス アカウント キーのローテーション

このページでは、次のサービス アカウント キーをローテーションする方法について説明します。

サービス アカウント キーをローテーションするには:

  1. 現在のシークレットのバックアップを保存するディレクトリを作成します。

    mkdir backup
  2. 関連するサービス アカウントについて、次の情報をメモします。

    コンポーネント アクセス

    クラスタ シークレット 名前空間
    管理 admin-cluster-creds kube-system
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt
    管理 private-registry-creds kube-system
    ユーザー private-registry-creds kube-system
    • 非公開レジストリを使用していない場合、private-registry-creds Secret はコンポーネント アクセス サービス アカウント キーを保持します。
    • 非公開レジストリを使用している場合は、private-registry-creds Secret には、コンポーネント アクセス サービス アカウント キーではなく、非公開レジストリの認証情報が保持されます。

    connect-register

    クラスタ シークレット 名前空間
    管理 admin-cluster-creds kube-system
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt

    logging-monitoring

    クラスタ シークレット 名前空間
    管理 admin-cluster-creds kube-system
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt
    ユーザー google-cloud-credentials kube-system
    ユーザー stackdriver-service-account-key knative-serving

    監査ロギング

    クラスタ シークレット 名前空間
    管理 admin-cluster-creds kube-system
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt
    管理 kube-apiserver CLUSTER_NAME

    使用状況測定

    クラスタ シークレット 名前空間
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt
    ユーザー usage-metering-bigquery-service-account-key kube-system

    Stackdriver

    クラスタ シークレット 名前空間
    管理 admin-cluster-creds kube-system
    管理 ユーザー クラスタ証明書 CLUSTER_NAME-gke-onprem-mgmt
    ユーザー google-cloud-credentials kube-system
    ユーザー stackdriver-service-account-key knative-serving
  3. 次のコマンドを使用して、各シークレットのバックアップを作成します。

    kubectl get secret SECRET --namespace NAMESPACE \
        --kubeconfig KUBECONFIG -o json > backup/SECRET-NAMESPACE.json

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

    • NAMESPACE は、シークレットが配置されている名前空間です。例: kube-system
    • KUBECONFIG: 管理クラスタまたはユーザー クラスタの kubeconfig ファイルへのパス。
    • SECRET: Secret の名前例: admin-cluster-creds

    たとえば、監査ロギング サービス アカウントに対する次のコマンドを実行します。

    kubectl get secret admin-cluster-creds --namespace kube-system \
            --kubeconfig KUBECONFIG -o json > backup/admin-cluster-creds-kube-system.json
    
    kubectl get secret user-cluster-creds --namespace NAMESPACE \
            --kubeconfig KUBECONFIG -o json > backup/user-cluster-creds-NAMESPACE.json
    
    kubectl get secret kube-apiserver --namespace NAMESPACE \
            --kubeconfig KUBECONFIG -o json > backup/kube-apiserver-NAMESPACE.json
  4. 新しいサービス アカウント キー ファイルを作成するには、次のコマンドを実行します。

    gcloud iam service-accounts keys create NEW_KEY_FILE --iam-account IAM_ACCOUNT

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

    • NEW_KEY_FILE: 新しいサービス アカウント キー ファイルの名前
    • IAM_ACCOUNT: サービス アカウントのメールアドレス。
  5. 管理クラスタの構成ファイルで、componentAccessServiceAccountKeyPath フィールド、gkeConnect セクション、stackdriver セクション、cloudAuditLogging セクションを見つけます。これらの場所では、サービス アカウント キー ファイルへのパスを置き換えてください。

  6. ユーザー クラスタの構成ファイルで、componentAccessServiceAccountKeyPath フィールド、gkeConnect セクション、stackdriver セクション、cloudAudigLoggingusageMetering を見つけます。これらの場所では、サービス アカウント キー ファイルへのパスを置き換えてください。

  7. 次のコマンドを実行して、変更を保存します。一度に 1 つのコンポーネントの鍵をローテーションすることも、コンポーネントを sakeys に設定してすべての鍵を一度にローテーションすることもできます。

    gkectl update credentials COMPONENT \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config ADMIN_CLUSTER_CONFIG \
        --admin-cluster
    
    gkectl update credentials COMPONENT \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config USER_CLUSTER_CONFIG
    

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

    • COMPONENT: 次のいずれか。

      • componentaccess
      • register
      • cloudauditlogging
      • usagemetering
      • stackdriver
      • sakeys(複数のコンポーネントの鍵をローテーションします)
    • ADMIN_CLUSTER_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

    • ADMIN_CLUSTER_CONFIG: 管理クラスタの 構成ファイルへのパス。

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

ノードの再作成

一部のサービス アカウント キーのローテーションでは、ノードの再作成が必要なため、さらに時間がかかることがあります。

サービス アカウント ノードの再作成が必要
コンポーネント アクセス Container Registry を使用する場合: はい
非公開レジストリを使用する場合: いいえ
監査ロギング 管理クラスタ: はい、ただしコントロール プレーン ノードのみ
kubeception を使用するユーザー クラスタ: いいえ
Controlplane V2 を使用するユーザー クラスタ: はい、ただしコントロール プレーン ノードのみ
logging-monitoring いいえ
connect-register いいえ
使用状況測定 いいえ

ノードの再作成が必要な鍵のローテーションでは、ノードはローリング アップデート プロセスで置き換えられます。つまり、ノードは 1 つずつ再作成されます。

鍵のローテーション中に発生する可能性のあるダウンタイムは、クラスタのアップグレード時のダウンタイムと同様です。詳細については、アップグレード中のダウンタイムをご覧ください。

バックアップを復元する

前の手順で作成したシークレットのバックアップを復元する必要がある場合は、次のコマンドを実行します。

kubectl apply -f backup/