Чтобы расширение могло выполнять указанные действия, Firebase предоставляет каждому экземпляру установленного расширения ограниченный доступ к проекту и его данным через сервисную учетную запись .
Что такое сервисный аккаунт?
Сервисный аккаунт – это особый тип учетной записи пользователя Google. Он представляет собой пользователя, не являющегося человеком, который может выполнять авторизованные вызовы API к службам Google.
Во время установки расширения Firebase создает в проекте сервисную учетную запись для расширения. Каждый установленный экземпляр расширения имеет собственную учетную запись службы. Если экземпляр расширения удален, Firebase удаляет сервисный аккаунт расширения.
Учетные записи служб, созданные для расширений, имеют формат:
ext- extension-instance-id @ project-id .iam.gserviceaccount.com
Firebase ограничивает доступ расширения к проекту и его данным, назначая определенные роли (наборы разрешений) сервисной учетной записи расширения. Когда вы создаете расширение, вы определяете, какие роли требуются для работы вашего расширения, затем вы указываете эти роли и причину, по которой вашему расширению нужны эти роли, в файле extension.yaml
(см. пример внизу этой страницы).
Определите, какие роли требуются вашему расширению
При создании расширения вы определяете уровень доступа, необходимый для работы вашего расширения.
Во время установки интерфейс командной строки Firebase предлагает пользователю принять уровень доступа, предоставленный каждой ролью. Если ваше расширение запрашивает больше ролей, чем ему действительно нужно, вероятность того, что пользователи его установят, будет меньше.
Определите, взаимодействует ли ваше расширение с продуктом:
Если ваше расширение взаимодействует с продуктом , вам необходимо предоставить расширению доступ к этому продукту.
Например, если ваше расширение записывает данные в экземпляр базы данных реального времени, тогда вашему расширению потребуется роль базы данных реального времени (в частности,
firebasedatabase.admin
).Если ваше расширение просто прослушивает триггерное событие от продукта , то вашему расширению не нужна роль, связанная с этим продуктом.
Например, если ваше расширение срабатывает при записи в экземпляр базы данных реального времени (но ничего не записывает в базу данных), то вашему расширению не требуется роль базы данных реального времени.
После того, как вы определили, с какими продуктами взаимодействует ваше расширение, вам необходимо решить, какая роль требуется для этого конкретного взаимодействия. Некоторые продукты предлагают разные роли в зависимости от выполняемого действия или набора действий.
Например, предположим, что ваше расширение взаимодействует с сегментом Cloud Storage. Роль
storage.objectCreator
позволит расширению создавать объекты в сегменте Cloud Storage, но эта роль не позволит расширению просматривать, удалять или перезаписывать объекты. Чтобы расширение могло выполнять эти дополнительные действия, вам необходимо вместо этого назначить рольstorage.objectAdmin
.
Обратитесь к разделу внизу этой страницы, чтобы просмотреть все поддерживаемые роли , которые вы можете назначить сервисной учетной записи вашего расширения. Чтобы узнать об описании каждой роли и предоставленных разрешениях, посетите документацию Firebase или документацию Google Cloud . Вы также можете найти роли в панели IAM и администратора консоли Google Cloud.
Как назначить роли расширению
Перечислите роли IAM, необходимые для работы вашего расширения, в разделе roles
вашего файла extension.yaml
.
Вот пример расширения, которое прослушивает указанный путь к базе данных Firebase Realtime. При запуске расширение обновляет адрес электронной почты учетной записи пользователя (взаимодействие с Firebase Authentication) и отправляет уведомление (взаимодействие с Firebase Cloud Messaging). Обратите внимание на следующее:
- Несмотря на то, что расширение срабатывает из-за события базы данных реального времени, роль
firebasedatabase.admin
не указана (прослушивание не считается взаимодействием ). - Поскольку расширение взаимодействует с аутентификацией и облачными сообщениями, ему требуются роли для доступа к этим продуктам (
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
Если ваше расширение взаимодействует с... | Назначьте одну из этих ролей... |
---|---|
Облачный пожарный магазин | datastore.importExportAdmin datastore.indexAdmin datastore.owner datastore.user datastore.viewer |
Облачное хранилище для Firebase | Storage.admin Storage.objectAdmin Storage.objectCreator Storage.objectViewer |
Распространение приложений Firebase | firebaseappdistro.admin firebaseappdistro.viewer |
Аутентификация Firebase | firebaseauth.admin firebaseauth.viewer |
A/B-тестирование Firebase | firebaseabt.admin Firebaseabt.viewer |
Облачный обмен сообщениями Firebase | firebasenotifications.admin firebasenotifications.viewer |
Firebase Крашлитикс | firebasecrashlytics.admin Firebasecrashlytics.viewer |
Хостинг Firebase | firebasehosting.admin firebasehosting.viewer |
Обмен сообщениями Firebase внутри приложения | firebaseinappmessaging.admin Firebaseinappmessaging.viewer |
Firebase ML | firebaseml.admin firebaseml.viewer |
Мониторинг производительности Firebase | Firebase Performance.viewer Firebase Performance.reader Firebase Performance.писатель |
База данных Firebase в реальном времени | firebasedatabase.admin firebasedatabase.viewer |
Правила безопасности | firebaserules.viewer firebaserules.developer firebaserules.deployer |
Гугл Аналитика | firebaseanalytics.admin Firebaseanalytics.viewer |
Продукты Google Cloud
Подробнее об этих ролях читайте в документации Google Cloud .
Если ваше расширение взаимодействует с... | Назначьте одну из этих ролей... |
---|---|
Действия | действия.Администратор действия.Просмотрщик |
Апигей | apigee.analyticsAgent редактор apigee.analytics apigee.analyticsViewer apigee.apiCreator apigee.deployer apigee.developerАдминистратор apigee.readOnlyAdmin apigee.synchronizerManager |
Механизм приложений | appengine.appAdmin appengine.appViewer appengine.codeViewer appengine.deployer appengine.serviceAdmin |
АвтоМЛ | automl.editor automl.predictor automl.viewer |
Большой запрос | bigquery.connectionАдминистратор bigquery.connectionUser 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 |
Облачный планировщик | 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 мониторинг.просмотрщик |
Ноутбуки с искусственным интеллектом | ноутбуки.админ блокноты.просмотрщик |
Паб/Саб | pubsub.редактор pubsub.издатель pubsub.подписчик pubsub.viewer |
Хранилище памяти Redis | Redis.editor redis.viewer |
Облачный бег | run.invoker |
Источник | источник.читатель источник.писатель |
Облачный гаечный ключ | спанер.databaseAdmin спанер.databaseReader спанер.databaseUser гаечный ключ.просмотрщик |
Использование сервиса | serviceusage.apiKeysMetadataViewer |
Служба передачи облачного хранилища | StorageTransfer.user StorageTransfer.viewer |
Облачный транскодер | транскодер.админ транскодер.просмотрщик |
Вертексный ИИ | aiplatform.user |
Другой | идентичностьtoolkit.admin Identitytoolkit.viewer |