Google 致力于为黑人社区推动种族平等。查看具体举措

Firebase 安全清单

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

为确保您的 Firebase 资源和用户数据的安全,请遵循这些准则。并非每个项目都一定适用于您的要求,但在开发应用程序时请牢记它们。

避免滥用流量

为后端服务设置监控和警报

要检测滥用流量,例如拒绝服务 (DOS) 攻击,请为Cloud FirestoreRealtime DatabaseCloud StorageHosting设置监控和警报

如果您怀疑您的应用程序受到攻击,请尽快联系支持人员,让他们知道发生了什么。

启用应用检查

为了帮助确保只有您的应用程序可以访问您的后端服务,请为支持它的每个服务启用应用程序检查

配置您的 Cloud Functions 以针对正常流量进行扩展

Cloud Functions 会自动扩展以满足您的应用程序的需求,但如果发生攻击,这可能意味着巨额费用。为防止这种情况,您可以根据应用的正常流量限制函数的并发实例数

设置警报以在接近达到限制时收到通知

如果您的服务有请求高峰,通常会启动配额,并自动限制您的应用程序的流量。确保监控您的使用和计费仪表板,但您也可以在项目上设置预算警报,以便在资源使用超出预期时收到通知。

防止自我DOS:使用模拟器在本地测试功能

在开发 Cloud Functions 时,很容易意外地执行 DOS:例如,通过创建无限的触发-写入循环。您可以通过使用Firebase 模拟器套件进行开发来防止这些错误影响实时服务。

(如果您自己不小心执行了 DOS,请通过从index.js中删除它然后运行firebase deploy --only functions来取消部署您的函数。)

在实时响应不那么重要的地方,结构具有防御性功能

如果您不需要实时呈现函数的结果,您可以通过批量处理结果来缓解滥用流量:将结果发布到Pub/Sub主题,并使用计划函数定期处理结果.

了解 API 密钥

Firebase 服务的 API 密钥不是秘密的

Firebase 仅使用 API 密钥向 Firebase 服务识别您应用的 Firebase 项目,而不是控制对数据库或云存储数据的访问,这是使用Firebase 安全规则完成的。因此,您无需将 Firebase 服务的 API 密钥视为机密,您可以安全地将它们嵌入客户端代码中。详细了解Firebase 的 API 密钥

设置 API 密钥范围

作为对试图使用您的 API 密钥来欺骗请求的攻击者的额外威慑,您可以创建范围为您的应用程序客户端的API 密钥。

将 FCM 服务器密钥保密

