Kubernetes Secret での Cassandra 認証情報のローテーション

Kubernetes Secret での Cassandra Secret のローテーション

この手順では、クラスタ内の Kubernetes Secret で Cassandra 認証情報をローテーションする方法について説明します。Hashicorp Vault 内での認証情報のローテーションについては、Hashicorp Vault での Cassandra 認証情報のローテーションをご覧ください。

この手順では、次の 3 つのタスクを自動化してトリガーすることで、本番環境の Apigee ハイブリッド サービスで使用される Cassandra 認証情報を、ダウンタイムなしでローテーションできます。

  • ユーザー認証情報のローテーション
  • ローテーションのロールバック
  • 古い認証情報と新しい認証情報のクリーンアップ

Kubernetes Secret で Cassandra Secret をローテーションする

ローテーションできる Cassandra 認証情報のユーザー名とパスワードのペアは 6 つあります。

  • defaultパスワードのローテーションのみ
  • admin_user
  • ddl_user
  • dml_user
  • jmxuser
  • apigee

認証情報のローテーションの準備をする

これらの手順を実行するには、クラスタ内で kubectl apply -f を実行する権限が必要です。

  1. Cassandra データベースをバックアップします。このバックアップは、事前にローテーションされた認証情報の復元を確実に行うためのものです。Cassandra のバックアップの概要をご覧ください。
  2. クラスタが正常な状態であり、すべての Apigee リソースが実行されており、保留中の状態変更がないことを確認します。

単一リージョンの認証情報のローテーション

  1. Kubernetes Secret でユーザー名とパスワードを設定するの手順に沿って、ローテーションする Cassandra ユーザー認証情報を保持する新しい Kubernetes Secret を Apigee Namespace に作成します。
  2. ローテーションの事前チェックを実行します。
    1. 次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
      # rotation-k8s-secrets.yaml
      
      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: SecretRotation
      metadata:
        name: ROTATION_NAME
        namespace: APIGEE_NAMESPACE
      spec:
        organizationId: APIGEE_ORG
        rotationId: ROTATION_ID
        timeoutMinutes: TIMEOUT_MINUTES # optional. 480 recommended.
        precheck: true
        cassandra:
          oldSecretRef: OLD_SECRET_REF
          newSecretRef: NEW_SECRET_REF
          jobType: ROTATE
      

      ここで

      • ROTATION_NAME: ローテーション ジョブの名前(例: sr-1-precheck)。
      • APIGEE_NAMESPACE: Apigee Namespace。
      • APIGEE_ORG: Apigee 組織の ID。
      • ROTATION_ID: カスタム ID(例: rot-1-precheck)。
      • TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
      • OLD_SECRET_REF: apigeedatastore で現在使用されている Secret 名。これは次のコマンドを使用して確認できます。
        kubectl -n APIGEE_NAMESPACE get apigeedatastore default -o jsonpath='{.spec.credentialRef}'
        
      • NEW_SECRET_REF: 前の手順で作成したシークレット名。
    2. ローテーション YAML ファイルを適用して、ローテーションの事前チェックジョブをトリガーします。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
    3. ジョブのステータスを確認し、完了するまで待ちます。
      kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
      

      ジョブが完了すると、出力には次の内容が含まれます。

      Status:
        Message:  rotation complete
        State:    complete
      kubectl -n APIGEE_NAMESPACE logs sr-ROTATION_ID-rotate-job-HASH
      
  3. ローテーションの事前チェックジョブが完了したら、ローテーションを実行します。
    1. ローテーション YAML ファイルに次の変更を加えます。
      • metadata.name を、これが事前チェックではないことを示す名前(sr-1 など)に変更します。
      • spec.precheckfalse に設定する。
      • spec.rotationId を新しい ID(rot-1 など)に変更します。
    2. ファイルをもう一度適用して、ローテーションを実行します。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
  4. ローテーション ジョブが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
  5. トラフィックを検証したら、古いシークレットのクリーンアップを行います。
    1. ローテーション YAML ファイルに次の変更を加えます。
      • metadata.name を、これがクリーンアップ ジョブであることを示す名前(sr-1-cleanup など)に変更します。
      • spec.cassandra.jobTypeCLEANUP に設定する。
    2. ファイルをもう一度適用して、クリーンアップを実行します。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
    3. ジョブのステータスを確認し、完了するまで待ちます。
      kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
      

      クリーンアップ ジョブが完了すると、ローテーション プロセスは完了します。

  6. Cassandra データベースのバックアップを取得します。このバックアップは、ローテーション後の認証情報の復元を確実に行うためのものです。
  7. 古い Cassandra 認証情報シークレットを削除します。

