В этом документе описывается ведение журнала аудита для Firebase Realtime Database. Сервисы Google Cloud создают журналы аудита, в которых регистрируются действия администратора и доступа к ресурсам Google 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 , создают журналы аудита действий администратора .
| Тип разрешения | Методы | 
|---|---|
| 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 Realtime.
 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содержит заглушку- 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 этого запроса.
 
-  Если для сторонней аутентификации использовался JSON Web Token (JWT), поле 
- Аутентификация не требуется. Операции 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
Журналы облачного аудита можно использовать для выявления запросов, на которые потенциально могут повлиять изменения 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 Profiler в сочетании с функцией ведения журнала аудита Realtime Database . Каждый инструмент имеет свои сильные стороны.
| Ведение журнала аудита облака | Профилировщик Realtime Database | 
|---|---|
| 
 | 
 | 
Содержимое журнала аудита соответствует метрикам профилировщика, как показано ниже.
| Имя операции ведения журнала аудита | Особые ценности в RealtimeDatabaseAuditMetadata | Имя операции профилировщика | 
|---|---|---|
| Соединять | RequestType—REALTIME | одновременное подключение | 
| Отключить | RequestType—REALTIME | одновременное отключение | 
| Читать | RequestType—REALTIME | чтение в реальном времени | 
| Читать | RequestType—REST | отдохни-прочитай | 
| Писать | RequestType—REALTIME | запись в реальном времени | 
| Писать | RequestType—REST | отдых-написать | 
| Обновлять | RequestType—REALTIME.Проверьте PreconditionType. | обновление в реальном времени транзакция в реальном времени | 
| Обновлять | RequestType—REST.Проверьте PreconditionType. | обновление rest-up остаток транзакции | 
| СлушательСлушать | RequestType—REALTIME | слушатель-слушатель | 
| СлушательНеслушать | RequestType—REALTIME | слушатель-неслушатель | 
| OnDisconnectPut | RequestType—REALTIME | вкл-отключение-поставить | 
| OnDisconnectUpdate | RequestType—REALTIME | обновление при отключении | 
| OnDisconnectCancel | RequestType—REALTIME | при отключении-отмене | 
| Запустить при отключении | RequestType—REALTIME | запуск при отключении |