如何从Android应用程序安全地使用GCP服务帐户?

如何从Android应用程序安全地使用GCP服务帐户?,android,firebase,google-cloud-platform,firebase-authentication,service-accounts,Android,Firebase,Google Cloud Platform,Firebase Authentication,Service Accounts,我正在开发一个使用Firebase身份验证和GCP Pubsub的Android应用程序(Java)。要连接到Pubsub,我当前使用的服务帐户密钥存储在项目中的JSON文件中。但这在生产环境中似乎并不安全,因为它公开了我的密钥 那么,在这种情况下,最佳做法是什么 我想让一个令牌之类的东西链接到Firebase用户帐户,但我不知道如何做到这一点,谷歌的这篇文档表明我应该在我的案例中使用服务帐户,因为我不需要访问特定于用户的信息 你说得对——分发服务帐户密钥是不安全的。即使只有最小的Pub/Sub

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

那么,在这种情况下,最佳做法是什么

我想让一个令牌之类的东西链接到Firebase用户帐户,但我不知道如何做到这一点,谷歌的这篇文档表明我应该在我的案例中使用服务帐户,因为我不需要访问特定于用户的信息

你说得对——分发服务帐户密钥是不安全的。即使只有最小的
Pub/Sub发行商
,这也将允许任何拥有密钥副本的人向Pubsub注入他们想要的数据(向您计费),并且取决于您的订阅者如何使用由此提供的数据,这可能会在订阅者一侧打开攻击面。同样,如果需要旋转关键点,您也需要计划要执行的操作。我不建议你采取这种方法

考虑到应用程序本身没有包含密钥,您只能在一个受控的服务器环境中找到一种方法,该环境也可以访问服务帐户凭据

一个选项是,您可以创建一个用于执行Pubsub操作的。云功能将安全地驻留在谷歌的服务器上,并可以作为一个服务帐户运行。然后将从您的应用程序中调用它

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


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

基本问题是如何管理用于服务器到服务器或应用到应用通信的服务帐户密钥。下面是一些来自谷歌云的信息


谷歌建议强制实施IAM策略来限制/管理访问。

是的,但与直接链接到pub-sub相比,云功能的成本(每次调用的价格)会很高。这是一个折衷方案——发布服务帐户密钥也会很昂贵(考虑到可能会被滥用,并且很难快速更改它。您需要访问Pubsub API的密钥。据推测,此函数将是轻量级的(它只是执行验证和Pubsub调用)从RAM或CPU的角度来看,实际执行不会非常昂贵。您也可以将其与全职运行服务器来处理请求进行比较。