Ведение журнала аудита базы данных Firebase Realtime

В этом документе описывается ведение журналов аудита для Firebase Realtime Database. Сервисы Google Cloud генерируют журналы аудита, которые записывают административные действия и действия доступа в ваших ресурсах Google Cloud . Для получения дополнительной информации о журналах аудита Cloud см. следующие разделы:

Примечания

Дополнительная информация о полях в 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 генерируют журналы аудита активности администратора .

Методы API из приведенного ниже списка, помеченные (LRO), являются длительными операциями (LRO). Эти методы обычно генерируют две записи в журнале аудита: одну при начале операции и другую при ее завершении. Для получения дополнительной информации см. раздел «Журналы аудита для длительных операций» .
Тип разрешения Методы
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 Realtime Database.

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:

  • Установление соединений в реальном времени. Операции Connect Realtime Database не регистрируют данные аутентификации, поскольку Realtime Database выполняет аутентификацию после установления соединения. Следовательно, Connect не располагает информацией об аутентификации. Объект AuthenticationInfo содержит заполнитель principalEmail со значением audit-pending-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com .

  • Аутентификация Google. Операции Realtime Database , использующие стандартную аутентификацию Google, такие как трафик из Firebase Admin SDK или REST-запросы, аутентифицированные с помощью стандартного токена OAuth , имеют объект AuthenticationInfo , содержащий фактический адрес электронной почты, используемый для ввода учетных данных.

  • Firebase Authentication . Операции Realtime Database , использующие Firebase Authentication имеют объект AuthenticationInfo , содержащий значение principalEmail , равное audit-third-party-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com . То же самое справедливо, если вы реализуете собственное решение для аутентификации, создавая пользовательские JWT-токены.

    • Если для аутентификации третьей стороны использовался JSON Web Token (JWT), поле thirdPartyPrincipal содержит заголовок и полезную нагрузку токена. Например, в журналах аудита для запросов, аутентифицированных с помощью Firebase Authentication будет содержаться токен Firebase Authentication этого запроса.
  • Отсутствие аутентификации. Операции Realtime Database , не использующие аутентификацию, имеют объект AuthenticationInfo , содержащий значение principalEmail , равное audit-no-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com Экземпляр Realtime Database с открытыми правилами безопасности может удовлетворять такие запросы. Мы рекомендуем всем пользователям надлежащим образом защитить свои базы данных.

  • Устаревшие токены секретов. Операции Realtime Database использующие устаревшие токены, имеют объект AuthenticationInfo , содержащий заполнитель principalEmail со значением audit-secret-auth@firebasedatabase-{REGION_CODE}-prod.iam.gserviceaccount.com . Для JWT, подписанных с помощью секретов, thirdPartyPrincipal содержит заголовки и полезную нагрузку JWT.

Проверка и оценка Firebase Security Rules

Журналы облачного аудита можно использовать для выявления запросов, на которые потенциально могут повлиять изменения Security Rules .

В объекте AuthorizationInfo authorization.permission может принимать одно из следующих значений:

  • firebasedatabase.data.get : Предоставлен доступ на чтение по пути, указанному в resource .
  • firebasedatabase.data.update : Предоставлены права на запись по пути, указанному в resource .
  • firebasedatabase.data.connect : Заполнитель для Connect и Disconnect . Для подключения к экземпляру Realtime Database авторизация не требуется.
  • firebasedatabase.data.cancel : Используется для Unlisten и OnDisconnectCancel . Отзыв или отмена ранее авторизованной операции не требует дополнительной авторизации.

Сопоставьте журналы облачного аудита с результатами профилирования Realtime Database

С помощью Realtime Database Realtime Database Database в сочетании с журналом аудита Realtime Database . У каждого инструмента есть свои сильные стороны.

Ведение журнала аудита облачных сервисов Профайлер Realtime Database
  • Проверяет доступ к базам данных
  • Непрерывно обрабатывает все запросы.
  • Позволяет выполнять ретроспективные запросы.
  • Содержит подробную информацию о токене авторизации.
  • Влечёт за собой расходы на использование.
  • Используется для анализа производительности.
  • Предоставляет полезные инструменты для выявления проблемных мест и, следовательно, для оптимизации производительности.
  • Можно измерить широковещательные сообщения слушателя , что недоступно в журналах аудита из-за потенциально большого объема данных.
  • Легкий и работающий в режиме реального времени, что делает его подходящим для нагрузочного тестирования. Записи в журнале аудита могут появиться через несколько минут.

Содержимое журнала аудита соответствует метрикам профилировщика, как показано ниже.

Название операции аудита Особые ценности в
RealtimeDatabaseAuditMetadata
Название операции профилировщика
Соединять RequestType is REALTIME concurrent-connect
Отключить RequestType is REALTIME одновременное отключение
Читать RequestType is REALTIME чтение в реальном времени
Читать RequestType - REST отдохнуть
Писать RequestType is REALTIME запись в реальном времени
Писать RequestType - REST rest-write
Обновлять RequestType имеет тип REALTIME .
Проверьте PreconditionType .
обновление в реальном времени
транзакция в реальном времени
Обновлять RequestTypeREST .
Проверьте PreconditionType .
rest-update
rest-transaction
СлушательСлушать RequestType is REALTIME слушатель-слушать
ListenerUnlisten RequestType is REALTIME слушатель-неслушать
OnDisconnectPut RequestType is REALTIME включение-отключение-включение
OnDisconnectUpdate RequestType is REALTIME обновление при отключении
OnDisconnectCancel RequestType is REALTIME отключение-отмена
RunOnDisconnect RequestType is REALTIME работа при отключении