GCP客户端工具的最佳身份验证策略



我想用python构建一个客户端gcp工具。

我想避免通过subprocess调用glcoud工具,所以我选择了sdk客户端库调用。

根据文档以及这篇非常全面的文章,auth有两个选项:

a) 使用应用程序默认凭据(即gcloud在后台使用的凭据)

b) 使用服务帐户并将应用指向对应的CCD_ 4文件。

我已经尝试了(a),并得到以下警告:

UserWarning:您的应用程序已使用最终用户进行身份验证来自Google Cloud SDK的凭据。我们建议大多数服务器应用程序转而使用服务帐户。如果您的申请继续使用Cloud SDK中的最终用户凭据,您可能收到"配额超出"或"API未启用"错误。了解更多信息有关服务帐户的信息,请参阅https://cloud.google.com/docs/authentication/
warnings.WARNING(_CLOUD_SDK_CREDTIALS_WARNING)

如果我使用应用程序默认信誉,这会很容易,因为应用程序将分发给每个最终用户,这个.json文件将成为他/她的身份验证过程的真实来源。但是,应用程序可能会遇到上述quota exceeded错误。

在另一种情况下,(服务帐户特定凭据)我认为我必须向每个开发人员提供指示,以发布一个json文件,该文件对应于与他/她的权限完全相同的服务帐户。更新过程如何?每次用户被分配/撤销某些权限时会发生什么?这个json是如何保持同步的?

如有任何建议,我们将不胜感激。

有几种类型的应用程序默认凭据(ADC):用户帐户和服务帐户及其变体。问题中的警告消息表示您使用用户帐户凭据(gcloud auth login)设置了SDK CLI。我建议切换到服务帐户凭据。

此命令将使用服务帐户设置CLI。您将需要您的项目ID和服务帐户JSON文件。

gcloud auth activate-service-account test@PROJECT_ID.iam.gserviceaccount.com --key-file=service_account.json

我写了一篇文章,详细介绍了如何设置CLI:

使用服务帐户凭据设置Gcloud

为什么谷歌会给你一个警告:

  • 授权用户凭据需要在谷歌的后端服务上付出更多努力
  • 用户帐户凭据需要人工交互才能创建
  • 刷新令牌通常由客户端或后端的软件存储。这就造成了一个安全漏洞
  • 软件应使用具有有限权限(作用域)的机器对机器身份验证。对于正在进行的API调用,颁发的用户凭据通常具有过多的权限。这又是一个安全问题
  • 谷歌决定,用户凭据将不被允许具有访问许多谷歌云平台服务所需的范围。在创建OAuth客户端时,这一点非常明显,并且您会收到关于验证的重大警告。存在strong风险谷歌将停止允许云服务的用户凭据。最好使用服务帐户的支持和官方方法,以后不要面对这个问题

但是,鉴于以上详细信息,您的用例将为用户提供凭据。这不是一个好主意。我会继续使用用户凭据与您的网络前端对话。您的web前端使用用户从未见过的服务帐户,并提供最终服务(API)访问。

[更新]

我刚刚注意到您的评论,您正在开发自己的CLI。如果没有关于此CLI将访问哪些项目/服务的更多详细信息,您可以考虑使用与向用户发出访问令牌的服务对话的用户凭据。此令牌的有效期仅为一小时。您可以支持在代码中刷新此令牌。这使您能够使用用户身份验证,控制服务帐户的使用,并且仍然保持良好的安全性。请注意,我试图引导您不要将服务帐户文件直接分发给用户。如果这些用户是您自己的员工,那么问题就小了。对于不受你控制的人,要仔细考虑。

[结束更新]

我会尽力为你的问题提供细节和建议。在为你决定最佳策略时,一定要考虑我之前的评论。

在另一种情况下,(服务帐户特定凭据)我假设我必须向每个开发人员提供指令以发布json与具有完全相同的服务帐户相对应的文件他/她的许可。

如果我要编写一个使用服务帐户凭据的应用程序,我会创建一个加载/安装凭据的方法。只需提供一个文件并告诉他们在程序中执行此步骤。但是,您有一个问题。向所有用户分发相同的服务帐户不是一个好主意。你如何处理撤销等?谷歌云平台服务帐户的设计并不是每个项目唯一分配给几十个或数百个用户。

更新过程如何?

服务帐户凭据JSON密钥文件不会过期。从服务帐户创建的令牌确实会过期,但这是由谷歌客户端库或您自己的代码管理的,以自动刷新它们。

每次用户被分配/撤销某些权限时会发生什么?这个JSON是如何保持同步的?

服务帐户文件不包含权限。这些存储在Google Cloud IAM中。一旦修改了分配给服务帐户的角色,它们将在几分钟内透明地全局应用。

如果只希望以交互方式使用该工具(例如替换gcloud),那么使用默认凭据可能很好,因为使用率很低。

也就是说,无论是在控制台中还是通过gcloud,为服务帐户创建密钥都是一个非常简单的操作,API使使用密钥变得相当容易——基本上就是设置一个GOOGLE_APPLICATION_CREDENTIALS环境变量。请参阅本页的更多信息。使用服务帐户还可以准确地分配所需的角色,而不是使用用户帐户可能拥有的广泛权限进行操作,这降低了代码在执行不该执行的操作时出错的可能性。

最新更新