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

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

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

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

根据文档也是 this非常全面的文章,有两种身份验证选项:

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

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

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

UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a "quota exceeded" or "API not enabled" error. For more information about service accounts, see https://cloud.google.com/docs/authentication/
warnings.warn(_CLOUD_SDK_CREDENTIALS_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:

Setting up Gcloud with Service Account Credentials

Google 为何向您发出警告:

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

但是,鉴于上述详细信息,您的用例是为您的用户提供凭据。这不是一个好主意。我会继续使用用户凭据与您的网络前端交谈。您的 Web 前端使用用户永远不会看到的服务帐户并提供最终服务 (API) 访问权限。

[更新]

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

[结束更新]

我会尽力针对您的问题提供详细信息和建议。在为您决定最佳策略时,请务必考虑我之前的评论。

In the other case, (service account specific credentials) I assume I will have to provide instructions to each developer to issue a json file that corresponds to a service account with the exact same permission as his/hers.

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

And what about the update process?

服务帐户凭据 JSON key 文件不会过期。从服务帐户创建的 token 确实会过期,但这由 Google 客户端库管理或在您自己的代码中自动刷新它们。

What happens each time a user gets assigned/revoked some permissions? How this JSON stay in sync?

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

关于api - GCP 客户端工具的最佳身份验证策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58366923/

相关文章:

authentication - 我可以使用带有额外 header 的 git-tfs 吗?

reactjs - 在 NextAuth 中,是什么触发了到 "/api/auth/signout"的路由?

google-cloud-platform - 从通过数据存储导出创建的数据存储备份中导入特定种类

google-cloud-platform - Google 容器引擎的自动缩放

android - java.lang.NoClassDefFoundError : io. reactivex.Observable

javascript - 是否有一个 javascript API 可以根据 ISBN 获取书籍摘要?

javascript - 无需后端的用户认证

python - 如何在 pysimplegui 中刷新窗口以显示新图像

ruby-on-rails - 如何在 Rails 的 json_response 中显示所有关联项

google-cloud-platform - 可以在没有外部 IP 的情况下连接到 Compute Engine 吗?