FCM安全性:防止多个发送器向所有设备推送通知?

3
作为我们解决方案的一部分,我们希望在每个客户现场部署一个FCM“应用服务器”。每个客户现场都有自己的用户,他们使用我们的应用程序拥有自己的设备。但是,我们希望确保如果其中一个客户现场遭到攻击,则攻击者不能滥用FCM“应用服务器”(例如向所有客户现场的所有设备发送通知)。
我们计划为每个客户现场生成一个唯一的服务器密钥,而不是在所有客户现场之间共享凭据。这样,如果一个客户现场遭到攻击,我们可以禁用该服务器密钥,并停止发送任何更多的FCM通知。
问题:我们能确定攻击者无法向所有设备发送全局通知吗?
- 假设攻击者拥有一个服务器密钥并访问一个客户现场“应用服务器”,他们能获得所有已注册设备的列表吗? - 是否有一种默认的通知“主题”会发送到所有设备?(例如/topic/all或/topic/global)。如果有,我们能否禁用该默认主题?

“服务器密钥”是什么意思?在FCM中如何使用它? - camden_kid
服务器密钥用于“应用服务器”与FCM连接服务器进行身份验证。这里有更多细节:https://firebase.google.com/docs/cloud-messaging/server - user1727021
1
我以为那就是你的意思,但是一个 Firebase 账户怎么可能有多个服务器密钥呢?据我所知只有一个。 - camden_kid
很奇怪我也看到过这种说法。不过,我们绝对可以添加多个服务器密钥。以下是步骤:1. 前往 Firebase 控制台 https://console.firebase.google.com 2. 点击左上角的齿轮图标 3. 点击“项目设置” 4. 点击“云消息传递”选项卡 5. 注意,在第一部分“项目凭据”下方有一个大蓝色按钮“添加服务器密钥”这似乎就可以解决问题了,或者也许我对多个服务器密钥的功能或交互有什么误解。 - user1727021
我还没有尝试过,但是在生成的服务器密钥(也称为“服务器令牌”)之间没有明显的区别,当我去删除其中一个时。我刚在文档中发现,每个(客户站点)“应用程序服务器”应该有不同的_sender id_和_server key_。然而,根据文档从多个发送者接收消息,有100个发送者的限制,这对我们来说是不可接受的。 - user1727021
显示剩余2条评论
2个回答

2
“我们正在考虑为每个客户网站生成一个唯一的服务器密钥,而不是在所有客户网站之间共享凭据。这样,如果一个客户网站被攻击,我们可以禁用该服务器密钥,并停止发送任何更多的 FCM 通知。” 如果您说“我们正在考虑为每个客户网站生成一个唯一的服务器密钥”,意思是您将为每个客户网站创建一个 Firebase 项目,那么我认为这是正确的方法。
“我们能确定攻击者无法向所有设备发送全局通知吗?” 应用程序可以通过实现 getToken(authorizedEntity,scope)从不同的 Sender 接收消息,这将为每个 Sender 生成不同的令牌。为了取消此操作,您可以简单地调用 deleteToken(authorizedEntity,scope)(my reference)。
这将使相应的 Sender 的令牌无效(他们可能拥有并且应该是他们 App Server 上唯一的令牌),这将自动禁用它们接收到您的应用程序的消息。

只要您能够从应用程序中将它们作为有效发送方移除,那么就可以了。

假设攻击者拥有服务器密钥并可以访问一个客户站点“app-server”,他们能否获取所有注册设备的列表?

这取决于App Server的实现方式。如果客户的App服务器仅用于发送消息,但令牌存储在其他地方,则可能不行。没有API可用于基于服务器密钥(请参见此处的#1)检索应用程序的注册令牌。

是否有一个默认的通知“主题”可发送到所有设备?(例如/topic/all或/topic/global)。如果是这样,我们是否可以禁用该默认主题?

没有这个选项。有通过Firebase Notifications控制台向特定应用程序发送通知的选项,但如果该应用程序未授权与该项目对应的Sender ID,则不会收到任何来自它的消息。在发布之前,我测试过这种行为,所以我确定它是如何工作的。


回复:“…为每个客户网站创建一个Firebase项目”...我们实际上并没有计划这样做。我们可以为相同的发送者ID创建多个服务器密钥,因此我们计划使用相同的项目为每个客户生成一个服务器密钥。为每个客户设置新的Firebase项目有什么好处?我们需要为每个客户创建一个新的Firebase帐户,还是只需要在同一个Firebase帐户中创建一个新的Firebase项目? - user1727021
回答自己问题的部分:是的,我可以为同一个应用创建多个项目。仍然在想,为什么这比在同一个项目下为多个客户生成多个服务器密钥更有益呢?@AL - user1727021
1
为每个客户单独创建一个项目,也可以让他们选择通过自己的帐户从通知控制台发送自己的消息(如果他们决定创建自己的项目以在单独的帐户上)。多个服务器密钥可能有效,但是可能会出现服务器密钥混淆的情况。在这种情况下,禁用项目发件人是否更容易?发件人混淆也是可能的,但由于控制台中每个项目都有名称,因此更容易识别。尽管如此,实施方案将由您决定。干杯! - AL.

0

无法限制服务器密钥仅允许特定主题/设备等。

我建议使用Firebase云功能以不同的方式解决此问题。您可以构建一个HTTPS函数,该函数通过任何您认为合适的方式获取每个站点的授权令牌,然后该函数调用Firebase Cloud Messaging来实际发送推送通知。

这样,您完全控制“客户端”站点可以发送哪些类型的推送通知,并且无需担心在客户端站点被攻击时出现级联安全问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接