本文說明 Firebase 即時資料庫的稽核記錄功能。Google Cloud 服務會產生稽核記錄,記錄 Google Cloud 資源中的管理和存取活動。如要進一步瞭解 Cloud 稽核記錄,請參閱下列文章:
附註
如要進一步瞭解 protoPayload.metadata 中 DATA_READ 和 DATA_WRITE 作業的 DATA_WRITE 欄位,請參閱參考說明文件。
服務名稱
Firebase Realtime Database 稽核記錄會使用服務名稱 firebasedatabase.googleapis.com。篩選這項服務:
protoPayload.serviceName="firebasedatabase.googleapis.com"
依權限類型劃分的方法
 每個 IAM 權限都有 type 屬性,其值為列舉,可以是下列四個值之一:ADMIN_READ、ADMIN_WRITE、DATA_READ 或 DATA_WRITE。呼叫方法時,Firebase 即時資料庫會產生稽核記錄,記錄的類別取決於執行方法所需的權限的 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 即時資料庫的 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 Token (JWT),thirdPartyPrincipal欄位會包含權杖的標頭和酬載。舉例來說,以 Firebase Authentication 驗證的要求稽核記錄會包含該要求的 Firebase Authentication 權杖。
 
- 如果第三方驗證使用 JSON Web Token (JWT),
- 沒有任何驗證機制。未採用任何驗證機制的 Realtime Database 作業會包含 - AuthenticationInfo物件,其中含有- principalEmail值- audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com。具有開放式安全規則的 Realtime Database 執行個體可能會授予這類要求。建議所有使用者妥善保護資料庫。
- 舊版密鑰權杖。使用舊版權杖的 Realtime Database 作業具有 - AuthenticationInfo物件,其中包含- audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com的- principalEmail預留位置。如果是以密鑰簽署的 JWT,- thirdPartyPrincipal包含 JWT 標頭和酬載。
稽核 Firebase Security Rules 評估
您可以使用 Cloud 稽核記錄,找出可能受到 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 稽核記錄與 Realtime Database 分析器結果相互關聯
您可以搭配使用 Realtime Database 剖析器和 Realtime Database 稽核記錄,對 Realtime Database 進行深入的效能分析。每項工具都有其優勢。
| Cloud 稽核記錄 | Realtime Database profiler | 
|---|---|
| 
 | 
 | 
稽核記錄內容對應的剖析器指標如下所示。
| 稽核記錄作業名稱 | 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 |