与 Firebase 服务的 API 密钥不同,FCM 服务器密钥(由旧版 FCM HTTP API 使用敏感的,必须保密。

将服务帐号密钥保密

此外,与 Firebase 服务的 API 密钥不同,服务帐户私钥(由Admin SDK使用)敏感的,必须保密。

安全规则

在生产或锁定模式下初始化规则

当您设置 Cloud Firestore、实时数据库和 Cloud Storage 时,初始化您的安全规则以默认拒绝所有访问,并在您开发应用程序时添加规则以授予对特定资源的访问权限。

这是 Cloud Firestore(生产模式)和实时数据库(锁定模式)新实例的默认设置之一。设置新数据库实例时选择此选项。

对于 Cloud Storage,请从如下所示的安全规则配置开始:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

安全规则是一种模式;添加文档时添加规则

不要在编写应用程序后编写安全规则,作为一种启动前任务。相反,在编写应用程序时编写安全规则,将它们视为数据库模式:每当您需要使用新的文档类型或路径结构时,首先编写其安全规则。

使用模拟器套件对安全规则进行单元测试;将其添加到 CI

为确保您的安全规则跟上应用程序的开发,请使用Firebase 模拟器套件对您的规则进行单元测试,并将这些测试添加到您的 CI 管道中。请参阅Cloud Firestore实时数据库的这些指南。

验证

自定义身份验证:来自受信任(服务器端)环境的薄荷 JWT

如果您已经拥有一个安全的登录系统,无论是自定义系统还是第三方服务,您都可以使用现有系统来通过 Firebase 服务进行身份验证。从受信任的环境中创建自定义 JWT ,然后将令牌传递给您的客户端,该客户端使用令牌进行身份验证( iOS+AndroidWebUnityC++ )。

有关使用第三方提供商的自定义身份验证的示例,请参阅博客文章使用 Okta 使用 Firebase 进行身份验证

托管身份验证:OAuth 2.0 提供者是最安全的

如果您使用 Firebase 的托管身份验证功能,OAuth 2.0 / OpenID Connect 提供程序选项(Google、Facebook 等)是最安全的。如果可以(取决于您的用户群),您应该支持这些提供商中的一个或多个。

电子邮件密码身份验证:为登录端点设置严格的配额以防止暴力攻击

如果您使用 Firebase 的托管电子邮件密码身份验证服务,请收紧identitytoolkit.googleapis.com端点的默认配额以防止暴力攻击。您可以从Google Cloud Console 中的 API 页面执行此操作

升级到 Cloud Identity Platform 以进行多重身份验证

为了在登录时获得额外的安全性,您可以通过升级到Cloud Identity Platform添加多重身份验证支持。升级后,您现有的 Firebase 身份验证代码将继续有效。

匿名认证

仅对热入职使用匿名身份验证

仅在用户实际登录之前使用匿名身份验证来保存用户的基本状态。匿名身份验证不能替代用户登录。

如果用户在丢失手机时需要数据,则将其转换为另一种登录方式

如果用户清除本地存储或切换设备,匿名身份验证数据将不会保留。如果您需要在单个设备上保留应用程序重启后的数据,请将用户转换为永久帐户

使用要求用户已转换为登录提供商或已验证其电子邮件的安全规则

任何人都可以在您的项目中创建匿名帐户。考虑到这一点,使用需要特定登录方法或经过验证的电子邮件地址的安全规则来保护所有非公开数据。

例如:

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

环境管理

设置开发和暂存项目

为开发、暂存和生产设置单独的 Firebase 项目。在针对暂存项目进行测试之前,不要将客户端代码合并到生产环境中。

限制团队访问生产数据

如果您与更大的团队合作,您可以通过使用预定义角色或自定义 IAM 角色限制对生产数据的访问来减轻错误和违规的后果。

如果您的团队使用模拟器套件进行开发,您可能不需要授予对生产项目的更广泛访问权限。

图书馆管理

注意库拼写错误或新维护者

将库添加到您的项目时,请密切注意库的名称及其维护者。与您打算安装的库名称相似的库可能包含恶意代码。

不要在不了解更改的情况下更新库

在升级之前查看您使用的任何库的更改日志。确保升级增加了价值,并检查维护者是否仍然是您信任的一方。

安装看门狗库作为开发或测试依赖项

使用诸如Snyk 之类的库来扫描您的项目以查找不安全的依赖项。

设置功能监控;库更新后检查

如果您使用Cloud Functions 记录器 SDK ,您可以监控异常行为并收到警报,包括由库更新引起的行为。

云功能安全

切勿将敏感信息放入 Cloud Function 的环境变量中

通常在自托管 Node.js 应用程序中,您使用环境变量来包含敏感信息,例如私钥。不要在 Cloud Functions 中执行此操作。由于 Cloud Functions 在函数调用之间重用环境,因此不应将敏感信息存储在环境中。

  • 要存储非机密的 Firebase API 密钥,只需将它们嵌入代码中即可。
  • 如果您在 Cloud Function 中使用 Firebase Admin SDK,则无需显式提供服务帐号凭据,因为 SDK 可以在初始化期间自动获取它们。
  • 如果您调用需要服务帐户凭据的 Google 和 Google Cloud API,Node.js 的 Google Auth 库可以从应用程序默认凭据中获取这些凭据,这些凭据会自动填充到 Cloud Functions 中。
  • 要为您的 Cloud Functions 提供非 Google 服务的私钥和凭据,请使用Cloud Secret Manager

加密敏感信息

如果您无法避免将敏感信息传递给您的云函数,则必须提出自己的自定义解决方案来加密信息。

简单的功能更安全;如果您需要复杂性,请考虑 Cloud Run

尽量让您的云功能尽可能简单易懂。函数的复杂性通常会导致难以发现的错误或意外行为。

如果您确实需要复杂的逻辑或环境配置,请考虑使用Cloud Run而不是 Cloud Functions。