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 を読み取る権限を付与します。
-
組織と環境固有の 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-backup
とapigee-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":... ... }
- 組織の Secret にアクセス権を付与します。次の内容を含むテキスト ファイルを、orgsakeys-auth-policy.txt という名前で作成します。
path "secret/data/apigee/orgsakeys" { capabilities = ["read"] }
-
Vault 内で、組織の Secret へのアクセス権を付与するポリシーを作成します。
vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
-
環境ごとに、次の内容を含むテキスト ファイルを
envsakeys-ENV_NAME-auth-policy.txt
という名前で作成します。path "secret/data/apigee/envsakeys-ENV_NAME" { capabilities = ["read"] }
この手順を環境ごとに繰り返します。
-
Vault 内で、環境の Secret へのアクセス権を付与するポリシーを作成します。
vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt
この手順を環境ごとに繰り返します。
-
次の内容のスクリプトを
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
-
スクリプトを実行して、ポリシーをバインドするサービス アカウント名のリストを生成します。
./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 -
出力テキストをコピーして複数のリストに分割します。一つのリストは 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_TEXT
とapigee-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
-
ポリシーを使用して、組織固有の 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
-
環境ごとに、サービス アカウント キーの 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 |
-
次の
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
という名前のファイルに保存します。 -
組織固有の
SecretProviderClass
を apigee Namespace に適用します。kubectl -n apigee apply -f spc-org.yaml
-
環境ごとに、次の
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
という名前のファイルに保存します。 -
環境ごとに、環境固有の
SecretProviderClass
を apigee Namespace に適用します。kubectl -n apigee apply -f spc-env-ENV_NAME.yaml
すべての環境について、この手順を繰り返します。
Google サービス アカウントで外部 Secret を有効にする
-
オーバーライド ファイル内に
serviceAccountSecretProviderClass
とenvs[].serviceAccountSecretProviderClass
の構成プロパティを追加して、Google サービス アカウントの外部 Secret の使用を有効にします。serviceAccountPath
とserviceAccountPaths
の構成プロパティを削除するか、コメントアウトできます。serviceAccountSecretProviderClass: apigee-orgsakeys-spc envs: - name: ENV_NAME serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
-
各 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
-
環境ごとに、
apigee-env
チャートを適用します。helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
サービス アカウント証明書ファイルを使用するようにロールバックする
保存されている Google サービス アカウントの証明書ファイルを使用するようにロールバックする必要がある場合は、次の手順を行います。
-
オーバーライド ファイルを更新します。
-
serviceAccountSecretProviderClass
行とenvs:serviceAccountSecretProviderClass
行を削除するか、コメントアウトします。 -
適切なサービス アカウントへのパスを指定して、
serviceAccountPath
とserviceAccountPaths
の構成プロパティを追加します。
次に例を示します。
# 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
-
-
各 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
-
環境ごとに、
apigee-env
チャートを適用します。helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
すべての環境について、この手順を繰り返します。