【问题标题】:FCM Security: Prevent multiple senders from pushing notifications to all devices?FCM 安全性:防止多个发件人向所有设备推送通知?
【发布时间】:2017-09-17 08:24:00
【问题描述】:

作为我们解决方案的一部分,我们希望在每个客户站点部署 FCM“应用服务器”。每个客户站点都有自己的用户,他们使用我们的应用程序使用自己的设备。但是,我们希望确保如果其中一个客户站点遭到入侵,攻击者无法滥用 FCM“应用服务器”(例如,通过向所有客户站点的所有设备发送通知)。

我们正在考虑为每个客户站点生成唯一的服务器密钥,而不是在所有客户站点之间共享凭据。这样一来,如果某个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送更多 FCM 通知。

问题:我们能否确定攻击者无法向所有设备发送全局通知?

  • 假设攻击者拥有服务器密钥并可以访问一个客户站点“app-server”,他们能否获得所有已注册设备的列表?
  • 是否有发送到所有设备的默认通知“主题”? (例如 /topic/all 或 /topic/global)。如果是这样,我们可以禁用该默认主题吗?

【问题讨论】:

  • 您所说的“服务器密钥”是什么意思,它将如何与 FCM 一起使用?
  • “应用服务器”使用服务器密钥向 FCM 连接服务器进行身份验证。以下是更多详细信息:firebase.google.com/docs/cloud-messaging/server
  • 我以为这就是您的意思,但一个 Firebase 帐户怎么可能拥有多个服务器密钥?据我了解,只有一个。
  • 奇怪的是我也看到了这种说法。但是,我们绝对可以添加多个服务器密钥。以下是步骤:1. 转到 Firebase 控制台console.firebase.google.com2. 点击左上角的齿轮图标 3. 点击在“项目设置”4.点击“云消息”选项卡5.请注意,在第一部分“项目凭据”下,右侧有一个蓝色的大按钮“添加服务器密钥”这似乎可以解决问题,或者我可能误解了多个服务器密钥的功能或交互。
  • 有趣...有用吗?

标签: firebase push-notification firebase-cloud-messaging


【解决方案1】:

我们正在考虑为每个客户站点生成唯一的服务器密钥,而不是在所有客户站点之间共享凭据。这样一来,如果某个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送更多 FCM 通知。

如果“我们正在考虑为每个客户站点生成一个唯一的服务器密钥”您的意思是您只需为每个客户站点创建一个 Firebase 项目,那么我认为这是正确的接近。

我们能否确定攻击者无法向所有设备发送全局通知?

应用可以通过实现getToken(authorizedEntity, scope) 来接收来自不同发件人的消息,这将为每个发件人生成不同的令牌。为了否定这个动作,你可以简单地调用deleteToken(authorizedEntity, scope) (my reference)。

这将使相应发件人的令牌无效(他们可能拥有并且应该是他们应用服务器上唯一的一个),这将自动禁用他们接收到您的应用程序的消息。

因此,只要您能够将它们作为有效发件人从您的应用中删除,那么一切都很好。

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

这取决于应用服务器的实现方式。如果客户的 App 服务器仅用于发送消息,但令牌存储在其他地方,那么可能不会。没有 API 可以在服务器端根据服务器密钥 (see #1 here) 为应用检索注册令牌。

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

没有。可以选择通过 Firebase 通知控制台向特定应用发送通知,但如果应用未授权与该项目对应的发件人 ID,它将不会收到来自它的任何消息。我在发布之前已经测试了这种行为,所以我很肯定它是这样工作的。

【讨论】:

  • 回复:“...为每个客户站点创建一个 Firebase 项目”...我们实际上并没有计划这样做。我们能够为同一个发件人 ID 创建多个服务器密钥,因此我们计划使用同一个项目为每个客户生成一个服务器密钥。为每个客户设置一个新的 Firebase 项目有什么好处?我们是必须为每个客户创建一个新的 Firebase 帐户,还是只在同一个 Firebase 帐户中创建一个新的 Firebase 项目?
  • 回答我自己的部分问题:是的,我可以为同一个应用程序创建多个项目。仍然想知道为什么这比为同一项目@AL 下的多个客户生成多个服务器密钥更有好处。
  • 为每个客户提供一个单独的项目还可以让他们选择通过自己的帐户从通知控制台发送自己的消息(如果他们决定在单独的帐户上创建他们的项目)。多个服务器密钥可以工作,但可能会与服务器密钥混淆。在那种情况下,专门禁用项目发送者不是更容易吗?发件人中的混淆也是可能的,但更容易识别,因为每个项目都在控制台中命名。尽管如此,实施将是您的选择。干杯!
【解决方案2】:

无法将服务器密钥限制为仅允许某些主题/设备/等。

我会考虑使用Cloud Functions for Firebase 以不同的方式解决这个问题。您可以构建一个 HTTPS 函数来获取每个站点的授权令牌(以您认为合适的任何方式),然后该函数调用 Firebase 云消息传递以实际发送推送通知。

这样,您可以完全控制“客户端”站点可以发送哪些类型的推送通知,并且您不必担心在客户端站点受到威胁时会出现级联安全问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多