Segurança para bibliotecas de cliente do servidor

Quando usa as bibliotecas cliente de servidor para o Firestore, pode gerir o acesso aos seus recursos com a gestão de identidade e de acesso (IAM). O IAM permite-lhe conceder acesso mais detalhado a recursos específicos e impede o acesso indesejado a outros recursos. Google Cloud Esta página descreve as autorizações e as funções do IAM para o Firestore. Para uma descrição detalhada do IAM, leia a documentação do IAM.

O IAM permite-lhe adotar o princípio de segurança do menor privilégio, pelo que concede apenas o acesso necessário aos seus recursos.

O IAM permite-lhe controlar quem (utilizador) tem autorização para quê (função) em que recursos através da definição de políticas de IAM. As políticas de IAM concedem uma ou mais funções a um utilizador, o que lhe dá determinadas autorizações. Por exemplo, pode conceder a função datastore.indexAdmin a um utilizador, o que lhe permite criar, modificar, eliminar, listar ou ver índices.

Autorizações e funções

Esta secção resume as autorizações e as funções suportadas pelo Firestore.

Autorizações necessárias para métodos da API

A tabela seguinte lista as autorizações que o autor da chamada tem de ter para realizar cada ação:

Método Autorizações necessárias
projects.databases.documents
batchGet datastore.entities.get
batchWrite atualização ou transformação com a condição prévia exists definida como false datastore.entities.create
batchWrite atualização ou transformação com a condição prévia exists definida como true datastore.entities.create
batchWrite atualize ou transforme sem pré-condição datastore.entities.create
datastore.entities.update
beginTransaction datastore.databases.get
commit atualização ou transformação com a condição prévia exists definida como false datastore.entities.create
commit atualização ou transformação com a condição prévia exists definida como true datastore.entities.update
commit atualize ou transforme sem pré-condição datastore.entities.create
datastore.entities.update
commit eliminar datastore.entities.delete
createDocument datastore.entities.create
delete datastore.entities.delete
get datastore.entities.get
list datastore.entities.get
datastore.entities.list
listCollectionIds datastore.entities.list
partitionQuery datastore.entities.get
datastore.entities.list
patch datastore.entities.update
rollback datastore.databases.get
runAggregationQuery datastore.entities.get
datastore.entities.list
runQuery datastore.entities.get
datastore.entities.list
write (RPC) atualização ou transformação com a condição prévia exists definida como false datastore.entities.create
write (RPC) atualização ou transformação com a condição prévia exists definida como true datastore.entities.update
write (RPC) atualize ou transforme sem pré-condição datastore.entities.create
datastore.entities.update
write (RPC) eliminar datastore.entities.delete
projects.databases.indexes
create datastore.indexes.create
delete datastore.indexes.delete
get datastore.indexes.get
list datastore.indexes.list
projects.databases
create datastore.databases.create

Se o seu pedido create contiver um valor tags, são necessárias as seguintes autorizações adicionais:

  • datastore.databases.createTagBinding

Se quiser verificar se as associações de etiquetas estão definidas com êxito listando as associações, são necessárias as seguintes autorizações adicionais:

  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
delete datastore.databases.delete
get datastore.databases.getMetadata
list datastore.databases.list
patch datastore.databases.update
restaurar datastore.backups.restoreDatabase
clone datastore.databases.clone

Se o seu pedido clone contiver um valor tags, são necessárias as seguintes autorizações adicionais:

  • datastore.databases.createTagBinding

Se quiser verificar se as associações de etiquetas estão definidas com êxito listando as associações, são necessárias as seguintes autorizações adicionais:

  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
projects.locations
get datastore.locations.get
list datastore.locations.list
projects.databases.backupschedules
receber datastore.backupSchedules.get
lista datastore.backupSchedules.list
criar datastore.backupSchedules.create
Atualizar datastore.backupSchedules.update
eliminar datastore.backupSchedules.delete
projects.locations.backups
receber datastore.backups.get
lista datastore.backups.list
eliminar datastore.backups.delete

Funções predefinidas

Com o IAM, todos os métodos da API no Firestore requerem que a conta que faz o pedido da API tenha as autorizações adequadas para usar o recurso. As autorizações são concedidas através da definição de políticas que concedem funções a um utilizador, um grupo ou uma conta de serviço. Além das funções primitivas, proprietário, editor e leitor, pode conceder funções do Firestore aos utilizadores do seu projeto.

A tabela seguinte lista as funções da IAM do Firestore. Pode conceder várias funções a um utilizador, um grupo ou uma conta de serviço.

Função Autorizações Descrição
roles/datastore.owner appengine.applications.get

datastore.*

