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.
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.
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çãostorage.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
efirebasenotifications.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 é Os valores suportados são |
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 |