Для выполнения указанных действий расширением Firebase предоставляет каждому установленному экземпляру расширения ограниченный доступ к проекту и его данным через учетную запись службы .
Что такое сервисный аккаунт?
Сервисный аккаунт — это особый тип пользовательского аккаунта Google. Он представляет собой нечеловека, который может совершать авторизованные вызовы API к сервисам Google.
В процессе установки расширения Firebase создает для него учетную запись службы в проекте. Каждый установленный экземпляр расширения имеет свою собственную учетную запись службы. Если экземпляр расширения удаляется, Firebase удаляет учетную запись службы расширения.
Учетные записи служб, созданные для расширений, имеют следующий формат:
ext- extension-instance-id @ project-id .iam.gserviceaccount.com
Firebase ограничивает доступ расширения к проекту и его данным, назначая определенные роли (наборы разрешений) учетной записи службы расширения. При создании расширения вы определяете, какие роли необходимы для его работы, а затем перечисляете эти роли и причину, по которой расширению необходимы эти роли, в файле extension.yaml (см. пример внизу этой страницы).
Определите, какие роли требуются для вашего расширения.
При создании расширения вы определяете уровень доступа, необходимый для его работы.
В процессе установки Firebase CLI запрашивает у пользователя подтверждение уровня доступа, предоставляемого каждой ролью. Если ваше расширение запрашивает больше ролей, чем ему фактически необходимо, пользователи могут с меньшей вероятностью установить его.
Определите, взаимодействует ли ваше расширение с каким-либо продуктом:
Если ваше расширение взаимодействует с каким-либо продуктом , то вам необходимо предоставить расширению доступ к этому продукту.
Например, если ваше расширение записывает данные в экземпляр Realtime Database , то ему необходима роль Realtime Database (а именно,
firebasedatabase.admin).Если ваше расширение просто отслеживает событие, запускаемое продуктом , то ему не требуется роль, связанная с этим продуктом.
Например, если ваше расширение срабатывает при записи в экземпляр Realtime Database (но ничего не записывает в базу данных), то вашему расширению не требуется роль Realtime Database .
После того, как вы определили, с какими продуктами взаимодействует ваше расширение, вам необходимо решить, какая роль требуется для этого конкретного взаимодействия. Некоторые продукты предлагают разные роли в зависимости от выполняемого действия или набора действий.
Например, предположим, что ваше расширение взаимодействует с хранилищем Cloud Storage . Роль
storage.objectCreatorпозволит расширению создавать объекты в хранилище Cloud Storage , но не позволит ему просматривать, удалять или перезаписывать объекты. Чтобы разрешить расширению выполнять эти дополнительные действия, необходимо назначить ему рольstorage.objectAdmin.
В разделе внизу этой страницы вы найдете список всех поддерживаемых ролей , которые можно назначить учетной записи службы вашего расширения. Описание каждой роли и предоставленные ей права доступа см. в документации Firebase или документации Google Cloud . Вы также можете найти информацию о ролях в панели IAM и администрирования консоли Google Cloud.
Как назначить роли расширению
В разделе roles файла extension.yaml укажите роли IAM, необходимые для работы вашего расширения.
Вот пример расширения, которое отслеживает указанный путь к базе Firebase Realtime Database . При срабатывании расширение обновляет адрес электронной почты учетной записи пользователя (взаимодействие с Firebase Authentication ) и отправляет уведомление (взаимодействие с Firebase Cloud Messaging ). Обратите внимание на следующее:
- Несмотря на то, что расширение срабатывает от события Realtime Database , роль
firebasedatabase.adminне отображается в списке (прослушивание не считается взаимодействием ). - Поскольку расширение взаимодействует с Authentication и Cloud Messaging , для доступа к этим продуктам требуются роли (
firebaseauth.adminиfirebasenotifications.adminсоответственно).
# extension.yaml
...
# Roles assigned to the extension's service account by Firebase during installation
roles:
- role: firebaseauth.admin
reason: Required to update the email address of the user account
- role: firebasenotifications.admin
reason: Required to send a notification that the email address has been updated
...
В файле extension.yaml используйте следующие поля для назначения роли учетной записи службы расширения:
| Поле | Тип | Описание |
|---|---|---|
role(необходимый) | нить | Название роли IAM, необходимой для работы расширения. |
reason(необходимый) | нить | Краткое описание причины, по которой расширению необходимы права доступа, предоставленные данной ролью. Обязательно предоставьте достаточно подробную информацию, чтобы пользователь мог понять, как расширение использует эту роль. |
resource(необязательный) | нить | К какой политике IAM ресурса следует добавить эту роль? Если этот параметр опущен, по умолчанию используется Поддерживаемые значения: |
Сократить круг должностных обязанностей
Расширения должны следовать принципу минимальных привилегий и запрашивать доступ только к тем ресурсам, которые им необходимы. Вы можете ограничить область доступа расширения, используя поле role.resource . Например, если вашему расширению необходимо записывать объекты в хранилище Cloud Storage, вы можете использовать следующую роль:
roles:
- role: storage.objectCreator
reason: Needed in order to write
resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}
Это позволяет расширению получать доступ только к необходимому ему сегменту, а не к другим сегментам того же проекта.
Это поле поддерживает проекты ( projects/{project_id} ) и сегменты хранилища ( projects/{project_id}/buckets/{bucket_id} ).
Поддерживаемые роли для расширений
В таблице ниже перечислены поддерживаемые роли IAM для взаимодействия с продуктами Firebase. Большинство ролей в этой таблице относятся к уровню продукта Firebase , но некоторые управляются непосредственно Google Cloud (в частности, Cloud Firestore и Cloud Storage ).
Продукты Firebase
| Если ваше расширение взаимодействует с... | Назначьте одну из этих ролей... |
|---|---|
| Cloud Firestore | datastore.importExportAdmin datastore.indexAdmin datastore.owner datastore.user datastore.viewer |
| Cloud Storage for Firebase | storage.admin storage.objectAdmin storage.objectCreator storage.objectViewer |
| Firebase App Distribution | firebaseappdistro.admin firebaseappdistro.viewer |
| Firebase Authentication | firebaseauth.admin firebaseauth.viewer |
| Firebase A/B Testing | firebaseabt.admin firebaseabt.viewer |
| Firebase Cloud Messaging | firebasenotifications.admin firebasenotifications.viewer |
| Firebase Crashlytics | firebasecrashlytics.admin firebasecrashlytics.viewer |
| Firebase Hosting | firebasehosting.admin firebasehosting.viewer |
| Firebase In-App Messaging | firebaseinappmessaging.admin firebaseinappmessaging.viewer |
| Firebase ML | firebaseml.admin firebaseml.viewer |
| Firebase Performance Monitoring | firebaseperformance.viewer firebaseperformance.reader firebaseperformance.writer |
| Firebase Realtime Database | firebasedatabase.admin firebasedatabase.viewer |
| Правила безопасности | firebaserules.viewer firebaserules.developer firebaserules.deployer |
| Google Analytics | firebaseanalytics.admin firebaseanalytics.viewer |
Продукты Google Cloud
Подробнее об этих ролях можно узнать в документации Google Cloud .
| Если ваше расширение взаимодействует с... | Назначьте одну из этих ролей... |
|---|---|
| Действия | действия.Администратор действия.Просмотр |
| Апигее | apigee.analyticsAgent apigee.analyticsEditor apigee.analyticsViewer apigee.apiCreator apigee.deployer apigee.developerAdmin apigee.readOnlyAdmin apigee.synchronizerManager |
| App Engine | appengine.appAdmin appengine.appViewer appengine.codeViewer appengine.deployer appengine.serviceAdmin |
| AutoML | automl.editor automl.predictor automl.viewer |
| BigQuery | bigquery.connectionAdmin bigquery.connectionUser bigquery.dataEditor bigquery.dataOwner bigquery.dataViewer bigquery.jobUser bigquery.metadataViewer bigquery.readSessionUser bigquery.user |
| Cloud Bigtable | bigtable.reader bigtable.user bigtable.viewer |
| Выставление счетов | billing.viewer |
| Чаты Hangout | chat.owner чат.читатель |
| Облачный актив | cloudasset.owner cloudasset.viewer |
| Облачное слияние данных | datafusion.admin datafusion.viewer |
| Отладчик облачных приложений | clouddebugger.agent clouddebugger.user |
| Облачные функции | cloudfunctions.invoker cloudfunctions.viewer |
| Облачные IAP | iap.admin iap.httpsResourceAccessor iap.settingsAdmin iap.tunnelResourceAccessor |
| Облачный Интернет вещей | cloudiot.deviceController cloudiot.editor cloudiot.provisioner cloudiot.viewer |
| Профилировщик Stackdriver | cloudprofiler.agent cloudprofiler.user |
| Cloud Scheduler | cloudscheduler.admin cloudscheduler.jobRunner cloudscheduler.viewer |
| Сканер облачной безопасности | cloudsecurityscanner.editor cloudsecurityscanner.runner cloudsecurityscanner.viewer |
| Облачный SQL | cloudsql.client cloudsql.editor cloudsql.viewer |
| Облачная трассировка | cloudtrace.admin cloudtrace.agent cloudtrace.user |
| Поток данных | dataflow.developer dataflow.viewer dataflow.worker |
| Диалогфлоу | dialogflow.admin dialogflow.client dialogflow.reader |
| Предотвращение потери данных в облаке | dlp.reader dlp.user |
| Сообщение об ошибках | errorreporting.user errorreporting.viewer errorreporting.writer |
| Эвентарк | eventarc.publisher eventarc.eventReceiver |
| Облачное хранилище файлов | файл.редактор файл.просмотрщик |
| Ведение журнала | logging.configWriter logging.logWriter logging.privateLogViewer logging.viewer |
| Механизм машинного обучения | мл.разработчик ml.jobOwner ml.modelOwner ml.modelUser ml.operationOwner ml.viewer |
| Мониторинг | мониторинг.редактор monitoring.metricWriter monitoring.viewer |
| Блокноты с искусственным интеллектом | notebooks.admin notebooks.viewer |
| Pub/Sub | pubsub.editor pubsub.publisher pubsub.subscriber pubsub.viewer |
| Memorystore Redis | redis.editor redis.viewer |
| Cloud Run | run.invoker |
| Источник | источник.читатель источник.писатель |
| Облачный гальник | spanner.databaseAdmin spanner.databaseReader spanner.databaseUser spanner.viewer |
| Использование сервиса | serviceusage.apiKeysMetadataViewer |
| Сервис переноса данных в облачное хранилище | storagetransfer.user storagetransfer.viewer |
| Облачный транскодер | transcoder.admin транскодер.просмотрщик |
| Vertex AI | aiplatform.user |
| Другой | identitytoolkit.admin identitytoolkit.viewer |