resourcemanager.projects.get
resourcemanager.projects.list
Acesso total ao Firestore.
roles/datastore.user appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.*
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list
Acesso de leitura/escrita aos dados numa base de dados do Firestore. Destinado a programadores de aplicações e contas de serviço.
roles/datastore.viewer appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.get
datastore.entities.list
datastore.indexes.get
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list

datastore.insights.get
Acesso de leitura a todos os recursos do Firestore.
roles/datastore.importExportAdmin appengine.applications.get
datastore.databases.export
datastore.databases.getMetadata
datastore.databases.import
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
resourcemanager.projects.get
resourcemanager.projects.list
Acesso total para gerir importações e exportações.
roles/datastore.bulkAdmin resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.databases.bulkDelete
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
Acesso total para gerir operações em massa.
roles/datastore.indexAdmin appengine.applications.get

datastore.databases.getMetadata

datastore.indexes.*

datastore.operations.list

datastore.operations.get

resourcemanager.projects.get
resourcemanager.projects.list
Acesso total para gerir definições de índice.
roles/datastore.keyVisualizerViewer datastore.databases.getMetadata
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
resourcemanager.projects.get
resourcemanager.projects.list
Acesso total às análises do visualizador de chaves.
roles/datastore.backupSchedulesViewer datastore.backupSchedules.get
datastore.backupSchedules.list
Acesso de leitura a agendamentos de cópias de segurança numa base de dados do Firestore.
roles/datastore.backupSchedulesAdmin datastore.backupSchedules.get
datastore.backupSchedules.list
datastore.backupSchedules.create
datastore.backupSchedules.update
datastore.backupSchedules.delete
datastore.databases.list
datastore.databases.getMetadata
Acesso total a agendamentos de cópias de segurança numa base de dados do Firestore.
roles/datastore.backupsViewer datastore.backups.get
datastore.backups.list
Acesso de leitura a informações de cópias de segurança numa localização do Firestore.
roles/datastore.backupsAdmin datastore.backups.get
datastore.backups.list
datastore.backups.delete
Acesso total às cópias de segurança numa localização do Firestore.
roles/datastore.restoreAdmin datastore.backups.get
datastore.backups.list
datastore.backups.restoreDatabase
datastore.databases.list
datastore.databases.create
datastore.databases.getMetadata
datastore.operations.list
datastore.operations.get
Capacidade de restaurar uma cópia de segurança do Firestore numa nova base de dados. Esta função também permite criar novas bases de dados, não necessariamente através do restauro a partir de uma cópia de segurança.
roles/datastore.cloneAdmin datastore.databases.clone
datastore.databases.list
datastore.databases.create
datastore.databases.getMetadata
datastore.operations.list
datastore.operations.get
Capacidade de clonar uma base de dados do Firestore numa nova base de dados. Esta função também permite criar novas bases de dados, não necessariamente através da clonagem.
roles/datastore.statisticsViewer resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.insights.get
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
datastore.statistics.list
datastore.statistics.get
Acesso de leitura a estatísticas, informações e análises do visualizador de chaves.

Funções personalizadas

Se as funções predefinidas não satisfizerem os requisitos da sua empresa, pode definir as suas próprias funções personalizadas com as autorizações que especificar:

Funções necessárias para criar e gerir etiquetas

Se alguma etiqueta estiver representada em ações de criação ou restauro, são necessárias algumas funções. Consulte o artigo Criar e gerir etiquetas para ver mais detalhes sobre a criação de pares chave-valor de etiquetas antes de os associar aos recursos da base de dados.

As autorizações indicadas abaixo são necessárias.

Ver etiquetas
  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
Faça a gestão de etiquetas em recursos

É necessária a seguinte autorização para o recurso de base de dados ao qual está a anexar o valor da etiqueta.

  • datastore.databases.createTagBinding

Autorizações

A tabela seguinte indica as autorizações suportadas pelo Firestore.

Nome da autorização da base de dados Descrição
datastore.databases.get Iniciar ou reverter uma transação.
datastore.databases.import Importar entidades para uma base de dados.
datastore.databases.export Exporte entidades de uma base de dados.
datastore.databases.bulkDelete Elimine entidades em massa de uma base de dados.
datastore.databases.getMetadata Ler metadados de uma base de dados.
datastore.databases.list Apresenta as bases de dados num projeto.
datastore.databases.create Crie uma base de dados.
datastore.databases.update Atualize uma base de dados.
datastore.databases.delete Eliminar uma base de dados.
datastore.databases.clone Clone uma base de dados.
datastore.databases.createTagBinding Crie uma associação de etiquetas para uma base de dados.
datastore.databases.deleteTagBinding Elimine uma vinculação de etiqueta para uma base de dados.
datastore.databases.listTagBindings Apresenta todas as associações de etiquetas de uma base de dados.
datastore.databases.listEffectiveTagBindings Liste as associações de etiquetas eficazes para uma base de dados.
Nome da autorização da entidade Descrição
datastore.entities.create Crie um documento.
datastore.entities.delete Elimine um documento.
datastore.entities.get Ler um documento.
datastore.entities.list Listar os nomes dos documentos num projeto.
(É necessário datastore.entities.get para aceder aos dados do documento.)
datastore.entities.update Atualize um documento.
Nome da autorização de índice Descrição
datastore.indexes.create Crie um índice.
datastore.indexes.delete Elimine um índice.
datastore.indexes.get Ler metadados de um índice.
datastore.indexes.list Apresenta os índices num projeto.
datastore.indexes.update Atualize um índice.
Nome da autorização de operação Descrição
datastore.operations.cancel Cancele uma operação de longa duração.
datastore.operations.delete Elimine uma operação de longa duração.
datastore.operations.get Obtém o estado mais recente de uma operação de execução longa.
datastore.operations.list Apresentar operações de longa duração.
Nome da autorização do projeto Descrição
resourcemanager.projects.get Procurar recursos no projeto.
resourcemanager.projects.list Apresentar projetos detidos.
Nome da autorização de acesso à localização Descrição
datastore.locations.get Obter detalhes sobre a localização de uma base de dados. Necessário para criar uma nova base de dados.
datastore.locations.list Indicar as localizações de bases de dados disponíveis. Necessário para criar uma nova base de dados.
Nome da autorização do Key Visualizer Descrição
datastore.keyVisualizerScans.get Obtenha detalhes sobre as análises do visualizador de chaves.
datastore.keyVisualizerScans.list Indicar as análises do visualizador de chaves disponíveis.
Nome da autorização do agendamento de cópias de segurança Descrição
datastore.backupSchedules.get Obter detalhes sobre uma programação de cópias de segurança.
datastore.backupSchedules.list Listar agendamentos de cópias de segurança disponíveis.
datastore.backupSchedules.create Crie um agendamento de cópias de segurança.
datastore.backupSchedules.update Atualize um agendamento de cópias de segurança.
datastore.backupSchedules.delete Elimine um agendamento de cópia de segurança.
Nome da autorização de cópia de segurança Descrição
datastore.backups.get Veja detalhes sobre uma cópia de segurança.
datastore.backups.list Listar as cópias de segurança disponíveis.
datastore.backups.delete Elimine uma cópia de segurança.
datastore.backups.restoreDatabase Restaure uma base de dados a partir de uma cópia de segurança.
Nome da autorização de estatísticas Descrição
datastore.insights.get Aceda a estatísticas de um recurso

Latência da alteração de função

O Firestore armazena em cache as autorizações de IAM durante 5 minutos, pelo que uma alteração de função demora até 5 minutos a entrar em vigor.

Faça a gestão do IAM do Firestore

Pode obter e definir políticas de IAM através da Google Cloud consola, da API IAM ou da ferramenta de linha de comandos gcloud. Consulte o artigo Conceder, alterar e revogar o acesso de membros do projeto para ver detalhes.

Configure autorizações de acesso condicional

Pode usar as condições do IAM para definir e aplicar o controlo de acesso condicional.

Por exemplo, a seguinte condição atribui a um principal a função datastore.user até uma data especificada:

{
  "role": "roles/datastore.user",
  "members": [
    "user:travis@example.com"
  ],
  "condition": {
    "title": "Expires_December_1_2023",
    "description": "Expires on December 1, 2023",
    "expression":
      "request.time < timestamp('2023-12-01T00:00:00.000Z')"
  }
}

Para saber como definir condições da IAM para acesso temporário, consulte o artigo Configure o acesso temporário.

Para saber como configurar as condições da IAM para o acesso a uma ou mais bases de dados, consulte o artigo Configure as condições de acesso à base de dados.

Dependência da regra de segurança no IAM

As Regras de segurança do Firestore para clientes de dispositivos móveis/Web dependem da seguinte conta de serviço e associação do IAM:

Conta de serviço Função de IAM
service-project_number@firebase-rules.iam.gserviceaccount.com roles/firebaserules.system

O Firebase configura automaticamente esta conta de serviço para si. Se remover a função firebaserules.system desta conta de serviço, as suas regras de segurança vão recusar todos os pedidos. Para restaurar esta vinculação de IAM, use o seguinte comando da CLI gcloud:

gcloud projects add-iam-policy-binding project_id \
--member=serviceAccount:service-project_number@firebase-rules.iam.gserviceaccount.com \
--role=roles/firebaserules.system

Para determinar o seu project_id e project_number, consulte o artigo Identificar projetos.

Use a CLI do Google Cloud em vez da Google Cloud consola, porque a funçãofirebaserules.system está oculta na consola por predefinição.

O que se segue?