我正在开发使用Firebase身份验证和GCP Pubsub的Android应用(Java)。要连接到Pubsub,我目前使用服务帐户密钥,该帐户存储在项目的JSON文件中。但这在生产环境中似乎并不安全,因为它公开了我的密钥。
那么在这种情况下的最佳做法是什么?
我虽然想将类似令牌的内容链接到Firebase用户帐户,但是我不知道如何执行此操作,而Google的此文档表明我应该使用服务帐户,因为我不这样做需要访问特定于用户的信息。
我正在开发使用Firebase身份验证和GCP Pubsub的Android应用(Java)。要连接到Pubsub,我目前使用服务帐户密钥,该帐户存储在项目的JSON文件中。但这在生产环境中似乎并不安全,因为它公开了我的密钥。
那么在这种情况下的最佳做法是什么?
我虽然想将类似令牌的内容链接到Firebase用户帐户,但是我不知道如何执行此操作,而Google的此文档表明我应该使用服务帐户,因为我不这样做需要访问特定于用户的信息。
您是对的-分发服务帐户密钥并不安全。即使仅使用最小的Pub/Sub Publisher
role,这也将允许拥有密钥副本的任何人将所需的数据注入Pubsub(向您收费),并取决于您的订阅者如何使用如此提供的数据可能会在订户的侧面打开攻击面。同样,您需要计划旋转钥匙时的操作。我不建议您采用这种方法。
鉴于您并未在应用程序本身中包含密钥,因此您可以找到一种方法来在受控服务器环境中执行某项操作,该服务器环境还可以访问服务帐户凭据。
一个选择是您可以创建一个Callable Cloud Function来执行Pubsub操作。云功能可以安全地驻留在Google的服务器上,并且可以作为服务帐户运行而没有问题。然后将从您的应用程序中调用它。
在函数内部,您需要验证请求是否被允许(因为该函数仍然可以被任何人调用-他们实际上是公开的),然后执行Pubsub操作。验证可能涉及使用该应用检查用户的身份验证,检查该应用的格式是否正确,甚至可能实施某种形式的速率限制。实际上,这可能是一个非常轻量级的功能。
即使使用最少的请求验证,这仍然限制了调用者完全执行已编写的功能,而不是完全访问服务帐户,从而将攻击面最小化到基本上与代码上的任何交互都没有可能是一个Web服务器,它允许您在将输入注入Pubsub之前验证输入是否有效-这样可以保护所有下游使用者。
,基本问题是如何管理用于服务器到服务器或应用程序到应用程序通信的服务帐户密钥。以下是来自Google云的recommendation。
Google建议强制实施IAM策略以限制/管理访问。