外部シークレット マネージャーにデータを保存する
このガイドでは、overrides.yaml ファイルではなく、外部シークレット ストレージ サービスである Hashicorp Vault に次の種類の情報を保存して管理する方法について説明します。
- AX ハッシュ ソルト
- Redis パスワード
- 暗号鍵
Vault に他の種類の情報を保存するには、以下をご覧ください。
要件
- Kubernetes Secret ストア CSI ドライバ。インストールするには、Secrets Store CSI ドライバ: インストールの手順に沿って操作します。サポートされているバージョンについては、Apigee ハイブリッドでサポートされているプラットフォームとバージョン: Secret Store CSI ドライバをご覧ください。
- Vault CSI プロバイダ。Vault CSI プロバイダのインストールの手順に沿ってインストールできます。サポートされているバージョンについては、Apigee ハイブリッドでサポートされているプラットフォームとバージョン: Vault をご覧ください。
手順
-
Vault の Secret、ポリシー、ロールを作成します。
- Vault UI または API を使用して Secret を作成し、ここで説明するように、Apigee Kubernetes サービス アカウントにそれらの Secret を読み取る権限を付与します。シークレットは、次の表に示すように、キーと 1 つ以上の値で構成する必要があります。
シークレット キー シークレット データ secret/data/apigee/axhashsalt
{ "ax-hash-salt": "AX_HASH_SALT_VALUE" }
secret/data/apigee/redis
{ "redis-password": "REDIS_PASSWORD_VALUE" }
secret/data/apigee/orgencryptionkeys
{ "kmsEncryptionKey": "KMS_ENCRYPTION_KEY_VALUE" "kvmEncryptionKey": "KVM_ENCRYPTION_KEY_VALUE" "contractEncryptionKey": "CONTRACT_ENCRYPTION_KEY_VALUE" }
secret/data/apigee/envencryptionkeys
{ "cacheEncryptionKey": "CACHE_ENCRYPTION_KEY_VALUE" "kvmEncryptionKey": "KVM_ENCRYPTION_KEY_VALUE" "envKvmEncryptionKey": "ENV_KVM_ENCRYPTION_KEY_VALUE" "kmsEncryptionKey": "KMS_ENCRYPTION_KEY_VALUE" }
- Vault 内で、Secret へのアクセス権を付与するポリシーを作成します。
cat axhashsalt-auth-policy.txt path "secret/data/apigee/axhashsalt" { capabilities = ["read"] }
cat redis-auth-policy.txt path "secret/data/apigee/redis" { capabilities = ["read"] }
cat orgencryptionkeys-auth-policy.txt path "secret/data/apigee/orgencryptionkeys" { capabilities = ["read"] }
cat envencryptionkeys-auth-policy.txt path "secret/data/apigee/envencryptionkeys" { capabilities = ["read"] }
vault policy write apigee-axhashsalt-auth axhashsalt-auth-policy.txt
vault policy write apigee-redis-auth redis-auth-policy.txt
vault policy write apigee-orgencryptionkeys-auth orgencryptionkeys-auth-policy.txt
vault policy write apigee-envencryptionkeys-auth envencryptionkeys-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-redis-default,apigee-redis-envoy-default,apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE}" 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-runtime-${ENV_ENCODE},apigee-synchronizer-${ENV_ENCODE} done echo $NAMES
- スクリプトを実行して、ポリシーをバインドするサービス アカウント名のリストを生成します。
chmod +x ./generate-encoded-sas.sh
./generate-encoded-sas.sh
出力には、エンコードされたサービス アカウント名が一覧表示されます。
- ポリシーを使用して、必要な Apigee サービス アカウントをバインドする Vault ロールを作成します。
vault write auth/kubernetes/role/apigee-axhashsalt \ bound_service_account_names=BOUND_SA_NAMES \ bound_service_account_namespaces=APIGEE_NAMESPACE \ policies=apigee-axhashsalt-auth \ ttl=1m
vault write auth/kubernetes/role/apigee-redis \ bound_service_account_names=BOUND_SA_NAMES \ bound_service_account_namespaces=APIGEE_NAMESPACE \ policies=apigee-redis-auth \ ttl=1m
vault write auth/kubernetes/role/apigee-orgencryptionkeys \ bound_service_account_names=BOUND_SA_NAMES \ bound_service_account_namespaces=APIGEE_NAMESPACE \ policies=apigee-orgencryptionkeys-auth \ ttl=1m
vault write auth/kubernetes/role/apigee-envencryptionkeys \ bound_service_account_names=BOUND_SA_NAMES \ bound_service_account_namespaces=APIGEE_NAMESPACE \ policies=apigee-envencryptionkeys-auth \ ttl=1m
- Vault UI または API を使用して Secret を作成し、ここで説明するように、Apigee Kubernetes サービス アカウントにそれらの Secret を読み取る権限を付与します。シークレットは、次の表に示すように、キーと 1 つ以上の値で構成する必要があります。
SecretProviderClass
オブジェクトを作成します。SecretProviderClass
リソースを使用して、次のシークレットを追加します。これらのリソースは、Secret をリクエストするときに通信するプロバイダを CSI ドライバに伝えます。次の表に、Apigee ハイブリッドで想定されるファイル名(objectNames
)を示します。シークレット 想定される Secret ファイル名 AX ハッシュ Salt ax-hash-salt
Redis redis-password
組織の暗号鍵 kmsEncryptionKey
kvmEncryptionKey
contractEncryptionKey
Env 暗号鍵 kmsEncryptionKey
kvmEncryptionKey
envKvmEncryptionKey
cacheEncryptionKey
- 次の
SecretProviderClass
テンプレートを使用して、これらのリソースを構成します。# axhashsalt-spc.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-axhashsalt-spc spec: provider: vault parameters: roleName: apigee-axhashsalt 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: "ax-hash-salt" secretPath: "" secretKey: ""
# redis-spc.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-redis-spc spec: provider: vault parameters: roleName: apigee-redis 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: "redis-password" secretPath: "" secretKey: ""
# orgencryptionkeys-spc.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-orgencryptionkeys-spc spec: provider: vault parameters: roleName: apigee-orgencryptionkeys 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: "kmsEncryptionKey" secretPath: "" secretKey: "" - objectName: "kvmEncryptionKey" secretPath: "" secretKey: "" - objectName: "contractEncryptionKey" secretPath: "" secretKey: ""
# envencryptionkeys-spc.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-envencryptionkeys-spc spec: provider: vault parameters: roleName: apigee-envencryptionkeys 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: "cacheEncryptionKey" secretPath: "" secretKey: "" - objectName: "kvmEncryptionKey" secretPath: "" secretKey: "" - objectName: "envKvmEncryptionKey" secretPath: "" secretKey: "" - objectName: "kmsEncryptionKey" secretPath: "" secretKey: ""
VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタと名前空間で実行されている場合、一般的な形式は
http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT
です。 - 上記の
SecretProviderClasses
をAPIGEE_NAMESPACE
Namespace に適用します。kubectl -n APIGEE_NAMESPACE apply -f axhashsalt-spc.yaml
kubectl -n APIGEE_NAMESPACE apply -f redis-spc.yaml
kubectl -n APIGEE_NAMESPACE apply -f orgencryptionkeys-spc.yaml
kubectl -n APIGEE_NAMESPACE apply -f envencryptionkeys-spc.yaml
- AX ハッシュ ソルトの外部 Secret を有効にします。
overrides.yaml
ファイル内に次の構成を追加して、AX ハッシュ ソルトの外部 Secret の使用を有効にします。axHashSaltSecretProviderClass: apigee-axhashsalt-spc
org
Helm チャートをアップグレードして変更を適用します。helm upgrade org apigee-org/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
- Redis パスワードの外部 Secret を有効にします。
overrides.yaml
ファイル内に次の構成を追加して、Redis パスワードの外部 Secret の使用を有効にします。redis: auth: secretProviderClass: apigee-redis-spc
- 次に、
operator
チャートとredis
チャートを次の順序でアップグレードして、変更を適用します。helm upgrade operator apigee-operator/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
helm upgrade redis apigee-redis/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
- 暗号鍵の外部 Secret を有効にする
overrides.yaml
ファイル内に次の構成を追加して、組織レベルの暗号鍵の外部 Secret の使用を有効にします。encryptionKeySecretProviderClass: apigee-orgencryptionkeys-spc
org
Helm チャートをアップグレードして変更を適用します。helm upgrade org apigee-org/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
- 環境ごとの
overrides.yaml
ファイル内に、環境固有の暗号鍵の次の構成を追加します。envs: - name: ENV_NAME encryptionKeySecretProviderClass: apigee-envencryptionkeys-spc
- 環境ごとに
env
Helm チャートを 1 回アップグレードして、変更を適用します。helm upgrade ENV_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --set env=ENV_NAME \ -f overrides.yaml
ロールバック
AX ハッシュ Salt
overrides.yaml
ファイル内で、AX ハッシュ ソルトの外部 Secret の使用を有効にする構成を削除します。# Comment out or delete the following line: # axHashSaltSecretProviderClass: apigee-axhashsalt-spc
org
Helm チャートをアップグレードして変更を適用します。helm upgrade org apigee-org/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
Redis パスワード
overrides.yaml
ファイル内で、Redis パスワードの外部 Secret の使用を有効にする構成を削除します。redis: auth: # Comment out or delete the following line: # secretProviderClass: apigee-redis-spc
- 次に、
redis
チャートとoperator
チャートを次の順序でアップグレードして、変更を適用します。helm upgrade redis apigee-redis/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
helm upgrade operator apigee-operator/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml
暗号鍵
overrides.yaml
ファイル内で、env 暗号鍵の外部 Secret の使用を有効にした構成を削除します。envs: - name: ENV_NAME # Comment out or delete the following line: # encryptionKeySecretProviderClass: apigee-envencryptionkeys-spc
- 環境ごとに
env
Helm チャートを 1 回アップグレードして、変更を適用します。helm upgrade ENV_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --set env=ENV_NAME \ -f overrides.yaml
overrides.yaml
ファイル内で、組織の暗号鍵の外部 Secret の使用を有効にした構成を削除します。# Comment out or delete the following line: # encryptionKeySecretProviderClass: apigee-orgencryptionkeys-spc
- 次に、
org
Helm チャートをアップグレードします。helm upgrade org apigee-org/ \ --namespace APIGEE_NAMESPACE \ -f overrides.yaml