0

我正在尝试使用 Google 的首选“工作负载身份”方法来使我的 GKE 应用程序能够安全地访问来自 Google Secrets 的秘密。

我已经完成了设置,甚至检查了故障排除部分(https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity?hl=sr-ba#troubleshooting)中的所有步骤,但我我的日志中仍然出现以下错误

未处理的异常。Grpc.Core.RpcException: Status(StatusCode=PermissionDenied, Detail="Permission 'secretmanager.secrets.list' 拒绝资源 'projects/my-project' (或者它可能不存在)。")

我认为问题是由于节点池没有使用正确的服务帐户,所以我重新创建了它,这次指定了正确的服务帐户。

服务帐号添加了以下角色:

  • 云构建服务
  • 帐户 Kubernetes Engine 开发人员
  • 容器注册服务代理
  • 秘密经理秘密访问者
  • 秘密经理查看器

我用来认证的包的相关源码如下:

var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

var request = new ListSecretsRequest
{
    ParentAsProjectName = ProjectName.FromProject(projectName),
};

var secrets = secretManagerServiceClient.ListSecrets(request);
foreach(var secret in secrets)
{
    var value = secretManagerServiceClient.AccessSecretVersion($"{secret.Name}/versions/latest");
    string secretVal = this.manager.Load(value.Payload);
    string configKey = this.manager.GetKey(secret.SecretName);
    data.Add(configKey, secretVal);
}
Data = data;

参考。https://github.com/jsukhabut/googledotnet

我错过了这个过程中的一步吗?

知道为什么 Google 仍然说“资源 'projects/my-project' 的权限 'secretmanager.secrets.list' 被拒绝(或者它可能不存在)吗?”

4

1 回答 1

3

就像评论中提到的@sethvargo 一样,您需要将服务帐户映射到您的 pod,因为Workload Identity不使用底层节点身份,而是将 Kubernetes 服务帐户映射到 GCP 服务帐户。一切都发生在工作负载身份中的每个 pod 级别。

Kubernetes 服务帐户分配给应用程序并将其配置为充当 Google 服务帐户。

1.创建具有所需权限的 GCP 服务帐户。

2.创建一个Kubernetes服务账号。

3.分配 Kubernetes 服务帐号权限以模拟 GCP 服务帐号。

4.以 Kubernetes 服务帐户运行您的工作负载。

希望您在项目或秘密中使用项目 ID 而不是项目名称。

您无法更新已创建 pod 的服务帐户。

请参阅链接以将服务帐户添加到 pod。

于 2021-06-18T11:53:34.863 回答