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

时间:2019-10-13 19:10:59

标签: api authentication google-cloud-platform google-cloud-iam

我想在python中构建客户端gcp工具。

我想避免通过glcoud来调用subprocess工具,因此我选择了sdk client library调用。

根据文档也是this非常全面的文章,auth有两种选择:

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

b)使用服务帐户并将应用程序指向相应的.json文件。

我已经尝试过(a)并收到以下警告:

  

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

如果我使用应用程序默认凭据,这将很容易,因为将向该应用程序分发的每个最终用户都将这个.json文件作为其身份验证过程的真实来源。但是,该应用可能会遇到上述quota exceeded错误。

在另一种情况下,(特定于服务帐户的凭据)我假设我必须向每个开发人员提供说明,以发出与服务帐户具有与他/她完全相同的权限的json文件。那更新过程呢?每次为用户分配/撤消某些权限时会发生什么?这个json如何保持同步?

任何对此的建议将不胜感激。

2 个答案:

答案 0 :(得分:4)

应用程序默认凭据(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:

Setting up Gcloud with Service Account Credentials

为什么Google会警告您

  • 授权用户凭据需要在Google的后端服务上付出更多的努力。
  • 用户帐户凭据需要人工交互才能创建。
  • 刷新令牌通常由软件存储在客户端或后端上。这会创建一个安全漏洞。
  • 软件应使用具有有限权限(范围)的机器对机器身份验证。通常,向用户凭据颁发的API调用权限过多。这又是一个安全问题。
  • Google已决定不允许用户凭据具有访问许多Google Cloud Platform服务所需的范围。创建OAuth客户端时,这非常明显,并且您会收到有关验证的重大警告。 Google将有强大的风险,它将停止允许用户使用云服务的凭据。最好使用服务帐户的受支持的官方方法,并且以后不要再遇到此问题。

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

[更新]

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

[END UPDATE]

我将尝试提供有关您的问题的详细信息和建议。在确定最适合您的策略时,请考虑我以前的评论。

  

在另一种情况下,(假定服务帐户专用凭据)我   将必须向每个开发人员提供说明以发出json   与完全相同的服务帐户对应的文件   他/她的权限。

如果我要编写一个使用服务帐户凭据的应用程序,我将创建一种方法来加载/安装凭据。只需提供一个文件,并告诉他们在程序中执行此步骤即可。但是,您有一个问题。将相同的服务帐户分配给所有用户不是一个好主意。您如何处理吊销等?并非将Google Cloud Platform服务帐户设计为唯一地分配给每个项目的几十或数百个用户。

  

那更新过程如何?

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

  

每次为用户分配/撤消某些权限时会发生什么?   该JSON如何保持同步?

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

答案 1 :(得分:1)

如果仅预期该工具可以交互使用(例如替换gcloud),则使用默认凭据可能会很好,因为使用率较低。

也就是说,为服务帐户创建密钥是在控制台中或通过gcloud进行的相当简单的操作,并且API使之reasonably easy to consume the key –您基本上设置了GOOGLE_APPLICATION_CREDENTIALS环境变量。在this page中查看更多信息。使用服务帐户还可以使您准确地分配所需的角色,而不是使用用户帐户可能具有的广泛权限进行操作,并且这减少了在代码执行不应执行的操作时出错的可能性。