使用GKE中的工作负载身份访问服务帐户密钥json

时间:2020-11-11 21:02:00

标签: .net-core google-cloud-platform google-cloud-firestore google-kubernetes-engine

我们正在尝试解决将工作秘密替换为机密的问题。下面是更多详细信息。

我们正在从部署在Google kubernetes引擎中的点网核心网络api访问firestore和pubsub。我们正在为具有所有服务帐户密钥的appsettings json使用一个秘密,此秘密被安装到路径中的部署容器上,并且在代码中,我们通过使用秘密json的卷安装路径注入appsettings来访问配置作为配置提供者。我们使用json服务帐户密钥来创建firestore生成器和pubsub通道凭据,如下所示。

使用服务帐户json键的API代码如下所示:

Pubsub

_chanelCreds = GoogleCredential.FromJson(_pubSubSAJsoKey).ToChannelCredentials();

Firestore

_firestoreDb =新的FirestoreDbBuilder { ProjectId = projectId, JsonCredentials = fireStoreServiceAccountJsonKey } .Build();

访问Program.cs中的秘密配置:

公共静态IHostBuilder CreateHostBuilder(string [] args)=>

        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddJsonFile("**/secrets/api.secrets.json**").Build();
                });
                webBuilder.UseStartup<Startup>();
            });

部署Yaml的一部分

    volumeMounts:
    - name: appsettingssecret
      mountPath: /secrets
      readOnly: true
  volumes:
  - name: appsettingssecret
    secret:
      secretName: appsettingssecret

现在我们必须切换到工作负载身份,但是我们不确定如何在工作负载身份中处理多个服务帐户,并且在代码中我们还需要服务帐户的json密钥,以便确定如何从工作负载身份中检索密钥。 / p>

提前谢谢!

1 个答案:

答案 0 :(得分:2)

我绝对不是.Net开发人员,但我可以提供有关工作负载身份的帮助。

首先,一些概念。 GKE上的工作负载标识创建一个拦截器。当客户端库(Google Auth,PubSub或其他)尝试访问metadata server以获取凭据时,请求将被拦截,并根据定义的服务帐户生成凭据。

因此,您必须使用ADC mechanism (Application Default Credential)。不要指定任何服务帐户密钥文件,而是让库根据环境上下文自动查找正确的凭据。

如果您查看.Net PubSub client library documentation,就永远不会看到带有服务帐户密钥文件的身份验证,它使用ADC。 Firestore

也是如此

那是为了验证您的代码。现在,如何处理几个服务帐户。

Workload identity documentation上,您将看到如何在名称空间上创建KSA,以及如何将此KSA与GSA绑定。因此,您只需要在名称空间上定义多个KSA,然后add the correct KSA name in your deployment configuration