Чтобы расширение могло выполнять указанные действия, Firebase предоставляет каждому экземпляру установленного расширения ограниченный доступ к проекту и его данным через сервисную учетную запись .
Что такое сервисный аккаунт?
Сервисный аккаунт – это особый тип учетной записи пользователя Google. Он представляет собой пользователя, не являющегося человеком, который может выполнять авторизованные вызовы API к службам Google.
Во время установки расширения Firebase создает в проекте сервисную учетную запись для расширения. Каждый установленный экземпляр расширения имеет собственную учетную запись службы. Если экземпляр расширения удален, Firebase удаляет сервисный аккаунт расширения.
Учетные записи служб, созданные для расширений, имеют формат:
ext- extension-instance-id @ project-id .iam.gserviceaccount.com
Firebase ограничивает доступ расширения к проекту и его данным, назначая определенные роли (наборы разрешений) сервисной учетной записи расширения. Когда вы создаете расширение, вы определяете, какие роли требуются для работы вашего расширения, затем вы указываете эти роли и причину, по которой вашему расширению нужны эти роли, в файле extension.yaml
(см. пример внизу этой страницы).
Определите, какие роли требуются вашему расширению
При создании расширения вы определяете уровень доступа, необходимый для работы вашего расширения.
Во время установки интерфейс командной строки Firebase предлагает пользователю принять уровень доступа, предоставленный каждой ролью. Если ваше расширение запрашивает больше ролей, чем ему действительно нужно, вероятность того, что пользователи его установят, будет меньше.
Определите, взаимодействует ли ваше расширение с продуктом:
Если ваше расширение взаимодействует с продуктом , вам необходимо предоставить расширению доступ к этому продукту.
Например, если ваше расширение записывает данные в экземпляр Realtime Database , тогда вашему расширению потребуется роль Realtime Database (в частности,
firebasedatabase.admin
).Если ваше расширение просто прослушивает триггерное событие от продукта , то вашему расширению не нужна роль, связанная с этим продуктом.
Например, если ваше расширение срабатывает при записи в экземпляр Realtime Database (но ничего не записывает в базу данных), то вашему расширению не требуется роль Realtime Database .
После того, как вы определили, с какими продуктами взаимодействует ваше расширение, вам необходимо решить, какая роль требуется для этого конкретного взаимодействия. Некоторые продукты предлагают разные роли в зависимости от выполняемого действия или набора действий.
Например, предположим, что ваше расширение взаимодействует с сегментом Cloud Storage . Роль
storage.objectCreator
позволит расширению создавать объекты в сегменте Cloud Storage , но эта роль не позволит расширению просматривать, удалять или перезаписывать объекты. Чтобы расширение могло выполнять эти дополнительные действия, вам необходимо вместо этого назначить рольstorage.objectAdmin
.
Обратитесь к разделу внизу этой страницы, чтобы просмотреть все поддерживаемые роли , которые вы можете назначить сервисной учетной записи вашего расширения. Чтобы узнать об описании каждой роли и предоставленных разрешениях, посетите документацию Firebase или документацию Google Cloud . Вы также можете найти роли в панели IAM и администратора консоли Google Cloud.
Как назначить роли расширению
Перечислите роли IAM, необходимые для работы вашего расширения, в разделе roles
вашего файла extension.yaml
.
Вот пример расширения, которое прослушивает указанный путь к 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 | Firebase Performance.viewer Firebase Performance.reader Firebase Performance.писатель |
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.analytics apigee.analyticsViewer apigee.apiCreator apigee.deployer apigee.developerАдминистратор apigee.readOnlyAdmin apigee.synchronizerManager |
App Engine | appengine.appAdmin appengine.appViewer appengine.codeViewer appengine.deployer appengine.serviceAdmin |
АвтоМЛ | automl.editor automl.predictor automl.viewer |
Большой запрос | bigquery.connectionАдминистратор bigquery.connectionПользователь bigquery.dataEditor bigquery.dataOwner bigquery.dataViewer bigquery.jobUser bigquery.metadataViewer bigquery.readSessionUser bigquery.user |
Облачный большой стол | bigtable.reader bigtable.user bigtable.viewer |
Биллинг | Billing.viewer |
Чаты видеовстречи | чат.владелец чат.читатель |
Облачный актив | облакоассет.владелец CloudAsset.Viewer |
Объединение облачных данных | datafusion.admin datafusion.viewer |
Облачный отладчик | Clouddebugger.agent Clouddebugger.user |
Облачные функции | Cloudfunctions.invoker Cloudfunctions.viewer |
Облачный IAP | iap.admin iap.httpsResourceAccessor iap.settingsАдминистратор iap.tunnelResourceAccessor |
Облачный Интернет вещей | Cloudiot.deviceController Cloudiot.editor Cloudiot.provisioner Cloudiot.viewer |
Профилировщик стека | Cloudprofiler.agent Cloudprofiler.user |
Cloud Scheduler | Cloudscheduler.admin Cloudscheduler.jobRunner Cloudscheduler.viewer |
Облачный сканер безопасности | Cloudsecurityscanner.editor Cloudsecurityscanner.runner Cloudsecurityscanner.viewer |
Облачный SQL | Cloudsql.клиент Cloudsql.editor Cloudsql.viewer |
Облачный след | Cloudtrace.admin Cloudtrace.agent Cloudtrace.user |
Поток данных | dataflow.developer dataflow.viewer поток данных.работник |
Диалоговый поток | диалоговый поток.админ диалоговый поток.клиент диалоговый поток.читатель |
Предотвращение потери облачных данных | dlp.reader dlp.user |
Отчеты об ошибках | errorreporting.user errorreporting.viewer errorreporting.писатель |
Эвентарк | eventarc.publisher eventarc.eventReceiver |
Облачное хранилище файлов | файл.редактор просмотрщик файлов |
Ведение журнала | logging.configWriter журналирование.logWriter logging.privateLogViewer logging.viewer |
Механизм машинного обучения | мл.разработчик ml.jobOwner ml.modelOwner ml.modelUser ml.operationOwner мл.просмотрщик |
Мониторинг | редактор мониторинга мониторинг.metricWriter мониторинг.просмотрщик |
Ноутбуки с искусственным интеллектом | ноутбуки.админ блокноты.просмотрщик |
Pub/Sub | pubsub.редактор pubsub.издатель pubsub.подписчик pubsub.viewer |
Хранилище памяти Redis | Redis.editor redis.viewer |
Облачный бег | run.invoker |
Источник | источник.читатель источник.писатель |
Облачный гаечный ключ | спанер.databaseAdmin спанер.databaseReader спанер.databaseUser гаечный ключ.просмотрщик |
Использование сервиса | serviceusage.apiKeysMetadataViewer |
Служба передачи облачного хранилища | StorageTransfer.user StorageTransfer.viewer |
Облачный транскодер | transcoder.admin транскодер.просмотрщик |
Вертексный ИИ | aiplatform.user |
Другой | идентичностьtoolkit.admin Identitytoolkit.viewer |