本文档介绍了 Firebase Realtime Database 的审核日志记录。Google Cloud 服务会生成审核日志,以记录 Google Cloud 资源中的管理和访问活动。如需详细了解 Cloud Audit Logs,请参阅以下内容:
备注
如需详细了解 protoPayload.metadata 中针对 DATA_READ 和 DATA_WRITE 操作的字段,请参阅参考文档。
服务名称
Firebase Realtime Database 审核日志使用服务名称 firebasedatabase.googleapis.com。针对此服务的过滤条件:
protoPayload.serviceName="firebasedatabase.googleapis.com"
方法(按权限类型)
 每个 IAM 权限都有一个 type 属性,该属性的值是一个枚举,可以是以下四个值之一:ADMIN_READ、ADMIN_WRITE、DATA_READ 或 DATA_WRITE。若您调用某个方法,则 Firebase Realtime Database 会生成一个审核日志,其类别取决于执行该方法所需权限的 type 属性。需要 IAM 权限且 type 属性值为 DATA_READ、DATA_WRITE 或 ADMIN_READ 的方法会生成数据访问审核日志。需要 IAM 权限且 type 属性值为 ADMIN_WRITE 的方法会生成管理员活动审核日志。
| 权限类型 | 方法 | 
|---|---|
| ADMIN_READ | google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstancegoogle.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances | 
| ADMIN_WRITE | google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstancegoogle.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstancegoogle.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstancegoogle.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstancegoogle.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance | 
| DATA_READ | google.firebase.database.v1.RealtimeDatabase.Connectgoogle.firebase.database.v1.RealtimeDatabase.Disconnectgoogle.firebase.database.v1.RealtimeDatabase.Listengoogle.firebase.database.v1.RealtimeDatabase.OnDisconnectCancelgoogle.firebase.database.v1.RealtimeDatabase.Readgoogle.firebase.database.v1.RealtimeDatabase.Unlisten | 
| DATA_WRITE | google.firebase.database.v1.RealtimeDatabase.OnDisconnectPutgoogle.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdategoogle.firebase.database.v1.RealtimeDatabase.RunOnDisconnectgoogle.firebase.database.v1.RealtimeDatabase.Updategoogle.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 Authentication 的 Realtime Database 操作具有一个 - AuthenticationInfo对象,其中包含值为- principalEmail的- audit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com。如果您通过创建自定义 JWT 实现自己的身份验证解决方案,也是如此。- 如果 JSON Web 令牌 (JWT) 用于第三方身份验证,则 thirdPartyPrincipal字段会包含该令牌的标头和载荷。例如,使用 Firebase Authentication 进行身份验证的请求的审核日志包括该请求的 Firebase Authentication 令牌。
 
- 如果 JSON Web 令牌 (JWT) 用于第三方身份验证,则 
- 无身份验证。不使用任何身份验证的 Realtime Database 操作具有一个 - AuthenticationInfo对象,该对象包含值为- audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com的- principalEmail。具有开放安全规则的 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.connect:- Connect和- Disconnect的占位符。无需授权即可连接到 Realtime Database 实例。
- firebasedatabase.data.cancel:用于- Unlisten和- OnDisconnectCancel。无需额外授权即可撤销或取消以前授权的操作。
将 Cloud Audit Logs 与 Realtime Database 性能分析器结果相关联
您可以将 Realtime Database 性能分析器与 Realtime Database 审核日志记录功能结合使用,对 Realtime Database 进行深入的性能分析。每个工具都有自己的优势。
| Cloud Audit Logs | Realtime Database 分析器 | 
|---|---|
| 
 | 
 | 
审核日志内容与分析器指标相对应,如下所示。
| Audit Logging 操作名称 | RealtimeDatabaseAuditMetadata中的特殊值 | 性能分析器操作名称 | 
|---|---|---|
| 连接 | RequestType为REALTIME | concurrent-connect | 
| 断开连接 | RequestType为REALTIME | concurrent-disconnect | 
| 读取 | RequestType为REALTIME | realtime-read | 
| 读取 | RequestType为REST | rest-read | 
| 写入 | RequestType为REALTIME | realtime-write | 
| 写入 | RequestType为REST | rest-write | 
| 更新 | RequestType是REALTIME。查看 PreconditionType。 | realtime-update realtime-transaction | 
| 更新 | RequestType是REST。查看 PreconditionType。 | rest-update rest-transaction | 
| ListenerListen | RequestType为REALTIME | listener-listen | 
| ListenerUnlisten | RequestType为REALTIME | listener-unlisten | 
| OnDisconnectPut | RequestType为REALTIME | on-disconnect-put | 
| OnDisconnectUpdate | RequestType为REALTIME | on-disconnect-update | 
| OnDisconnectCancel | RequestType为REALTIME | on-disconnect-cancel | 
| RunOnDisconnect | RequestType为REALTIME | run-on-disconnect |