GKE Workload Identity PermissionDenied

GKE Workload Identity PermissionDenied

我正在尝试使用 Google 首选的“Workload Identity”方法来使我的 GKE 应用能够安全地访问来自 Google Secrets 的机密。

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

Unhandled exception. Grpc.Core.RpcException: Status(StatusCode=PermissionDenied, Detail="Permission 'secretmanager.secrets.list' denied for resource 'projects/my-project' (or it may not exist).")

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

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

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

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' 被拒绝(或者它可能不存在)吗?”

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

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

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

2.Create 一个 Kubernetes 服务帐户。

3.Assign Kubernetes服务账号权限模拟GCP 服务帐号。

4.Run 您作为 Kubernetes 服务帐户的工作负载。

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

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

参考 link 将服务帐户添加到 pods。