Ghi nhật ký kiểm tra Cơ sở dữ liệu theo thời gian thực của Firebase

Tài liệu này mô tả nhật ký kiểm tra cho Cơ sở dữ liệu thời gian thực Firebase. Các dịch vụ Google Cloud tạo nhật ký kiểm tra để ghi lại các hoạt động quản trị và truy cập trong các tài nguyên Google Cloud của bạn. Để biết thêm thông tin về Nhật ký kiểm tra trên Cloud, hãy xem các nội dung sau:

Lưu ý

Bạn có thể xem thêm thông tin về các trường trong protoPayload.metadata cho các thao tác DATA_READDATA_WRITE trong tài liệu tham khảo.

Tên dịch vụ

Nhật ký kiểm tra Cơ sở dữ liệu theo thời gian thực của Firebase sử dụng tên dịch vụ firebasedatabase.googleapis.com. Lọc theo dịch vụ này:

    protoPayload.serviceName="firebasedatabase.googleapis.com"
  

Các phương thức theo loại quyền

Mỗi quyền IAM đều có một thuộc tính type, giá trị của thuộc tính này là một enum có thể là một trong 4 giá trị: ADMIN_READ, ADMIN_WRITE, DATA_READ hoặc DATA_WRITE. Khi bạn gọi một phương thức, Cơ sở dữ liệu thời gian thực Firebase sẽ tạo một nhật ký kiểm tra có danh mục phụ thuộc vào thuộc tính type của quyền cần thiết để thực hiện phương thức đó. Các phương thức yêu cầu quyền IAM có giá trị thuộc tính typeDATA_READ, DATA_WRITE hoặc ADMIN_READ sẽ tạo nhật ký kiểm tra Quyền truy cập dữ liệu. Các phương thức yêu cầu quyền IAM có giá trị thuộc tính typeADMIN_WRITE tạo sẽ tạo nhật ký kiểm tra Hoạt động của quản trị viên.

Các phương thức API trong danh sách sau đây được đánh dấu bằng (LRO) là các thao tác diễn ra trong thời gian dài (LRO). Các phương thức này thường tạo ra 2 mục nhật ký kiểm tra: một mục khi hoạt động bắt đầu và một mục khi hoạt động kết thúc. Để biết thêm thông tin, hãy xem bài viết Nhật ký kiểm tra cho các thao tác diễn ra trong thời gian dài.
Loại quyền Phương thức
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

Nhật ký kiểm tra giao diện API

Để biết thông tin về cách thức và những quyền được đánh giá cho từng phương thức, hãy xem tài liệu về Cloud Identity and Access Management cho Cơ sở dữ liệu thời gian thực Firebase.

google.firebase.database.v1.RealtimeDatabase

Các nhật ký kiểm tra sau đây được liên kết với các phương thức thuộc google.firebase.database.v1.RealtimeDatabase.

Connect

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Connect
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.connect - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Connect"

Disconnect

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Disconnect
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.connect - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Disconnect"

Listen

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Listen
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.get - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Listen"

OnDisconnectCancel

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.cancel - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectCancel"

OnDisconnectPut

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.update - DATA_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectPut"

OnDisconnectUpdate

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.update - DATA_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.OnDisconnectUpdate"

Read

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Read
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.get - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Read"

RunOnDisconnect

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.update - DATA_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.RunOnDisconnect"

Unlisten

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Unlisten
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.cancel - DATA_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Unlisten"

Update

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Update
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.get - DATA_WRITE
    • firebasedatabase.data.update - DATA_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Update"

Write

  • Phương thức: google.firebase.database.v1.RealtimeDatabase.Write
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.data.update - DATA_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1.RealtimeDatabase.Write"

google.firebase.database.v1beta.RealtimeDatabaseService

Các nhật ký kiểm tra sau đây được liên kết với các phương thức thuộc google.firebase.database.v1beta.RealtimeDatabaseService.

CreateDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance
  • Loại nhật ký kiểm tra: Hoạt động của quản trị viên
  • Quyền:
    • firebasedatabase.instances.create - ADMIN_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.CreateDatabaseInstance"

DeleteDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance
  • Loại nhật ký kiểm tra: Hoạt động của quản trị viên
  • Quyền:
    • firebasedatabase.instances.delete - ADMIN_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DeleteDatabaseInstance"

DisableDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance
  • Loại nhật ký kiểm tra: Hoạt động của quản trị viên
  • Quyền:
    • firebasedatabase.instances.disable - ADMIN_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.DisableDatabaseInstance"

GetDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.instances.get - ADMIN_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.GetDatabaseInstance"

ListDatabaseInstances

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances
  • Loại nhật ký kiểm tra: Quyền truy cập vào dữ liệu
  • Quyền:
    • firebasedatabase.instances.list - ADMIN_READ
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ListDatabaseInstances"

ReenableDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance
  • Loại nhật ký kiểm tra: Hoạt động của quản trị viên
  • Quyền:
    • firebasedatabase.instances.reenable - ADMIN_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.ReenableDatabaseInstance"

UndeleteDatabaseInstance

  • Phương thức: google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance
  • Loại nhật ký kiểm tra: Hoạt động của quản trị viên
  • Quyền:
    • firebasedatabase.instances.undelete - ADMIN_WRITE
  • Phương thức là một thao tác diễn ra trong thời gian dài hoặc là một thao tác truyền trực tuyến: Không.
  • Lọc theo phương thức này: protoPayload.methodName="google.firebase.database.v1beta.RealtimeDatabaseService.UndeleteDatabaseInstance"

