Configure o acesso apropriado para uma extensão

Para que uma extensão execute as ações especificadas, o Firebase concede a cada instância de uma extensão instalada acesso limitado ao projeto e aos dados dele por meio de uma conta de serviço .

O que é uma conta de serviço?

Uma conta de serviço é um tipo especial de conta de usuário do Google. Representa um usuário não humano que pode fazer chamadas de API autorizadas para serviços do Google.

Durante a instalação de uma extensão, o Firebase cria uma conta de serviço para a extensão no projeto. Cada instância instalada de uma extensão tem sua própria conta de serviço. Se uma instância de extensão for desinstalada, o Firebase excluirá a conta de serviço da extensão.

As contas de serviço criadas para extensões estão no formato:

ext- extension-instance-id @ project-id .iam.gserviceaccount.com

O Firebase limita o acesso de uma extensão a um projeto e seus dados atribuindo funções específicas (pacotes de permissões) à conta de serviço da extensão. Ao criar uma extensão, você determina quais funções sua extensão requer para operar e, em seguida, lista essas funções e o motivo pelo qual sua extensão precisa dessas funções em seu arquivo extension.yaml (veja o exemplo na parte inferior desta página).

Determine quais funções sua extensão exige

Ao construir sua extensão, você determina o nível de acesso que sua extensão requer para operar.

Durante a instalação, a CLI do Firebase solicita que o usuário aceite o nível de acesso concedido por cada função. Se sua extensão solicitar mais funções do que realmente precisa, será menos provável que os usuários a instalem.

  1. Determine se sua extensão interage com um produto:

    • Se a sua extensão interagir com um produto , você precisará conceder à sua extensão acesso a esse produto.

      Por exemplo, se sua extensão grava dados em uma instância do Realtime Database, ela precisa de uma função do Realtime Database (especificamente, firebasedatabase.admin ).

    • Se sua extensão apenas escuta um evento acionador de um produto , então sua extensão não precisa de uma função associada a esse produto.

      Por exemplo, se sua extensão for acionada após uma gravação em uma instância do Realtime Database (mas não gravar nada no banco de dados), sua extensão não precisará de uma função do Realtime Database.

  2. Depois de determinar com quais produtos sua extensão interage , você precisa decidir qual função é necessária para essa interação específica. Alguns produtos oferecem funções diferentes dependendo da ação ou conjunto de ações executadas.

    Por exemplo, digamos que sua extensão interage com um intervalo do Cloud Storage. O papel storage.objectCreator permitiria que a extensão criasse um objeto em um bucket do Cloud Storage, mas esse papel não permitiria que a extensão visualizasse, excluísse ou substituísse objetos. Para permitir que a extensão execute essas ações adicionais, você precisa atribuir a função storage.objectAdmin .

Consulte a seção na parte inferior desta página para visualizar todas as funções suportadas que você pode atribuir à conta de serviço da sua extensão. Para saber mais sobre a descrição de cada função e as permissões concedidas, acesse a documentação do Firebase ou a documentação do Google Cloud . Você também pode procurar funções no painel IAM e administrador do console do Google Cloud.

Como atribuir funções a uma extensão

Liste as funções do IAM necessárias para que sua extensão opere na seção roles do seu arquivo extension.yaml .

Aqui está um exemplo de uma extensão que escuta um caminho especificado do Firebase Realtime Database. Quando acionada, a extensão atualiza o e-mail da conta do usuário (interação com o Firebase Authentication) e envia uma notificação (interação com o Firebase Cloud Messaging). Observe o seguinte:

  • Mesmo que a extensão seja acionada a partir de um evento do Realtime Database, a função firebasedatabase.admin não está listada (a escuta não é considerada uma interação ).
  • Como a extensão interage com autenticação e mensagens na nuvem, a extensão requer funções para acessar esses produtos ( firebaseauth.admin e firebasenotifications.admin , respectivamente).
# 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

...

No arquivo extension.yaml , use os seguintes campos para atribuir uma função à conta de serviço de uma extensão:

Campo Tipo Descrição
role
(obrigatório)
corda Nome da função do IAM necessária para a extensão operar
reason
(obrigatório)
corda

Breve descrição do motivo pelo qual a extensão precisa do acesso concedido pela função

Certifique-se de fornecer detalhes suficientes para que o usuário possa entender como a extensão usa a função.

resource
(opcional)
corda

A qual política do IAM do recurso esta função deve ser adicionada. Se omitido, o padrão é projects/${project_id} .

