作为我们解决方案的一部分,我们希望在每个客户站点部署一个FCM"应用服务器"。每个客户站点都有自己的用户,使用我们的应用程序使用自己的设备。但是,我们希望确保如果其中一个客户站点遭到入侵,攻击者无法滥用 FCM"应用服务器"(例如,通过向所有客户站点的所有设备发送通知)。
我们不是在所有客户站点之间共享凭据,而是考虑为每个客户站点生成唯一的服务器密钥。这样,如果一个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送任何更多的 FCM 通知。
问:我们能否确定攻击者无法向所有设备发送全局通知?
- 假设攻击者拥有服务器密钥并可以访问一个客户站点"app-server",他们能否获得所有已注册设备的列表?
- 是否有发送到所有设备的默认通知"主题"?(例如/topic/all 或/topic/global)。如果是这样,我们可以禁用该默认主题吗?
所有客户站点之间共享凭据,而是考虑为每个客户站点生成唯一的服务器密钥。这样,如果一个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送任何更多的 FCM 通知。
如果"我们正在考虑为每个客户站点生成唯一的服务器密钥",则意味着您只需为每个客户站点创建一个Firebase项目,那么我认为这是正确的方法。
我们能确定攻击者无法向所有设备发送全局通知吗?
应用可以通过实现将为每个发件人生成不同令牌的getToken(authorizedEntity, scope)
来接收来自不同发件人的消息。为了否定此操作,您可以简单地调用deleteToken(authorizedEntity, scope)
(我的参考)。
这将使相应发件人的令牌无效(这是他们可能拥有的令牌,并且应该是其应用程序服务器上的唯一令牌),这将自动禁用他们接收到您的应用程序的消息。
因此,只要您能够将它们作为有效发件人从您的应用程序中删除,那么一切都很好。
假设攻击者拥有服务器密钥并可以访问一个客户站点"app-server",他们能否获得所有已注册设备的列表?
这取决于应用服务器的实现方式。如果客户的应用服务器仅用于发送消息,但令牌存储在其他位置,则可能没有。没有 API 可以在服务器端检索基于服务器密钥的应用程序的注册令牌(请参阅此处的 #1)。
是否有发送到所有设备的默认通知"主题"?(例如/topic/all 或/topic/global)。如果是这样,我们可以禁用该默认主题吗?
没有。您可以选择通过 Firebase 通知控制台向特定应用发送通知,但如果应用未授权与该项目对应的发件人 ID,则不会收到来自该项目的任何消息。我在发布之前已经测试了这种行为,所以我肯定这就是它的工作原理。
无法将服务器密钥限制为仅允许某些主题/设备/等。
我会考虑使用Cloud Functions for Firebase以不同的方式解决这个问题。您可以构建一个 HTTPS 函数,该函数采用每个站点的授权令牌(通过您认为合适的任何方式),然后该函数通过 Firebase 云消息传递来实际发送推送通知。
这样,您可以完全控制"客户端"站点可以发送的推送通知类型,并且不必担心在客户端站点遭到入侵时会出现级联安全问题。