Logging audit Firebase Realtime Database

Dokumen ini menjelaskan logging audit untuk Firebase Realtime Database. Layanan Google Cloud membuat log audit yang mencatat aktivitas administratif dan akses dalam resource Google Cloud Anda. Untuk informasi selengkapnya tentang Cloud Audit Logs, lihat referensi berikut:

Catatan

Informasi tambahan tentang kolom di protoPayload.metadata untuk operasi DATA_READ dan DATA_WRITE tersedia di dokumentasi referensi.

Nama layanan

Log audit Firebase Realtime Database menggunakan nama layanan firebasedatabase.googleapis.com. Filter untuk layanan ini:

    protoPayload.serviceName="firebasedatabase.googleapis.com"
  

Metode menurut jenis izin

Setiap izin IAM memiliki properti type, yang nilainya adalah enum yang dapat berupa salah satu dari empat nilai: ADMIN_READ, ADMIN_WRITE, DATA_READ, atau DATA_WRITE. Saat Anda memanggil metode, Firebase Realtime Database akan membuat log audit yang kategorinya bergantung pada properti type izin yang diperlukan untuk menjalankan metode. Metode yang memerlukan izin IAM dengan nilai properti type DATA_READ, DATA_WRITE, atau ADMIN_READ akan menghasilkan log audit Akses Data. Metode yang memerlukan izin IAM dengan nilai properti type dari ADMIN_WRITE akan membuat log audit Aktivitas Admin.

Jenis izin Metode
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

Log audit antarmuka API

Untuk mengetahui informasi tentang cara dan izin mana yang dievaluasi untuk setiap metode, lihat dokumentasi Cloud Identity and Access Management untuk Firebase Realtime Database.

google.firebase.database.v1.RealtimeDatabase

Log audit berikut dikaitkan dengan metode yang termasuk dalam google.firebase.database.v1.RealtimeDatabase.

Connect

  • Metode: google.firebase.database.v1.RealtimeDatabase.Connect
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.connect - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Connect"

Disconnect

  • Metode: google.firebase.database.v1.RealtimeDatabase.Disconnect
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.connect - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Disconnect"

Listen

  • Metode: google.firebase.database.v1.RealtimeDatabase.Listen
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.get - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Listen"

OnDisconnectCancel

  • Metode: google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.cancel - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel"

OnDisconnectPut

  • Metode: google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.update - DATA_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut"

OnDisconnectUpdate

  • Metode: google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.update - DATA_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate"

Read

  • Metode: google.firebase.database.v1.RealtimeDatabase.Read
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.get - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Read"

RunOnDisconnect

  • Metode: google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.update - DATA_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect"

Unlisten

  • Metode: google.firebase.database.v1.RealtimeDatabase.Unlisten
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.cancel - DATA_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Unlisten"

Update

  • Metode: google.firebase.database.v1.RealtimeDatabase.Update
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.get - DATA_WRITE
    • firebasedatabase.data.update - DATA_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Update"

Write

  • Metode: google.firebase.database.v1.RealtimeDatabase.Write
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.data.update - DATA_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Write"

google.firebase.database.v1beta.RealtimeDatabaseService

Log audit berikut dikaitkan dengan metode yang termasuk dalam google.firebase.database.v1beta.RealtimeDatabaseService.

CreateDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance
  • Jenis log audit: Aktivitas admin
  • Izin:
    • firebasedatabase.instances.create - ADMIN_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance"

DeleteDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance
  • Jenis log audit: Aktivitas admin
  • Izin:
    • firebasedatabase.instances.delete - ADMIN_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance"

DisableDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance
  • Jenis log audit: Aktivitas admin
  • Izin:
    • firebasedatabase.instances.disable - ADMIN_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance"

GetDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.instances.get - ADMIN_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance"

ListDatabaseInstances

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances
  • Jenis log audit: Akses data
  • Izin:
    • firebasedatabase.instances.list - ADMIN_READ
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances"

ReenableDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance
  • Jenis log audit: Aktivitas admin
  • Izin:
    • firebasedatabase.instances.reenable - ADMIN_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance"

UndeleteDatabaseInstance

  • Metode: google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance
  • Jenis log audit: Aktivitas admin
  • Izin:
    • firebasedatabase.instances.undelete - ADMIN_WRITE
  • Metode adalah operasi streaming atau yang berjalan lama: Tidak.
  • Filter untuk metode ini: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance"

Mengaudit informasi autentikasi

