Hashicorp Vault へのサービス アカウント キーの保存

Hashicorp Vault へのサービス アカウント Secret の保存

この機能を使用すると、外部 Secret マネージャーである Hashicorp Vault に Apigee Hybrid 用の Google サービス アカウント証明書を保存できます。外部 Secret マネージャーによって、データ所在地の管理と詳細なアクセス制御など、Kubernetes でデータを保存する方法を管理できます。

GKE クラスタの Workload Identity または EKS と AKS の Workload Identity 連携を使用していない場合は、Apigee ハイブリッド コンポーネントは、タスクを実行できるように Google サービス アカウントを認証する必要があります。Apigee ハイブリッドで Google サービス アカウント キーを保存して参照する方法は 3 つあります。

  • ハードドライブに保存されているサービス アカウント証明書ファイル(.json ファイル)。これらは、serviceAccountPath 構成プロパティを使用してオーバーライドで参照します。次に例を示します。
    logger:
      serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
    
  • ハードドライブに保存されているサービス アカウント証明書ファイル(.json ファイル)。これらは、serviceAccountPath 構成プロパティを使用してオーバーライドで参照します。サービス アカウントについてをご覧ください。
  • Kubernetes Secret に保存されたサービス アカウント証明書。これらは、serviceAccountRef 構成プロパティを使用してオーバーライドで参照します。Kubernetes Secret へのデータの保存をご覧ください。
  • このガイドで説明している Hashicorp Vault に保存されたサービス アカウント証明書。これらは、serviceAccountSecretProviderClass 構成プロパティを使用してオーバーライドで参照します。

Vault にサービス アカウントの Secret を保存するように設定する

CSI ドライバと Vault プロバイダをインストールする

Helm を使用してクラスタに CSI ドライバをまだインストールしていない場合は、Secrets Store CSI ドライバ: インストールの手順に沿って対応します。詳細については、Vault ドキュメントの Vault CSI プロバイダのインストールをご覧ください。

Apigee ハイブリッドでサポートされている CSI ドライバの最小バージョンについては、Apigee ハイブリッドでサポートされているプラットフォームとバージョンをご覧ください。

Vault の Secret、ポリシー、ロールを作成する

