Firebase Realtime Database 的审核日志记录

本文档介绍了 Firebase Realtime Database 的审核日志记录。Google Cloud 服务会生成审核日志,以记录 Google Cloud 资源中的管理和访问活动。如需详细了解 Cloud Audit Logs,请参阅以下内容:

备注

如需详细了解 protoPayload.metadata 中针对 DATA_READDATA_WRITE 操作的字段,请参阅参考文档

服务名称

Firebase Realtime Database 审核日志使用服务名称 firebasedatabase.googleapis.com。针对此服务的过滤条件:

    protoPayload.serviceName="firebasedatabase.googleapis.com"
  

方法(按权限类型)

每个 IAM 权限都有一个 type 属性,该属性的值是一个枚举,可以是以下四个值之一:ADMIN_READADMIN_WRITEDATA_READDATA_WRITE。若您调用某个方法,则 Firebase Realtime Database 会生成一个审核日志,其类别取决于执行该方法所需权限的 type 属性。需要 IAM 权限且 type 属性值为 DATA_READDATA_WRITEADMIN_READ 的方法会生成数据访问审核日志。需要 IAM 权限且 type 属性值为 ADMIN_WRITE 的方法会生成管理员活动审核日志。

权限类型 方法
ADMIN_READ google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance
google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances
ADMIN_WRITE google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance
google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance
google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance
google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance
google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance
DATA_READ google.firebase.database.v1.RealtimeDatabase.Connect
google.firebase.database.v1.RealtimeDatabase.Disconnect
google.firebase.database.v1.RealtimeDatabase.Listen
google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel
google.firebase.database.v1.RealtimeDatabase.Read
google.firebase.database.v1.RealtimeDatabase.Unlisten
DATA_WRITE google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut
google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate
google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect
google.firebase.database.v1.RealtimeDatabase.Update
google.firebase.database.v1.RealtimeDatabase.Write

API 接口审核日志

如需了解如何评估每种方法的权限以及评估哪些权限,请参阅 Firebase Realtime Database 的 Cloud Identity and Access Management 文档。

google.firebase.database.v1.RealtimeDatabase

以下审核日志与属于 google.firebase.database.v1.RealtimeDatabase 的方法相关联。

Connect

  • 方法google.firebase.database.v1.RealtimeDatabase.Connect
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.connect - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Connect"

Disconnect

  • 方法google.firebase.database.v1.RealtimeDatabase.Disconnect
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.connect - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Disconnect"

Listen

  • 方法google.firebase.database.v1.RealtimeDatabase.Listen
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.get - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Listen"

OnDisconnectCancel

  • 方法google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.cancel - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel"

OnDisconnectPut

  • 方法google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.update - DATA_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut"

OnDisconnectUpdate

  • 方法google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.update - DATA_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate"

Read

  • 方法google.firebase.database.v1.RealtimeDatabase.Read
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.get - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Read"

RunOnDisconnect

  • 方法google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.update - DATA_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect"

Unlisten

  • 方法google.firebase.database.v1.RealtimeDatabase.Unlisten
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.cancel - DATA_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Unlisten"

Update

  • 方法google.firebase.database.v1.RealtimeDatabase.Update
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.get - DATA_WRITE
    • firebasedatabase.data.update - DATA_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Update"

Write

  • 方法google.firebase.database.v1.RealtimeDatabase.Write
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.data.update - DATA_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Write"

google.firebase.database.v1beta.RealtimeDatabaseService

以下审核日志与属于 google.firebase.database.v1beta.RealtimeDatabaseService 的方法相关联。

CreateDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance
  • 审核日志类型管理员活动
  • 权限
    • firebasedatabase.instances.create - ADMIN_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance"

DeleteDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance
  • 审核日志类型管理员活动
  • 权限
    • firebasedatabase.instances.delete - ADMIN_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance"

DisableDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance
  • 审核日志类型管理员活动
  • 权限
    • firebasedatabase.instances.disable - ADMIN_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance"

GetDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.instances.get - ADMIN_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance"

ListDatabaseInstances

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances
  • 审核日志类型数据访问
  • 权限
    • firebasedatabase.instances.list - ADMIN_READ
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances"

ReenableDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance
  • 审核日志类型管理员活动
  • 权限
    • firebasedatabase.instances.reenable - ADMIN_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance"