Entri log audit menyertakan informasi tentang identitas yang melakukan operasi yang dicatat dalam log. Untuk mengidentifikasi pemanggil permintaan, lihat kolom berikut dalam objek AuditLog:

  • Membuat koneksi realtime. Operasi Realtime Database Connect tidak mencatat data autentikasi karena Realtime Database diautentikasi setelah koneksi dibuat. Oleh karena itu, Connect tidak memiliki info autentikasi. Objek AuthenticationInfo berisi placeholder principalEmail dari audit-pending-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com.

  • Google Authentication. Operasi Realtime Database yang menggunakan Google Authentication standar, seperti traffic dari Firebase Admin SDK atau permintaan REST yang diautentikasi dengan token OAuth standar, memiliki objek AuthenticationInfo yang berisi email kredensial yang sebenarnya.

  • Firebase Authentication. Operasi Realtime Database yang menggunakan Firebase Authentication memiliki objek AuthenticationInfo yang berisi nilai principalEmail sebesar audit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com. Hal yang sama berlaku jika Anda menerapkan solusi autentikasi Anda sendiri dengan membuat JWT kustom.

    • Jika Token Web JSON (JWT) digunakan untuk autentikasi pihak ketiga, kolom thirdPartyPrincipal akan menyertakan header dan payload token. Misalnya, log audit untuk permintaan yang diautentikasi dengan Firebase Authentication menyertakan token Firebase Authentication permintaan tersebut.
  • Tidak ada autentikasi Operasi Realtime Database yang tidak menggunakan autentikasi apa pun memiliki objek AuthenticationInfo yang berisi nilai principalEmail dari audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com Instance Realtime Database dengan aturan keamanan terbuka dapat mengizinkan permintaan tersebut. Sebaiknya semua pengguna mengamankan database mereka dengan benar.

  • Token rahasia lama. Operasi Realtime Database yang menggunakan token lama memiliki objek AuthenticationInfo yang berisi placeholder principalEmail dari audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com. Untuk JWT yang ditandatangani secara rahasia, thirdPartyPrincipal berisi header dan payload JWT.

Mengaudit evaluasi Firebase Security Rules

Cloud Audit Logs dapat digunakan untuk mengidentifikasi permintaan yang berpotensi terpengaruh oleh perubahan Rules.

Di objek AuthorizationInfo, authorization.permission dapat berupa salah satu dari:

  • firebasedatabase.data.get: Akses baca diberikan pada jalur yang ditentukan di resource.
  • firebasedatabase.data.update: Akses tulis yang diberikan di jalur yang ditentukan di resource.
  • firebasedatabase.data.connect: Placeholder untuk Connect dan Disconnect. Tidak diperlukan otorisasi untuk terhubung ke instance Realtime Database.
  • firebasedatabase.data.cancel: Digunakan untuk Unlisten dan OnDisconnectCancel. Mencabut atau membatalkan operasi yang sebelumnya diizinkan tidak memerlukan otorisasi tambahan.

Menghubungkan Cloud Audit Logs dengan hasil profiler Realtime Database

Anda dapat melakukan analisis performa yang mendalam di Realtime Database menggunakan profiler Realtime Database yang dikombinasikan dengan logging audit Realtime Database. Setiap alat memiliki keunggulannya.

Cloud Audit Logging Profiler Realtime Database
  • Akses audit ke database
  • Terus-menerus menangkap semua permintaan
  • Mengizinkan kueri retrospektif
  • Berisi info token autentikasi mendetail
  • Dikenakan biaya penggunaan
  • Digunakan untuk analisis performa
  • Menyediakan alat yang berguna untuk identifikasi hotspot dan pengoptimalan performa
  • Dapat mengukur listener-broadcast, yang tidak tersedia di Log audit karena adanya potensi volume data
  • Ringan dan realtime, sehingga cocok untuk pengujian live load. Mungkin perlu waktu beberapa menit untuk menampilkan entri log audit.

Konten log audit sesuai dengan metrik profiler seperti yang ditunjukkan di bawah.

Nama operasi Logging Audit Nilai khusus dalam
RealtimeDatabaseAuditMetadata
Nama operasi profiler
Connect RequestType is REALTIME concurrent-connect
Disconnect RequestType is REALTIME concurrent-disconnect
Read RequestType is REALTIME realtime-read
Read RequestType is REST rest-read
Write RequestType is REALTIME realtime-write
Write RequestType is REST rest-write
Update RequestType is REALTIME.
Check PreconditionType.
realtime-update
realtime-transaction
Update RequestType is REST.
Check PreconditionType.
rest-update
rest-transaction
ListenerListen RequestType is REALTIME listener-listen
ListenerUnlisten RequestType is REALTIME listener-unlisten
OnDisconnectPut RequestType is REALTIME on-disconnect-put
OnDisconnectUpdate RequestType is REALTIME on-disconnect-update
OnDisconnectCancel RequestType is REALTIME on-disconnect-cancel
RunOnDisconnect RequestType is REALTIME run-on-disconnect