在 Apigee Hybrid 中选择服务账号身份验证方法
Apigee Hybrid 需要服务账号才能与 Google Cloud 服务进行安全通信。您需要为这些服务账号选择一种符合您的安全和运维要求的身份验证方法。本指南简要概述了可用的选项。
了解服务账号身份验证
Apigee Hybrid 使用 Google Cloud 服务账号对 Kubernetes 集群中运行的组件进行身份验证和授权。这些服务账号可访问 Cloud Storage 存储桶和 Cloud Logging 等 Google Cloud 资源。每个服务账号都需要特定的 Identity and Access Management (IAM) 角色才能履行其职责。
身份验证方法选项
Apigee Hybrid 支持多种服务账号身份验证方法。每种方法管理服务账号密钥的方式各不相同,提供了不同级别的安全性和操作复杂性。 在选择方法时,请考虑您的平台、安全状况和现有基础设施。
下表总结了可用的身份验证方法:
| 方法 | 密钥存储位置 | 平台兼容性 | 密钥管理 |
|---|---|---|---|
| Kubernetes Secret | Kubernetes 集群 Secret | 任何 Kubernetes 平台 | Kubernetes 管理 Secret,手动轮替 |
| 服务账号 JSON 密钥文件 | 本地文件系统 | 任何 Kubernetes 平台 | 手动轮替和分发 |
| 保险柜 | HashiCorp Vault | 任何 Kubernetes 平台 | Vault 管理 Secret,手动轮替 |
| Workload Identity Federation for GKE | Google Cloud IAM | Google Kubernetes Engine (GKE) | 由Google Cloud 管理,无需密钥文件 |
| 其他平台上的工作负载身份联合 | Google Cloud IAM | AKS、EKS、OpenShift 或其他 Kubernetes 平台 | 由Google Cloud 管理,无需密钥文件 |
在 Kubernetes Secret 中存储服务账号密钥
将服务账号密钥作为 Kubernetes Secret 存储在集群中。此方法利用了 Kubernetes 中的内置 Secret 管理功能。 与直接存储在文件中的密钥相比,Kubernetes Secret 可以提供更安全的密钥管理方式。不过,您仍然需要手动管理密钥轮替。
Hybrid 组件会使用 overrides.yaml 文件中的 serviceAccountRef 和 envs[].serviceAccountRefs 属性来引用这些 Secret。
Kubernetes 会负责将这些 Secret 分发给相应 Pod。
例如:
logger: serviceAccountRef: "my-project-apigee-logger-key"
如需使用此方法,请参阅在 Kubernetes Secret 中存储服务账号密钥。
服务账号 JSON 密钥文件
此方法需要为每个服务账号创建一个 JSON 密钥文件,并将这些文件直接存储在文件系统上。这种方法可简化初始设置。不过,您需要确保该文件系统的安全性。密钥轮替需要手动进行。
请将每个服务账号的私钥 JSON 文件存放在一个 Apigee Hybrid 组件可访问的目录中。您可使用 serviceAccountPath 和 envs[].serviceAccountPaths 属性在 overrides.yaml 配置中引用这些文件的路径。
例如:
logger: serviceAccountPath: "my-project-apigee-logger.json"
您可以使用 Apigee Hybrid 提供的 create-service-account 工具生成并下载服务账号密钥文件。如需了解详情,请参阅 create-service-account。
在 Vault 中存储服务账号密钥
集成 HashiCorp Vault 来管理您的服务账号密钥。Vault 提供了强大的 Secret 管理解决方案,可提供动态 Secret 生成、审核和自动化密钥轮替等功能。您需要设置和维护 Vault 实例。
您需要为组织级和环境级组件分别创建 Vault Secret、政策和角色。您可使用 serviceAccountSecretProviderClass 和 envs[].serviceAccountSecretProviderClass 属性在 overrides.yaml 配置中引用这些 Secret。
例如:
serviceAccountSecretProviderClass: apigee-orgsakeys-spc envs: - name: my-env serviceAccountSecretProviderClass: apigee-envsakeys-my-env-spc
Workload Identity Federation for GKE
借助 Workload Identity Federation for GKE,Kubernetes 服务账号可以充当 Google Cloud服务账号。此方法完全无需使用服务账号密钥文件。相反,GKE 集群会直接使用Google Cloud IAM 对工作负载进行身份验证。Workload Identity Federation for GKE 提供了一种高度安全且自动化的身份验证机制,可简化密钥管理。此方法仅适用于 GKE 集群。
此方法要求将每个 Kubernetes 服务账号绑定到特定的 Google Cloud 服务账号。在安装 Apigee Hybrid Helm 图表时,Apigee Hybrid 安装过程会创建特定于您的安装的 Kubernetes 服务账号。当您为每个图表运行带有 --dry-run 标志的 helm install 或 helm upgrade 命令时,输出将包含用于将 Kubernetes 服务账号绑定到相应图表中特定 Apigee Hybrid 组件的 Google Cloud 服务账号的命令。
您可以使用 gcp.workloadIdentity.enabled 属性在 overrides.yaml 文件中启用 Workload Identity Federation for GKE。
例如:
gcp: projectID: my-project region: us-west1 workloadIdentity: enabled: true
请参阅启用 Workload Identity Federation for GKE。
在 GKE 以外的平台上使用工作负载身份联合
借助工作负载身份联合,可以将 Workload Identity Federation for GKE 的优势扩展到 Google Cloud之外运行的 Kubernetes 集群,例如 Azure Kubernetes Service (AKS)、Amazon Elastic Kubernetes Service (EKS) 或 OpenShift。此方法让您的非 GKE 集群能够使用集群的 OIDC 提供方向 Google Cloud 进行身份验证,从而在集群的身份提供方与 Google Cloud之间配置信任关系。初始设置完成后,此方法无需使用服务账号密钥文件。
您可以将工作负载身份联合与以下项搭配使用:
- 凭证配置文件(代替服务账号密钥文件)
- Kubernetes Secret
- 保险柜
如要使用工作负载身份联合,您需要为每个 Google Cloud 服务账号创建凭证配置文件。您可以使用这些文件来代替服务账号密钥文件,或者如果您要使用 Kubernetes Secret 或 Vault,也可以进行相应设置。
您可以在 overrides.yaml 文件中使用 gcp.federatedWorkloadIdentity.enabled、gcp.federatedWorkloadIdentity.audience 和 gcp.federatedWorkloadIdentity.credentialSourceFile 属性启用工作负载身份联合。
例如:
gcp: projectID: my-project region: us-west1 federatedWorkloadIdentity: enabled: true audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider" credentialSourceFile: "/var/run/service-account/token"
请参阅启用工作负载身份联合。
选择身份验证方法
根据您的部署环境和安全要求选择身份验证方法。
- 对于 GKE 部署,Workload Identity Federation for GKE 提供了一种安全且简便的方法;它使您无需直接管理服务账号密钥文件。
- 对于非 GKE Kubernetes 部署(AKS、EKS、OpenShift),工作负载身份联合提供了类似的无密钥身份验证体验。 对于这些环境,建议选择此方法。
- 如果“Workload Identity Federation for GKE”或“工作负载身份联合”不可用,可考虑使用 Vault 来实现集中式密钥管理和自动化。
- 对于较简单的部署或缺少 Vault 设置的情况,可将密钥存储在 Kubernetes Secret 中,这是一种原生 Kubernetes 解决方案。与将密钥直接存储在文件中相比,此方法可提供更高的安全性。
- 直接服务账号密钥文件适用于初始测试或无法使用其他方法的环境。但是,此方法需要谨慎的手动密钥管理和轮替。
后续步骤
- 继续规划和准备:保障端口使用安全。
- 详细了解 Apigee Hybrid 中的服务账号:服务账号简介。
- 安装 Apigee Hybrid:第 1 部分,项目和组织设置:概览。