Kiểm tra thông tin xác thực

Các mục nhập nhật ký kiểm tra bao gồm thông tin về danh tính của người thực hiện thao tác được ghi nhật ký. Để xác định người gọi yêu cầu, hãy xem các trường sau trong đối tượng AuditLog:

  • Thiết lập kết nối theo thời gian thực. Các thao tác Realtime Database Connect không ghi lại dữ liệu xác thực vì Realtime Database xác thực sau khi thiết lập kết nối. Do đó, Connect không có thông tin xác thực. Đối tượng AuthenticationInfo chứa một phần giữ chỗ principalEmail của audit-pending-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com.

  • Xác thực bằng Google. Realtime Database các thao tác sử dụng quy trình Xác thực chuẩn của Google, chẳng hạn như lưu lượng truy cập từ Firebase Admin SDK hoặc các yêu cầu REST được xác thực bằng mã thông báo OAuth chuẩn, có một đối tượng AuthenticationInfo chứa email thông tin đăng nhập thực tế.

  • Firebase Authentication. Các thao tác Realtime Database sử dụng Firebase Authentication có một đối tượng AuthenticationInfo chứa giá trị principalEmailaudit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com. Điều này cũng đúng nếu bạn triển khai giải pháp xác thực của riêng mình bằng cách tạo JWT tuỳ chỉnh.

    • Nếu Mã thông báo web JSON (JWT) được dùng để xác thực bên thứ ba, thì trường thirdPartyPrincipal sẽ bao gồm tiêu đề và phần dữ liệu thực tế của mã thông báo. Ví dụ: nhật ký kiểm tra cho các yêu cầu được xác thực bằng Firebase Authentication sẽ bao gồm mã thông báo Firebase Authentication của yêu cầu đó.
  • Không có quy trình xác thực. Các thao tác Realtime Database không sử dụng bất kỳ phương thức xác thực nào đều có một đối tượng AuthenticationInfo chứa giá trị principalEmailaudit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com. Một thực thể Realtime Database có các quy tắc bảo mật mở có thể cấp các yêu cầu như vậy. Chúng tôi khuyến nghị tất cả người dùng bảo mật cơ sở dữ liệu của họ một cách thích hợp.

  • Mã thông báo bí mật cũ. Các thao tác Realtime Database sử dụng mã thông báo cũ có một đối tượng AuthenticationInfo chứa một phần giữ chỗ principalEmail của audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com. Đối với JWT được ký bằng khoá bí mật, thirdPartyPrincipal chứa tiêu đề và tải trọng JWT.

Đánh giá Firebase Security Rules kiểm tra

Bạn có thể dùng nhật ký kiểm tra của Cloud để xác định những yêu cầu có thể bị ảnh hưởng bởi các thay đổi về Rules.

Trong đối tượng AuthorizationInfo, authorization.permission có thể là một trong những giá trị sau:

  • firebasedatabase.data.get: Quyền đọc được cấp tại đường dẫn được chỉ định trong resource.
  • firebasedatabase.data.update: Quyền ghi được cấp tại đường dẫn được chỉ định trong resource.
  • firebasedatabase.data.connect: Phần giữ chỗ cho ConnectDisconnect. Bạn không cần uỷ quyền để kết nối với một phiên bản Realtime Database.
  • firebasedatabase.data.cancel: Dùng cho UnlistenOnDisconnectCancel. Bạn không cần phải uỷ quyền thêm để thu hồi hoặc huỷ một thao tác đã được uỷ quyền trước đó.

Tương quan Nhật ký kiểm tra trên Cloud với kết quả của trình phân tích tài nguyên Realtime Database

Bạn có thể thực hiện phân tích hiệu suất chuyên sâu trên Realtime Database bằng cách kết hợp trình phân tích Realtime Database với tính năng ghi nhật ký kiểm tra Realtime Database. Mỗi công cụ đều có điểm mạnh riêng.

Cloud Audit Logging Trình phân tích Realtime Database
  • Kiểm tra quyền truy cập vào cơ sở dữ liệu
  • Liên tục ghi lại tất cả yêu cầu
  • Cho phép truy vấn hồi tố
  • Chứa thông tin chi tiết về mã xác thực
  • Phát sinh chi phí sử dụng
  • Được dùng để phân tích hiệu suất
  • Cung cấp công cụ hữu ích để xác định điểm truy cập và do đó tối ưu hoá hiệu suất
  • Có thể đo lường listener-broadcast (thông báo cho người nghe), không có trong Nhật ký kiểm tra do có thể có lượng dữ liệu lớn
  • Nhẹ và theo thời gian thực, phù hợp với việc kiểm thử tải trực tiếp. Có thể mất vài phút thì các mục nhật ký kiểm tra mới xuất hiện.

Nội dung nhật ký kiểm tra tương ứng với các chỉ số của trình phân tích tài nguyên như minh hoạ bên dưới.

Tên thao tác ghi nhật ký kiểm tra Giá trị đặc biệt trong
RealtimeDatabaseAuditMetadata
Tên thao tác của trình phân tích
Kết nối RequestTypeREALTIME concurrent-connect
Ngắt kết nối RequestTypeREALTIME concurrent-disconnect
Đã đọc RequestTypeREALTIME realtime-read
Đã đọc RequestTypeREST rest-read
Viết RequestTypeREALTIME realtime-write
Viết RequestTypeREST rest-write
Cập nhật RequestTypeREALTIME.
Séc PreconditionType.
realtime-update
realtime-transaction
Cập nhật RequestTypeREST.
Séc 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