UndeleteDatabaseInstance

  • 方法google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance
  • 审核日志类型管理员活动
  • 权限
    • firebasedatabase.instances.undelete - ADMIN_WRITE
  • 方法是长时间运行的操作或流式传输操作:否。
  • 此方法的过滤条件 protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance"

审核身份验证信息

审核日志条目包含有关执行所记录操作的身份的信息。如需识别请求调用方,请查看 AuditLog 对象中的以下字段:

  • 建立实时连接。Realtime Database Connect 操作不记录身份验证数据,因为 Realtime Database 在建立连接后才进行身份验证。因此,Connect 没有身份验证信息。AuthenticationInfo 对象包含 audit-pending-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com 的占位 principalEmail

  • Google 身份验证。使用标准 Google 身份验证的 Realtime Database 操作(例如来自 Firebase Admin SDK 的流量或使用标准 OAuth 令牌进行身份验证的 REST 请求)的 AuthenticationInfo 对象其中包含实际的凭据电子邮件。

  • Firebase Authentication。使用 Firebase AuthenticationRealtime Database 操作具有一个 AuthenticationInfo 对象,其中包含值为 principalEmailaudit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com。如果您通过创建自定义 JWT 实现自己的身份验证解决方案,也是如此。

    • 如果 JSON Web 令牌 (JWT) 用于第三方身份验证,则 thirdPartyPrincipal 字段会包含该令牌的标头和载荷。例如,使用 Firebase Authentication 进行身份验证的请求的审核日志包括该请求的 Firebase Authentication 令牌。
  • 无身份验证。不使用任何身份验证的 Realtime Database 操作具有一个 AuthenticationInfo 对象,该对象包含值为 audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.comprincipalEmail。具有开放安全规则的 Realtime Database 实例可能授予此类请求。我们建议所有用户都适当地保护其数据库。

  • 旧版 Secret 令牌。使用旧版令牌Realtime Database 操作具有一个 AuthenticationInfo 对象,该对象包含 audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com 的占位 principalEmail。对于由 Secret 签名的 JWT,thirdPartyPrincipal 包含 JWT 标头和载荷。

审核 Firebase Security Rules 评估

Cloud Audit Logs 可用于识别可能受 Rules 更改影响的请求。

AuthorizationInfo 对象中,authorization.permission 可以是以下某项:

  • firebasedatabase.data.get:在 resource 中指定的路径授予的读取权限。
  • firebasedatabase.data.update:在 resource 中指定的路径授予的写入权限。
  • firebasedatabase.data.connectConnectDisconnect 的占位符。无需授权即可连接到 Realtime Database 实例。
  • firebasedatabase.data.cancel:用于 UnlistenOnDisconnectCancel。无需额外授权即可撤销或取消以前授权的操作。

将 Cloud Audit Logs 与 Realtime Database 性能分析器结果相关联

您可以将 Realtime Database 性能分析器Realtime Database 审核日志记录功能结合使用,对 Realtime Database 进行深入的性能分析。每个工具都有自己的优势。

Cloud Audit Logs Realtime Database 分析器
  • 审核对数据库的访问权限
  • 持续捕获所有请求
  • 允许追溯查询
  • 包含详细的身份验证令牌信息
  • 会产生使用费
  • 用于性能分析
  • 提供用于识别热点进而优化性能的实用工具
  • 可以测量监听器广播,审核日志中不提供该数据(由于潜在的数据量)
  • 轻量级且实时进行,因而非常适合实时负载测试。审核日志条目可能需要几分钟才会显示。

审核日志内容与分析器指标相对应,如下所示。

Audit Logging 操作名称 RealtimeDatabaseAuditMetadata
中的特殊值
性能分析器操作名称
连接 RequestTypeREALTIME concurrent-connect
断开连接 RequestTypeREALTIME concurrent-disconnect
读取 RequestTypeREALTIME realtime-read
读取 RequestTypeREST rest-read
写入 RequestTypeREALTIME realtime-write
写入 RequestTypeREST rest-write
更新 RequestTypeREALTIME
查看 PreconditionType
realtime-update
realtime-transaction
更新 RequestTypeREST
查看 PreconditionType
rest-update
rest-transaction
ListenerListen RequestTypeREALTIME listener-listen
ListenerUnlisten RequestTypeREALTIME listener-unlisten
OnDisconnectPut RequestTypeREALTIME on-disconnect-put
OnDisconnectUpdate RequestTypeREALTIME on-disconnect-update
OnDisconnectCancel RequestTypeREALTIME on-disconnect-cancel
RunOnDisconnect RequestTypeREALTIME run-on-disconnect