Для выполнения указанных действий расширением Firebase предоставляет каждому установленному экземпляру расширения ограниченный доступ к проекту и его данным через учетную запись службы .
Что такое сервисный аккаунт?
Сервисный аккаунт — это особый тип пользовательского аккаунта Google. Он представляет собой нечеловека, который может совершать авторизованные вызовы API к сервисам Google.
В процессе установки расширения Firebase создает для него учетную запись службы в проекте. Каждый установленный экземпляр расширения имеет свою собственную учетную запись службы. Если экземпляр расширения удаляется, Firebase удаляет учетную запись службы расширения.
Учетные записи служб, созданные для расширений, имеют следующий формат:
ext- extension-instance-id @ project-id .iam.gserviceaccount.com
Firebase limits an extension's access to a project and its data by assigning specific roles (bundles of permissions) to the service account of the extension. When you build an extension, you determine which roles your extension requires to operate, then you list these roles and the reason your extension needs these roles in your extension.yaml file (see example at the bottom of this page).
Определите, какие роли требуются для вашего расширения.
При создании расширения вы определяете уровень доступа, необходимый для его работы.
В процессе установки 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 |