マルチリージョン認証情報のローテーション

  1. 各リージョンで、Kubernetes Secret でユーザー名とパスワードを設定するの手順に沿って、ローテーションする Cassandra ユーザー認証情報を保持する新しい Kubernetes Secret を Apigee Namespace に作成します。

    認証情報は各リージョンで同じである必要があります。

  2. ローテーションの事前チェックを実行します。
    1. 次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
      # rotation-k8s-secrets.yaml
      
      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: SecretRotation
      metadata:
        name: ROTATION_NAME
        namespace: APIGEE_NAMESPACE
      spec:
        organizationId: APIGEE_ORG
        rotationId: ROTATION_ID
        timeoutMinutes: TIMEOUT_MINUTES # optional. 480 recommended.
        precheck: true
        cassandra:
          oldSecretRef: OLD_SECRET_REF
          newSecretRef: NEW_SECRET_REF
          jobType: ROTATE
      

      ここで

      • ROTATION_NAME: ローテーション ジョブの名前(例: sr-1-precheck)。
      • APIGEE_NAMESPACE: Apigee Namespace。
      • APIGEE_ORG: Apigee 組織の ID。
      • ROTATION_ID: カスタム ID(例: rot-1-precheck)。
      • TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
      • OLD_SECRET_REF: apigeedatastore で現在使用されている Secret 名。これは次のコマンドを使用して確認できます。
        kubectl -n APIGEE_NAMESPACE get apigeedatastore default -o jsonpath='{.spec.credentialRef}'
        
      • NEW_SECRET_REF: 前の手順で作成したシークレット名。
    2. 最初のリージョンで、ローテーション YAML ファイルを適用してローテーションの事前チェックジョブをトリガーします。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
    3. ジョブのステータスを確認し、完了するまで待ちます。
      kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
      

      ジョブが完了すると、出力には次の内容が含まれます。

      Status:
        Message:  rotation complete
        State:    complete
      kubectl -n APIGEE_NAMESPACE logs sr-ROTATION_ID-rotate-job-HASH
      
  3. ローテーションの事前チェックジョブが完了したら、同じリージョンでローテーションを実行します。
    1. ローテーション YAML ファイルに次の変更を加えます。
      • metadata.name を、これが事前チェックではないことを示す名前(sr-1 など)に変更します。
      • spec.precheckfalse に設定する。
      • spec.rotationId を新しい ID(rot-1 など)に変更します。
    2. ファイルをもう一度適用して、ローテーションを実行します。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
  4. ローテーション ジョブが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
  5. 残りのリージョンに対してローテーションの手順を繰り返します。
  6. トラフィックを検証したら、古いシークレットのクリーンアップを行います。クリーンアップは 1 つのリージョンでのみ行う必要があります。どのリージョンを選択してもかまいません。
    1. ローテーション YAML ファイルに次の変更を加えます。
      • metadata.name を、これがクリーンアップ ジョブであることを示す名前(sr-1-cleanup など)に変更します。
      • spec.cassandra.jobTypeCLEANUP に設定する。
    2. ファイルをもう一度適用して、クリーンアップを実行します。
      kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
      
    3. ジョブのステータスを確認し、完了するまで待ちます。
      kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
      

      クリーンアップ ジョブが完了すると、ローテーション プロセスは完了します。

  7. Cassandra データベースのバックアップを取得します。このバックアップは、ローテーション後の認証情報の復元を確実に行うためのものです。
  8. 古い Cassandra 認証情報シークレットを削除します。

ローテーションのロールバック

各リージョンで次の手順を実行します。

  1. 次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
    # rollback-k8s-secrets.yaml
    
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: SecretRotation
    metadata:
      name: ROLLBACK_NAME
      namespace: APIGEE_NAMESPACE
    spec:
      organizationId: APIGEE_ORG
      rotationId: ROTATION_ID # match the current rotation.
      timeoutMinutes: TIMEOUT_MINUTES # optional.
      precheck: false
      cassandra:
        oldSecretRef: OLD_SECRET_REF # Must match the previous oldSecretRef.
        newSecretRef: NEW_SECRET_REF # Must match the previous newSecretRef.
        jobType: ROLLBACK
    

    ここで

    • ROLLBACK_NAME: ロールバック ジョブの名前(例: sr-1-rollback)。
    • APIGEE_NAMESPACE: Apigee Namespace。
    • APIGEE_ORG: Apigee 組織の ID。
    • ROTATION_ID: ロールバックする現在のローテーションの ID(例: rot-1)。
    • TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
    • OLD_SECRET_REF: 単一リージョンのローテーションまたはマルチリージョンのローテーションの手順で使用したローテーション YAML ファイルの oldSecretRef: のシークレット名と一致する必要があります。
    • NEW_SECRET_REF: 単一リージョンのローテーションまたはマルチリージョンのローテーションの手順で使用したローテーション YAML ファイルの newSecretRef: のシークレット名と一致する必要があります。
  2. ロールバックを適用します。
    kubectl -n APIGEE_NAMESPACE apply -f ROLLBACK_YAML_FILE
    
  3. ジョブのステータスを確認し、完了するまで待ちます。
    kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
    
  4. ロールバックが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
  5. トラフィックが正しく流れたら、残りの各リージョンでロールバック プロセスを繰り返します。
  6. ロールバックが完了し、トラフィックが引き続き正しく転送されていることを確認したら、クリーンアップ プロセスを開始します。クリーンアップは 1 つのリージョンでのみ行う必要があります。どのリージョンを選択してもかまいません。

    ローテーション YAML ファイルに次の変更を加えます。

    • metadata.name は、クリーンアップ ジョブであることを示す名前に変更します(例: sr-1-cleanup-rollback)。
    • spec.cassandra.jobTypeCLEANUP_ROLLBACK に変更します。
  7. ファイルを適用してクリーンアップ ジョブをトリガーします。
    kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE