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 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. Ele representa um usuário não humano que pode fazer chamadas de API autorizadas para os 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 aos respectivos dados
atribuindo papéis (pacotes de permissões)
específicos à conta de serviço da extensão. Ao criar uma extensão, você determina de quais papéis ela precisa para funcionar e, em seguida, lista esses papéis e o motivo pelo qual a extensão precisa deles no arquivo extension.yaml
(veja o exemplo na parte inferior de nesta página).
Determinar quais papéis sua extensão exige
Ao criar sua extensão, você determina o nível de acesso que ela precisa para funcionar.
Durante a instalação, a Firebase CLI solicita que o usuário aceite o nível de acesso concedido por cada papel. Se sua extensão solicitar mais papéis do que realmente precisa, será menos provável que os usuários a instalem.
Determine se a extensão interage com um produto:
Se a extensão interagir com um produto, será necessário conceder a ela acesso a esse produto.
Por exemplo, se a extensão gravar dados em uma instância do Realtime Database, ela precisará de um papel do Realtime Database (especificamente,
firebasedatabase.admin
).Se a extensão apenas ouvir um evento de gatilho de um produto, ela não precisará de um papel associado a esse produto.
Por exemplo, se sua extensão acionar uma gravação de uma instância do Realtime Database (mas não gravar nada no banco de dados), ela não precisará de um papel do Realtime Database.
Depois de determinar com quais produtos sua extensão interage, você precisa decidir qual papel é necessário para essa interação específica. Alguns produtos oferecem funções diferentes, dependendo da ação ou do conjunto de ações realizadas.
Por exemplo, digamos que sua extensão interaja com um bucket do Cloud Storage. O papel
storage.objectCreator
permite que a extensão crie um objeto em um bucket do Cloud Storage, mas esse papel não permite que a extensão visualize, exclua ou substitua objetos. Para ativar a extensão para executar essas ações adicionais, é necessário atribuir o papelstorage.objectAdmin
.
Consulte a seção na parte inferior desta página para ver todos os papéis compatíveis que você pode atribuir à conta de serviço da sua extensão. Para saber mais sobre a descrição e as permissões concedidas de cada papel, acesse a documentação do Firebase ou a documentação do Google Cloud. Também é possível procurar papéis no painel do IAM e do administrador do Console do Google Cloud.
Como atribuir papéis a uma extensão
Liste os papéis do IAM necessários para que a extensão funcione na seção roles
do arquivo extension.yaml
.
Veja aqui um exemplo de extensão que detecta um caminho específico do Firebase Realtime Database. Quando acionada, a extensão atualiza um e-mail de conta de 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, o papel
firebasedatabase.admin
não está listado (ouvir não é considerado uma interação). - Como a extensão interage com o Authentication e o Cloud Messaging, ela requer papéis 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 um papel à conta de serviço de uma extensão:
Campo | Tipo | Descrição |
---|---|---|
role (obrigatório) |
string | Nome do papel do IAM exigido pela extensão para funcionar |
reason (obrigatório) |
string |
Breve descrição do motivo pelo qual a extensão precisa do acesso concedido pelo papel Forneça detalhes suficientes para que o usuário possa entender como a extensão usa o papel. |
resource (opcional) |
string |
A que política de IAM do recurso este papel deve ser adicionado. Se omitido, o padrão será
Os valores aceitos são |
Reduzir o escopo das funções
As extensões precisam seguir o princípio do menor privilégio e solicitar acesso apenas aos recursos necessários.
É possível limitar o escopo de acesso de uma extensão usando o campo role.resource
.
Por exemplo, se a extensão precisar gravar objetos em um bucket do Cloud Storage, use 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 é compatível com projetos (projects/{project_id}
) e buckets do Storage (projects/{project_id}/buckets/{bucket_id}
).
Papéis compatíveis com extensões
A tabela a seguir lista os papéis do IAM compatíveis para interagir com os produtos do Firebase. A maioria dos papéis nesta tabela são Papéis no nível do produto do Firebase, mas alguns são gerenciados diretamente pelo Google Cloud (especificamente, Cloud Firestore e Cloud Storage).
Produtos do Firebase
Se sua extensão interagir com... | Atribuir um destes papéis... |
---|---|
Cloud Firestore |
datastore.importExportAdmin datastore.indexAdmin datastore.owner datastore.user datastore.viewer |
Cloud Storage para Firebase |
storage.admin storage.objectAdmin storage.objectCreator storage.objectViewer |
Firebase App Distribution |
firebaseappdistro.admin firebaseappdistro.viewer |
Firebase Authentication |
firebaseauth.admin firebaseauth.viewer |
Teste A/B do Firebase |
firebaseabt.admin firebaseabt.viewer |
Firebase Cloud Messaging |
firebasenotifications.admin firebasenotifications.viewer |
Firebase Crashlytics |
firebasecrashlytics.admin firebasecrashlytics.viewer |
Firebase Hosting |
firebasehosting.admin firebasehosting.viewer |
Mensagens no app do Firebase |
firebaseinappmessaging.admin firebaseinappmessaging.viewer |
Firebase ML |
firebaseml.admin firebaseml.viewer |
Monitoramento de desempenho do Firebase |
firebaseperformance.viewer firebaseperformance.reader firebaseperformance.writer |
Firebase Realtime Database |
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 esses papéis na documentação do Google Cloud.
Se sua extensão interagir com... | Atribuir um destes papéis... |
---|---|
Ações |
actions.Admin actions.Viewer |
Apigee |
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 |
Faturamento | billing.viewer |
Chats do Hangouts |
chat.owner chat.reader |
Recurso do Cloud |
cloudasset.owner cloudasset.viewer |
Cloud Data Fusion |
datafusion.admin datafusion.viewer |
Cloud Debugger |
clouddebugger.agent clouddebugger.user |
Cloud Functions |
cloudfunctions.invoker cloudfunctions.viewer |
Cloud IAP |
iap.admin iap.httpsResourceAccessor iap.settingsAdmin iap.tunnelResourceAccessor |
Cloud IoT |
cloudiot.deviceController cloudiot.editor cloudiot.provisioner cloudiot.viewer |
Stackdriver Profiler |
cloudprofiler.agent cloudprofiler.user |
Cloud Scheduler |
cloudscheduler.admin cloudscheduler.jobRunner cloudscheduler.viewer |
Cloud Security Scanner |
cloudsecurityscanner.editor cloudsecurityscanner.runner cloudsecurityscanner.viewer |
Cloud SQL |
cloudsql.client cloudsql.editor cloudsql.viewer |
Cloud Trace |
cloudtrace.admin cloudtrace.agent cloudtrace.user |
Dataflow |
dataflow.developer dataflow.viewer dataflow.worker |
Dialogflow |
dialogflow.admin dialogflow.client dialogflow.reader |
Cloud Data Loss Prevention |
dlp.reader dlp.user |
Error Reporting |
errorreporting.user errorreporting.viewer errorreporting.writer |
Eventarc |
eventarc.publisher eventarc.eventReceiver |
Cloud Filestore |
file.editor file.viewer |
Logging |
logging.configWriter logging.logWriter logging.privateLogViewer logging.viewer |
Machine Learning Engine |
ml.developer ml.jobOwner ml.modelOwner ml.modelUser ml.operationOwner ml.viewer |
Monitoring |
monitoring.editor monitoring.metricWriter monitoring.viewer |
Notebooks de IA |
notebooks.admin notebooks.viewer |
Pub/Sub |
pubsub.editor pubsub.publisher pubsub.subscriber pubsub.viewer |
Memorystore para Redis |
redis.editor redis.viewer |
Cloud Run | run.invoker |
Origem |
source.reader source.writer |
Cloud Spanner |
spanner.databaseAdmin spanner.databaseReader spanner.databaseUser spanner.viewer |
Service Usage | serviceusage.apiKeysMetadataViewer |
Serviço de transferência do Cloud Storage |
storagetransfer.user storagetransfer.viewer |
Transcodificador do Cloud |
transcoder.admin transcoder.viewer |
Vertex AI | aiplatform.user |
Outros |
identitytoolkit.admin identitytoolkit.viewer |