Firebase 실시간 데이터베이스 감사 로깅

이 문서에서는 Firebase 실시간 데이터베이스의 감사 로깅을 설명합니다. Google Cloud 서비스는 Google Cloud 리소스 내의 관리 및 액세스 활동을 기록하는 감사 로그를 생성합니다. Cloud 감사 로그에 대한 자세한 내용은 다음을 참조하세요.

참고

DATA_READDATA_WRITE 작업의 protoPayload.metadata 필드에 대한 추가 정보는 참고 문서에서 확인할 수 있습니다.

서비스 이름

Firebase 실시간 데이터베이스 감사 로그에서는 서비스 이름으로 firebasedatabase.googleapis.com을 사용합니다. 이 서비스에 대한 필터:

    protoPayload.serviceName="firebasedatabase.googleapis.com"
  

권한 유형별 메서드

각 IAM 권한에는 type 속성이 포함되며 그 값은 네 가지 값(ADMIN_READ, ADMIN_WRITE, DATA_READ, DATA_WRITE) 중 하나일 수 있는 열거형입니다. 메서드를 호출하면 Firebase 실시간 데이터베이스에서 메서드를 실행하는 데 필요한 권한의 type 속성에 따라 범주가 달라지는 감사 로그를 생성합니다. DATA_READ, DATA_WRITE, ADMIN_READtype 속성 값을 가진 IAM 권한이 필요한 메서드는 데이터 액세스 감사 로그를 생성합니다. type 속성 값이 ADMIN_WRITE인 IAM 권한이 필요한 메서드는 관리자 활동 감사 로그를 생성합니다.

권한 유형 메서드
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 실시간 데이터베이스의 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"

인증 정보 감사

감사 로그 항목에는 로깅 작업을 수행한 ID에 대한 정보가 포함됩니다. 요청 호출자를 식별하려면 AuditLog 객체 내에서 다음 필드를 참조하세요.

  • 실시간 연결 설정. Realtime Database Connect 작업은 연결이 설정된 후 Realtime Database가 인증되기 때문에 인증 데이터를 로깅하지 않습니다. 따라서 Connect에 인증 정보가 포함되지 않습니다. AuthenticationInfo 객체에는 audit-pending-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com의 자리표시자 principalEmail이 포함됩니다.

  • Google 인증. Firebase Admin SDK의 트래픽 또는 표준 OAuth 토큰으로 인증된 REST 요청의 트래픽과 같은 표준 Google 인증을 사용하는 Realtime Database 작업에는 실제 사용자 인증 정보 이메일이 포함된 AuthenticationInfo 객체가 있습니다.

  • Firebase Authentication. Firebase Authentication을 사용하는 Realtime Database 작업에는 audit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.comprincipalEmail 값이 포함된 AuthenticationInfo 객체가 있습니다. 커스텀 JWT를 민팅하여 자체 인증 솔루션을 구현하는 경우에도 마찬가지입니다.

    • JSON 웹 토큰(JWT)이 서드 파티 인증에 사용된 경우 thirdPartyPrincipal 필드에는 토큰의 헤더와 페이로드가 포함됩니다. 예를 들어 Firebase Authentication으로 인증된 요청의 감사 로그에는 해당 요청의 Firebase Authentication 토큰이 포함됩니다.
  • 인증 없음. 인증을 사용하지 않는 Realtime Database 작업에는 audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.comprincipalEmail 값이 포함된 AuthenticationInfo 객체가 있습니다. 개방형 보안 규칙이 있는 Realtime Database 인스턴스는 이러한 요청을 허용할 수 있습니다. 모든 사용자가 자신의 데이터베이스를 적절하게 보호하는 것이 좋습니다.

  • 기존 보안 비밀 토큰. 기존 토큰을 사용하는 Realtime Database 작업에는 audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.comprincipalEmail 자리표시자가 포함된 AuthenticationInfo 객체가 있습니다. 보안 비밀로 서명된 JWT의 경우 thirdPartyPrincipal에 JWT 헤더 및 페이로드가 포함됩니다.

Firebase Security Rules 평가 감사

Cloud 감사 로그를 사용하여 Rules 변경의 영향을 받을 수 있는 요청을 식별할 수 있습니다.

AuthorizationInfo 객체에서 authorization.permission은 다음 중 하나일 수 있습니다.

  • firebasedatabase.data.get: resource에 지정된 경로에 부여된 읽기 액세스 권한입니다.
  • firebasedatabase.data.update: resource에 지정된 경로에 부여된 쓰기 액세스 권한입니다.
  • firebasedatabase.data.connect: ConnectDisconnect의 자리표시자입니다. Realtime Database 인스턴스에 연결하는 데 승인이 필요하지 않습니다.
  • firebasedatabase.data.cancel: UnlistenOnDisconnectCancel에 사용됩니다. 이전에 승인된 작업을 취소할 때 추가 승인이 필요하지 않습니다.

Cloud 감사 로그와 Realtime Database 프로파일러 결과의 상관 관계 분석

Realtime Database 감사 로깅과 함께 Realtime Database 프로파일러를 사용하여 Realtime Database에서 심층 성능 분석을 수행할 수 있습니다. 각 도구마다 고유한 장점이 있습니다.

Cloud 감사 로깅 Realtime Database 프로파일러
  • 데이터베이스 액세스 감사
  • 지속적으로 모든 요청 캡처
  • 소급적 쿼리 허용
  • 자세한 인증 토큰 정보 포함
  • 사용 비용 발생
  • 성능 분석에 사용됨
  • 핫스팟 식별 및 성능 최적화에 유용한 도구 제공
  • 잠재적 데이터 볼륨으로 인해 감사 로그에 제공되지 않는 listener-broadcast 측정 가능
  • 가볍고 실시간이므로, 실시간 부하 테스트에 적합합니다. 감사 로그 항목이 표시되려면 몇 분 정도 걸릴 수 있습니다.

감사 로그 콘텐츠는 아래에 표시된 프로파일러 측정항목에 해당합니다.

감사 로깅 작업 이름 RealtimeDatabaseAuditMetadata
특수 값
프로파일러 작업 이름
Connect 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