Vault UI または API を使用して Secret を作成し、Apigee ハイブリッドで使用される Kubernetes サービス アカウントに、それらの Secret を読み取る権限を付与します。

  1. 組織と環境固有の Secret を次の形式で作成します。
    秘密鍵Secret データ
    secret/data/apigee/orgsakeys
    {
      "cassandraBackup": "***",
      "cassandraRestore": "***",
      "connectAgent": "***",
      "logger": "***",
      "mart": "***",
      "metrics": "***",
      "mint": "***",
      "udca": "***",
      "watcher": "***"
    }
    secret/data/apigee/envsakeys-ENV_NAME
    {
      "runtime": "***",
      "synchronizer": "***",
      "udca": "***". 
    }

    各ペアの "***" を、apigee コンポーネントに対応する Google サービス アカウントの .json ファイルの内容に置き換えます。apigee-cassandra-backupapigee-cassandra-restore はどちらも apigee-cassandra サービス アカウントを使用します。次に例を示します。

    {
      "cassandraBackup": "{
        "type": "service_account",
        "project_id": "myhybridorg",
        "private_key_id": "PRIVATE_KEY_ID",
        "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY_TEXT\n-----END PRIVATE KEY-----\n",
        "client_email": "apigee-cassandra@myhybridorg.iam.gserviceaccount.com",
        "client_id": "123456789012345678901",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/apigee-cassandra%40myhybridorg.iam.gserviceaccount.com",
        "universe_domain": "googleapis.com"
      }",
      "cassandraRestore":...
    ...
    }
        
  2. 組織の Secret にアクセス権を付与します。次の内容を含むテキスト ファイルを、orgsakeys-auth-policy.txt という名前で作成します。
    path "secret/data/apigee/orgsakeys" {
      capabilities = ["read"]
    }
  3. Vault 内で、組織の Secret へのアクセス権を付与するポリシーを作成します。
    vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
  4. 環境ごとに、次の内容を含むテキスト ファイルを envsakeys-ENV_NAME-auth-policy.txt という名前で作成します。
    path "secret/data/apigee/envsakeys-ENV_NAME" {
      capabilities = ["read"]
    }

    この手順を環境ごとに繰り返します。

  5. Vault 内で、環境の Secret へのアクセス権を付与するポリシーを作成します。
    vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

    この手順を環境ごとに繰り返します。

  6. 次の内容のスクリプトを generate-encoded-sas.sh という名前で作成します。
    # generate-encoded-sas.sh
    
    ORG=$APIGEE_ORG            # Apigee organization name
    ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
    
    ORG_SHORT_NAME=$(echo $ORG | head -c 15)
    ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
    ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
    NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
    
    for ENV in ${ENVS//,/ }
    do
      ENV_SHORT_NAME=$(echo $ENV | head -c 15)
      ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
      ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
      NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
    done
    
    echo $NAMES
    
  7. スクリプトを実行して、ポリシーをバインドするサービス アカウント名のリストを生成します。
    ./generate-encoded-sas.sh

    出力は、次の例のように、カンマで区切られた Kubernetes サービス アカウント名のリストになります。

    ./generate-encoded-sas.sh
    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
    bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
    igee-runtime-myhybridorg-prod-2d0221c
  8. 出力テキストをコピーして複数のリストに分割します。一つのリストは org サービス アカウント名用で、別のリストは各環境の env サービス アカウント名用です。org サービス アカウントは、apigee-logger-apigee-telemetry までの出力リストの先頭にあります。

    前述の例の org サービス名のリスト:

    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try

    env サービス アカウント名にはパターン apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXTapigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT があります。これらを環境ごとに別個のリストに分割します。たとえば、前述の例の出力は次の 2 つのリストに分割できます。

    dev 環境:

    apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
    org-dev-ee52aca

    prod 環境:

    apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
    dorg-prod-2d0221c
  9. ポリシーを使用して、組織固有の Apigee サービス アカウントをバインドする Vault ロールを作成します。
    vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
    
  10. 環境ごとに、サービス アカウント キーの Vault ロールを作成します。
    vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
    

    すべての環境について、この手順を繰り返します。

SecretProviderClass オブジェクトの作成

SecretProviderClass リソースは、Secret をリクエストするときに通信するプロバイダを CSI ドライバに伝えます。サービス アカウント キーは、このオブジェクトを介して構成する必要があります。次の表に、Apigee Hybrid で想定されるファイル名(objectNames)を示します。

サービス アカウント想定される Secret ファイル名
Cassandra バックアップ cassandraBackup
Cassandra の復元 cassandraRestore
Connect Agent connectAgent
Logger logger
MART mart
指標 metrics
収益化 mint
ランタイム runtime
Synchronizer synchronizer
UDCA udca
Watcher watcher
  1. 次の SecretProviderClass テンプレートを使用して、組織固有の Secret 用にこのリソースを構成します。
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: apigee-orgsakeys-spc
    spec:
      provider: vault
      parameters:
        roleName: apigee-orgsakeys
        vaultAddress: VAULT_ADDRESS
        # "objectName" is an alias used within the SecretProviderClass to reference
        # that specific secret. This will also be the filename containing the secret.
        # Apigee Hybrid expects these exact values so they must not be changed.
        # "secretPath" is the path in Vault where the secret should be retrieved.
        # "secretKey" is the key within the Vault secret response to extract a value from.
        objects: |
          - objectName: "cassandraBackup"
            secretPath: ""
            secretKey: ""
          - objectName: "cassandraRestore"
            secretPath: ""
            secretKey: ""
          - objectName: "connectAgent"
            secretPath: ""
            secretKey: ""
          - objectName: "logger"
            secretPath: ""
            secretKey: ""
          - objectName: "mart"
            secretPath: ""
            secretKey: ""
          - objectName: "metrics"
            secretPath: ""
            secretKey: ""
          - objectName: "mint"
            secretPath: ""
            secretKey: ""
          - objectName: "udca"
            secretPath: ""
            secretKey: ""
          - objectName: "watcher"
            secretPath: ""
            secretKey: ""
    

    VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタで実行されている場合、一般的な形式は http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

    テンプレートを spc-org.yaml という名前のファイルに保存します。

  2. 組織固有の SecretProviderClass を apigee Namespace に適用します。
    kubectl -n apigee apply -f spc-org.yaml
  3. 環境ごとに、次の SecretProviderClass テンプレートを使用して、環境固有の Secret 用にこのリソースを構成します。すべての環境について、この手順を繰り返します。
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: apigee-envsakeys-ENV_NAME-spc
    spec:
      provider: vault
      parameters:
        roleName: apigee-envsakeys-ENV_NAME
        vaultAddress: VAULT_ADDRESS
        # "objectName" is an alias used within the SecretProviderClass to reference
        # that specific secret. This will also be the filename containing the secret.
        # Apigee Hybrid expects these exact values so they must not be changed.
        # "secretPath" is the path in Vault where the secret should be retrieved.
        # "secretKey" is the key within the Vault secret response to extract a value from.
        objects: |
          - objectName: "runtime"
            secretPath: ""
            secretKey: ""
          - objectName: "synchronizer"
            secretPath: ""
            secretKey: ""
          - objectName: "udca"
            secretPath: ""
            secretKey: ""
    

    VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタで実行されている場合、一般的な形式は http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

    テンプレートを spc-env-ENV_NAME.yaml という名前のファイルに保存します。

  4. 環境ごとに、環境固有の SecretProviderClass を apigee Namespace に適用します。
    kubectl -n apigee apply -f spc-env-ENV_NAME.yaml

    すべての環境について、この手順を繰り返します。

Google サービス アカウントで外部 Secret を有効にする

  1. オーバーライド ファイル内に serviceAccountSecretProviderClassenvs[].serviceAccountSecretProviderClass の構成プロパティを追加して、Google サービス アカウントの外部 Secret の使用を有効にします。serviceAccountPathserviceAccountPaths の構成プロパティを削除するか、コメントアウトできます。
    serviceAccountSecretProviderClass: apigee-orgsakeys-spc
    
    envs:
      - name: ENV_NAME
        serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
  2. 各 Helm チャートを適用します。
    helm upgrade datastore apigee-datastore/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
  3. 環境ごとに、apigee-env チャートを適用します。
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace apigee \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

サービス アカウント証明書ファイルを使用するようにロールバックする

保存されている Google サービス アカウントの証明書ファイルを使用するようにロールバックする必要がある場合は、次の手順を行います。

  1. オーバーライド ファイルを更新します。
    1. serviceAccountSecretProviderClass 行と envs:serviceAccountSecretProviderClass 行を削除するか、コメントアウトします。
    2. 適切なサービス アカウントへのパスを指定して、serviceAccountPathserviceAccountPaths の構成プロパティを追加します。

    次に例を示します。

    # serviceAccountSecretProviderClass: apigee-orgsakeys-spc - (commented out)
    
    cassandra:
      backup:
        serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json
      restore:
        serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json
    
    connectAgent:
      serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json
    
    envs:
      - name: test
      # serviceAccountSecretProviderClass: apigee-envsakeys-spc - (commented out)
        serviceAccountPaths:
          runtime: service-accounts/myhybridorg-apigee-runtime.json
          synchronizer: service-accounts/myhybridorg-apigee-synchronizer.json
    
    logger:
      serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
    
    mart:
      serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json
    
    metrics:
      serviceAccountPath: service-accounts/myhybridorg-apigee-metrics.json
    
    udca:
      serviceAccountPath: service-accounts/myhybridorg-apigee-udca.json
    
    watcher:
      serviceAccountPath: service-accounts/myhybridorg-apigee-watcher.json
    
  2. 各 Helm チャートを適用します。
    helm upgrade datastore apigee-datastore/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
  3. 環境ごとに、apigee-env チャートを適用します。
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace apigee \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

    すべての環境について、この手順を繰り返します。