Os valores suportados são projects/* e projects/*/buckets/* .

Reduza o escopo das funções

As extensões devem seguir o princípio do menor privilégio e solicitar acesso apenas aos recursos de que necessitam. Você pode limitar o escopo de acesso de uma extensão usando o campo role.resource . Por exemplo, se sua extensão precisar gravar objetos em um bucket do Cloud Storage, você poderá usar o seguinte papel:

roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}

Isso permite que a extensão acesse apenas o bucket necessário, e não outros no mesmo projeto.

Este campo oferece suporte a projetos ( projects/{project_id} ) e intervalos de armazenamento ( projects/{project_id}/buckets/{bucket_id} ).

Funções suportadas para extensões

A tabela a seguir lista as funções do IAM compatíveis para interagir com produtos do Firebase. A maioria das funções nesta tabela são funções de nível de produto do Firebase , mas algumas são gerenciadas diretamente pelo Google Cloud (especificamente, Cloud Firestore e Cloud Storage ).

Produtos Firebase

Se sua extensão interage com... Atribua uma dessas funções...
Cloud Fire Store datastore.importExportAdmin
datastore.indexAdmin
datastore.proprietário
armazenamento de dados.usuário
datastore.viewer
Armazenamento em nuvem para Firebase armazenamento.admin
armazenamento.objectAdmin
armazenamento.objectCreator
armazenamento.objectViewer
Distribuição de aplicativos Firebase firebaseappdistro.admin
firebaseappdistro.viewer
Autenticação Firebase firebaseauth.admin
firebaseauth.viewer
Teste A/B do Firebase firebaseabt.admin
firebaseabt.viewer
Mensagens na nuvem do Firebase firebasenotifications.admin
firebasenotifications.viewer
Crashlytics do Firebase firebasecrashlytics.admin
firebasecrashlytics.viewer
Hospedagem Firebase firebasehosting.admin
firebasehosting.viewer
Mensagens no aplicativo do Firebase firebaseinappmessaging.admin
firebaseinappmessaging.viewer
FirebaseML firebaseml.admin
firebaseml.viewer
Monitoramento de desempenho do Firebase firebaseperformance.viewer
firebaseperformance.leitor
firebaseperformance.escritor
Banco de dados em tempo real do Firebase firebasedatabase.admin
firebasedatabase.viewer
Regras de segurança firebaserules.viewer
firebaserules.developer
firebaserules.deployer
Google Analytics firebaseanalytics.admin
firebaseanalytics.viewer

Produtos do Google Cloud

Saiba mais sobre essas funções na documentação do Google Cloud .

Se sua extensão interage com... Atribua uma dessas funções...
Ações ações.Admin
ações.Visualizador
Apigeu apigee.analyticsAgente
apigee.analyticsEditor
apigee.analyticsViewer
apigee.apiCreator
apigee.deployer
apigee.developerAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
Motor de aplicação appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
AutoML editor automático
automl.predictor
automl.viewer
BigQuery bigquery.connectionAdmin
bigquery.connectionUser
editor bigquery.data
bigquery.dataOwner
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.user
Nuvem Bigtable bigtable.leitor
bigtable.user
bigtable.viewer
Cobrança visualizador de faturamento
Bate-papos em Hangouts chat.proprietário
chat.leitor
Ativo de nuvem cloudasset.proprietário
cloudasset.viewer
Fusão de dados em nuvem datafusion.admin
datafusion.viewer
Depurador de nuvem clouddebugger.agent
clouddebugger.user
Funções de nuvem cloudfunctions.invoker
cloudfunctions.viewer
Cloud IAP iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
IoT na nuvem cloudiot.deviceController
editor.cloudiot
cloudiot.provisioner
cloudiot.viewer
Perfil do Stackdriver cloudprofiler.agente
cloudprofiler.user
Agendador de nuvem cloudscheduler.admin
cloudscheduler.jobRunner
cloudscheduler.viewer
Verificador de segurança em nuvem cloudsecurityscanner.editor
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Nuvem SQL cloudsql.client
editor cloudsql.editor
cloudsql.viewer
Rastreamento de nuvem cloudtrace.admin
cloudtrace.agente
cloudtrace.user
Fluxo de dados dataflow.developer
fluxo de dados.viewer
fluxo de dados.worker
Fluxo de diálogo dialogflow.admin
dialogflow.client
dialogflow.reader
Prevenção contra perda de dados na nuvem dlp.leitor
dlp.user
Relatório de erros relatório de erros.user
relatório de erros.viewer
relatório de erros.writer
Eventarc eventarc.publisher
eventarc.eventReceiver
Armazenamento de arquivos na nuvem arquivo.editor
arquivo.visualizador
Exploração madeireira logging.configWriter
logging.logWriter
logging.privateLogViewer
logging.viewer
Mecanismo de aprendizado de máquina ml.desenvolvedor
ml.jobOwner
ml.modelOwner
ml.modelUser
ml.operaçãoProprietário
ml.viewer
Monitoramento monitoramento.editor
monitoramento.metricWriter
monitoramento.visualizador
Cadernos de IA notebooks.admin
notebooks.viewer
Pub/Sub pubsub.editor
pubsub.publisher
pubsub.subscriber
pubsub.viewer
Armazenamento de memória Redis redis.editor
redis.viewer
Execução na nuvem executar.invoker
Fonte fonte.leitor
fonte.escritor
Cloud Spanner spanner.databaseAdmin
spanner.databaseReader
spanner.databaseUser
chave inglesa.viewer
Uso do serviço serviceusage.apiKeysMetadataViewer
Serviço de transferência de armazenamento em nuvem storagetransfer.user
storagetransfer.viewer
Transcodificador de nuvem transcodificador.admin
transcodificador.viewer
Vértice AI aiplataforma.user
Outro identidadetoolkit.admin
identidadetoolkit.viewer