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

Firebase 安全检查清单

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

避免滥用交通

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

为了检测滥用流量,如拒绝服务(DOS)攻击,建立监测和报警云公司的FireStore实时数据库云存储主机

如果您怀疑您的应用程序的攻击,伸出手来支持,尽快让他们知道发生了什么。

启用应用检查

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

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

Cloud Functions 会自动扩展以满足您的应用程序的需求,但如果发生攻击,这可能意味着一笔巨额账单。为了避免这种情况,可以限制并发实例的数量根据你的应用程序的正常流量的功能。

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

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

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

在开发 Cloud Functions 时,很容易意外地自己 DOS 运行:例如,通过创建一个无限的触发-写入循环。您可以防止这些错误因与做你的发展影响Live服务火力地堡仿真器套件

(如果你从删除它做意外DOS自己,取消部署功能index.js然后运行firebase deploy --only functions 。)

在实时响应不那么重要的地方,结构发挥防御作用

如果你不需要出示实时功能的结果,则可以通过处理批次的结果减轻对滥用交通:公布结果的发布/订阅的话题,并与处理定期结果预定功能.

了解 API 密钥

Firebase 服务的 API 密钥不是秘密

火力地堡使用API密钥只认你的应用程序的火力点项目火力地堡的服务,而不是数据库或云存储数据,这是使用进行控制访问火力地堡的安全规则。因此,您无需将 Firebase 服务的 API 密钥视为机密,并且可以安全地将它们嵌入到客户端代码中。详细了解了火力地堡的API密钥

设置 API 密钥范围

作为对攻击者的额外的威慑试图使用您的API密钥,以恶搞的请求,您可以创建API密钥作用域为您的应用程序客户端

保密 FCM 服务器密钥

对于火力地堡服务与API密钥,FCM服务器密钥(使用的传统FCM HTTP API敏感的,必须保密。

保密服务帐号密钥

也为火力地堡服务不同于API密钥,服务帐户私钥(由所使用的管理员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;
    }
  }
}

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

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

使用 Emulator Suite 单元测试安全规则;将其添加到 CI

为了确保您的安全规则跟上你的应用程序的开发,单元测试与您的规则火力地堡仿真器套件和这些测试添加到您的CI管道。见这些指南对云计算公司的FireStore实时数据库

验证

自定义身份验证:从可信(服务器端)环境中创建 JWT

如果您已经拥有安全登录系统,无论是自定义系统还是第三方服务,您都可以使用现有系统对 Firebase 服务进行身份验证。创建自定义JWTs从一个值得信赖的环境,然后将令牌传递到客户端,它使用令牌进行身份验证( iOS版+Android的网络团结C ++ )。

对于使用与第三方供应商的定制验证的示例,请参阅博客文章,身份验证使用1563火力地堡

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

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

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

如果您使用火力地堡的管理电子邮件地址和密码认证服务,收紧的默认配额identitytoolkit.googleapis.com端点,以防止暴力攻击。你可以从这样做的API在谷歌的云控制台页

升级到 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扫描您的项目不安全的依赖。

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

如果使用云功能记录器的SDK ,可以监视和提醒的异常行为,包括对由于库的更新行为。

云功能安全

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

通常在自托管的 Node.js 应用程序中,您使用环境变量来包含敏感信息,例如私钥。不要在云功能做到这一点。由于 Cloud Functions 在函数调用之间重复使用环境,因此不应将敏感信息存储在环境中。

  • 要保存火力地堡API密钥,这是不是秘密,只是将它们嵌入代码。
  • 如果您在 Cloud Function 中使用 Firebase Admin SDK,则无需明确提供服务帐号凭据,因为 SDK 可以在初始化期间自动获取它们。
  • 如果你打电话要求服务帐户凭据谷歌和谷歌云API,谷歌的验证库Node.js的可以从这些凭证应用默认凭据,这是在云计算功能自动填充。
  • 为了使私钥和凭证提供给您的云计算功能的非谷歌的服务,用云的秘密经理

加密敏感信息

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

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

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

如果确实需要复杂的逻辑或环境配置,可以考虑使用云中运行,而不是云功能。