【问题标题】:How to securely use GCP service account from an Android app?如何从 Android 应用安全地使用 GCP 服务帐户?
【发布时间】:2020-03-03 12:19:55
【问题描述】:

我正在开发一个使用 Firebase 身份验证和 GCP Pubsub 的 Android 应用 (Java)。为了连接到 Pubsub,我目前使用存储在我的项目的 JSON 文件中的服务帐户密钥。但这在生产环境中似乎并不安全,因为它暴露了我的密钥。

那么在这种情况下最好的做法是什么?

我虽然想要将令牌之类的东西链接到 Firebase 用户帐户,但我不知道如何做到这一点,而且 Google 的这份文档表明我应该在我的情况下使用服务帐户,因为我没有需要访问用户特定的信息。

https://cloud.google.com/docs/authentication/

【问题讨论】:

    标签: android firebase google-cloud-platform firebase-authentication service-accounts


    【解决方案1】:

    您是对的 - 分发服务帐户密钥并不安全。即使只有最小的Pub/Sub Publisherrole,这将允许任何拥有密钥副本的人将他们想要的数据注入 Pubsub(向您收费),并取决于您的订阅者如何使用由此提供的数据,它可能会在您的订阅者方面打开一个攻击面。同样,您需要计划在需要轮换密钥时要做什么。我不建议您采用这种方法。

    鉴于您没有将密钥包含在应用程序本身中,您只能找到一种方法在受控服务器环境中执行某些操作,该环境还可以访问服务帐户凭据。

    一个选项是您可以创建一个Callable Cloud Function 来执行 Pubsub 操作。云功能将安全地驻留在 Google 的服务器上,并且可以作为服务帐户运行,这没有问题。然后将从您的应用程序中调用它。

    在函数内部,您需要验证请求是否被允许(因为该函数仍然可以被任何人调用——他们实际上是公开的),然后执行 Pubsub 操作。验证可能涉及检查使用应用程序的用户的身份验证,检查应用程序是否格式正确,甚至可能实施某种形式的速率限制。这在实践中可能是一个非常轻量级的函数。

    即使使用最少的请求验证,这仍然会限制调用者完全按照编写函数的方式执行操作,而不是完全访问服务帐户,这将攻击面最小化到基本上与代码的任何交互Web 服务器可能是,它允许您在将输入注入 Pubsub 之前验证输入是否有效——从而保护所有下游消费者。

    【讨论】:

    • 是的,但与直接链接到 pub-sub 相比,云功能会花费很多(每次调用的价格)。
    • 它的所有权衡 - 释放服务帐户密钥也将是昂贵的(考虑到滥用的可能性,以及快速更改它的难度,如果它被包含)。您需要密钥才能访问 Pubsub API。据推测,这个函数将是轻量级的(它只是进行验证和 pubsub 调用),并且在 RAM 或 CPU 方面实际执行不会非常昂贵。您也可以将其与只运行一个服务器来处理请求进行比较。
    【解决方案2】:

    基本问题是如何管理用于服务器到服务器或应用程序到应用程序通信的服务帐户密钥。以下是来自 Google 云的一些recommendation

    Google 建议强制实施 IAM 政策来限制/管理访问。

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 2020-05-12
      • 2020-11-05
      • 1970-01-01
      • 2020-06-18
      • 2020-05-07
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多