在外部 Secret Manager 中存储数据
本指南介绍如何在外部 Secret 存储服务 Hashicorp Vault(而非 overrides.yaml 文件)中存储和管理以下类型的信息。
- AX 哈希盐
- Redis 密码
- 加密密钥
如需在 Vault 中存储其他类型的信息,请参阅:
前提条件
- Kubernetes Secret 存储区 CSI 驱动程序。您可以按照 Secret 存储区 CSI 驱动程序:安装中的说明进行安装。如需了解受支持的版本,请参阅 Apigee Hybrid 支持的平台和版本:Secret 存储区 CSI 驱动程序。
- Vault CSI 提供方。您可以按照安装 Vault CSI 提供方中的说明进行安装。如需了解受支持的版本,请参阅 Apigee Hybrid 支持的平台和版本:Vault。
过程
- 创建 Vault Secret、政策和角色。
- 使用 Vault 界面或 API 创建 Secret,并为 Apigee Kubernetes 服务账号授予权限以读取这些 Secret,如本文所述。Secret 需要由一个密钥和一个或多个值组成,如下表所示:
密钥 Secret 数据 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 界面或 API 创建 Secret,并为 Apigee Kubernetes 服务账号授予权限以读取这些 Secret,如本文所述。Secret 需要由一个密钥和一个或多个值组成,如下表所示:
- 创建
SecretProviderClass
对象。- 通过
SecretProviderClass
资源添加以下 Secret。这些资源告知 CSI 驱动程序在请求 Secret 时要通信的提供程序。下表显示了 Apigee Hybrid 预期的文件名 (objectNames
):Secret 预期的 Secret 文件名 AX 哈希盐 ax-hash-salt
Redis redis-password
组织加密密钥 kmsEncryptionKey
kvmEncryptionKey
contractEncryptionKey
环境加密密钥 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
命名空间: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 图表,以应用更改:helm upgrade ENV_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --set env=ENV_NAME \ -f overrides.yaml
- 在
回滚
AX 哈希盐
- 在
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
文件中,移除为环境加密密钥启用外部 Secret 使用的配置:envs: - name: ENV_NAME # Comment out or delete the following line: # encryptionKeySecretProviderClass: apigee-envencryptionkeys-spc
- 为每个环境升级一次
env
Helm 图表,以应用更改: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