O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Lista de verificação de segurança do Firebase

Para manter os recursos do Firebase e os dados dos usuários protegidos, siga estas diretrizes. Nem todos os itens se aplicam necessariamente aos seus requisitos, mas lembre-se deles ao desenvolver seu aplicativo.

Evite tráfego abusivo

Configurar monitoramento e alerta para serviços de back-end

Para detectar tráfego abusivo, como ataques de negação de serviço (DOS), configure monitoramento e alerta para Cloud Firestore , Realtime Database , Cloud Storage e Hosting

Se você suspeitar de um ataque ao seu aplicativo, entre em contato com o Suporte o mais rápido possível para que eles saibam o que está acontecendo.

Ativar verificação de aplicativo

Para ajudar a garantir que apenas seus aplicativos possam acessar seus serviços de back-end, habilite o App Check para cada serviço compatível.

Configure seu Cloud Functions para escalar para tráfego normal

O Cloud Functions escala automaticamente para atender às demandas do seu aplicativo, mas no caso de um ataque, isso pode significar uma grande conta. Para evitar isso, você pode limitar o número de instâncias simultâneas de uma função com base no tráfego normal do seu aplicativo.

Configure alertas para ser notificado quando os limites estiverem quase atingidos

Se o seu serviço tiver picos de solicitação, muitas vezes as cotas entrarão em ação e limitarão automaticamente o tráfego para seu aplicativo. Certifique-se de monitorar seu painel de uso e cobrança , mas também pode definir alertas de orçamento em seu projeto para ser notificado quando o uso de recursos exceder as expectativas.

Evite auto-DOSes: teste funções localmente com os emuladores

Pode ser fácil usar o DOS acidentalmente durante o desenvolvimento do Cloud Functions: por exemplo, criando um loop infinito de gravação de gatilho. Você pode evitar que esses erros afetem os serviços ao vivo fazendo seu desenvolvimento com o conjunto de emuladores do Firebase .

(E se você mesmo fizer DOS acidentalmente, remova a implantação de sua função removendo-a de index.js e executando firebase deploy --only functions .)

Onde a capacidade de resposta em tempo real é menos importante, a estrutura funciona defensivamente

Se você não precisa apresentar o resultado de uma função em tempo real, pode atenuar o tráfego abusivo processando os resultados em lotes: publique os resultados em um tópico do Pub/Sub e processe os resultados em intervalos regulares com uma função programada .

Entenda as chaves de API

As chaves de API para serviços do Firebase não são secretas

O Firebase usa chaves de API apenas para identificar o projeto do Firebase do seu aplicativo para os serviços do Firebase, e não para controlar o acesso ao banco de dados ou aos dados do Cloud Storage, o que é feito usando as regras de segurança do Firebase . Por esse motivo, você não precisa tratar as chaves de API dos serviços do Firebase como segredos e pode incorporá-las com segurança ao código do cliente. Saiba mais sobre chaves de API para Firebase .

Configurar o escopo da chave de API

Como um impedimento adicional contra um invasor que tenta usar sua chave de API para falsificar solicitações, você pode criar chaves de API com escopo para seus clientes de aplicativo .

Manter as chaves do servidor FCM em segredo

Ao contrário das chaves de API para serviços do Firebase, as chaves do servidor FCM (usadas pela API FCM HTTP herdada ) são confidenciais e devem ser mantidas em segredo.

Manter as chaves da conta de serviço em segredo

Também diferentemente das chaves de API para serviços do Firebase, as chaves privadas da conta de serviço (usadas pelo Admin SDK ) são confidenciais e devem ser mantidas em segredo.

regras de segurança

Inicializar regras no modo de produção ou bloqueado

Ao configurar o Cloud Firestore, o Realtime Database e o Cloud Storage, inicialize suas regras de segurança para negar todo acesso por padrão e adicione regras que concedem acesso a recursos específicos conforme você desenvolve seu aplicativo.

Esta é uma das configurações padrão para novas instâncias do Cloud Firestore (modo de produção) e Realtime Database (modo bloqueado). Escolha esta opção ao configurar uma nova instância de banco de dados.

Para Cloud Storage, comece com uma configuração de regras de segurança como a seguinte:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

As regras de segurança são um esquema; adicionar regras ao adicionar documentos

Não escreva regras de segurança depois de escrever seu aplicativo, como uma espécie de tarefa de pré-lançamento. Em vez disso, escreva regras de segurança enquanto escreve seu aplicativo, tratando-as como um esquema de banco de dados: sempre que precisar usar um novo tipo de documento ou estrutura de caminho, escreva sua regra de segurança primeiro.

Regras de segurança de teste de unidade com o Emulator Suite; adicioná-lo ao CI

Para garantir que suas regras de segurança estejam acompanhando o desenvolvimento de seu aplicativo, teste suas regras com o conjunto de emuladores do Firebase e adicione esses testes ao seu pipeline de CI. Consulte estes guias para Cloud Firestore e Realtime Database .

Autenticação

Autenticação personalizada: crie JWTs de um ambiente confiável (do lado do servidor)

Se você já possui um sistema de login seguro, seja um sistema personalizado ou um serviço de terceiros, pode usar seu sistema existente para autenticar com os serviços do Firebase. Crie JWTs personalizados a partir de um ambiente confiável e passe os tokens para seu cliente, que usa o token para autenticar ( iOS+ , Android , Web , Unity , C++ ).

Para obter um exemplo de como usar a autenticação personalizada com um provedor terceirizado, consulte a postagem do blog Authenticate with Firebase using Okta .

Autenticação gerenciada: provedores OAuth 2.0 são os mais seguros

Se você usar os recursos de autenticação gerenciada do Firebase, as opções do provedor OAuth 2.0/OpenID Connect (Google, Facebook etc.) são as mais seguras. Você deve oferecer suporte a um ou mais desses provedores, se puder (dependendo da sua base de usuários).

Autenticação de senha de e-mail: defina uma cota restrita para o endpoint de login para evitar ataques de força bruta

Se você usar o serviço gerenciado de autenticação de senha de e-mail do Firebase, restrinja a cota padrão dos endpoints identitytoolkit.googleapis.com para evitar ataques de força bruta. Você pode fazer isso na página da API no Google Cloud Console .

Autenticação de senha de e-mail: Ativar proteção de enumeração de e-mail

Se você usar o serviço gerenciado de autenticação de senha de e-mail do Firebase, ative a proteção de enumeração de e-mail , o que impede que agentes mal-intencionados abusem dos endpoints de autenticação do seu projeto para adivinhar nomes de contas.

Atualize para Cloud Identity Platform para autenticação multifator

Para segurança extra no login, você pode adicionar suporte à autenticação multifator atualizando para o Cloud Identity Platform . Seu código existente do Firebase Authentication continuará funcionando após o upgrade.

autenticação anônima

Use apenas autenticação anônima para integração morna

Use a autenticação anônima apenas para salvar o estado básico dos usuários antes que eles entrem. A autenticação anônima não substitui a entrada do usuário.

Converta os usuários para outro método de login se eles quiserem os dados quando perderem o telefone

Os dados de autenticação anônima não persistirão se o usuário limpar o armazenamento local ou trocar de dispositivo. Se você precisar manter os dados após as reinicializações do aplicativo em um único dispositivo, converta o usuário em uma conta permanente .

Use regras de segurança que exijam que os usuários tenham se convertido em um provedor de login ou verificado seu e-mail

Qualquer pessoa pode criar uma conta anônima em seu projeto. Com isso em mente, proteja todos os dados não públicos com regras de segurança que exijam métodos de login específicos ou endereços de e-mail verificados .

Por exemplo:

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

gestão ambiental

Configurar projetos de desenvolvimento e preparação

Configure projetos Firebase separados para desenvolvimento, preparação e produção. Não mescle o código do cliente com a produção até que ele tenha sido testado no projeto de preparo.

Limite o acesso da equipe aos dados de produção

Se você trabalha com uma equipe maior, pode atenuar as consequências de erros e violações limitando o acesso aos dados de produção usando funções predefinidas ou funções IAM personalizadas.

Se sua equipe usar o conjunto de emuladores para desenvolvimento, talvez não seja necessário conceder acesso mais amplo ao projeto de produção.

gerenciamento de biblioteca

Cuidado com erros ortográficos da biblioteca ou novos mantenedores

Ao adicionar bibliotecas ao seu projeto, preste muita atenção ao nome da biblioteca e seus mantenedores. Uma biblioteca com nome semelhante ao que você pretende instalar pode conter código mal-intencionado.

Não atualize as bibliotecas sem entender as alterações

Examine os logs de alterações de todas as bibliotecas que você usa antes de atualizar. Certifique-se de que a atualização agrega valor e verifique se o mantenedor ainda é uma parte em que você confia.

Instalar bibliotecas watchdog como dependências de desenvolvimento ou teste

Use uma biblioteca como Snyk para escanear seu projeto em busca de dependências inseguras.

Configurar monitoramento para funções; verifique depois das atualizações da biblioteca

Se você usar o SDK do logger do Cloud Functions , poderá monitorar e ser alertado sobre comportamentos incomuns, incluindo comportamento causado por atualizações de biblioteca.

Segurança da Função Cloud

Nunca coloque informações confidenciais nas variáveis ​​de ambiente de uma Função do Cloud

Muitas vezes, em um aplicativo Node.js auto-hospedado, você usa variáveis ​​de ambiente para conter informações confidenciais, como chaves privadas. Não faça isso no Cloud Functions . Como o Cloud Functions reutiliza ambientes entre invocações de função, informações confidenciais não devem ser armazenadas no ambiente.

  • Para armazenar chaves de API do Firebase, que não são secretas , basta incorporá-las ao código.
  • Se você estiver usando o Firebase Admin SDK em um Cloud Function, não precisará fornecer explicitamente as credenciais da conta de serviço, porque o SDK pode adquiri-las automaticamente durante a inicialização.
  • Se você estiver chamando as APIs do Google e do Google Cloud que exigem credenciais de conta de serviço, a biblioteca Google Auth para Node.js pode obter essas credenciais das credenciais padrão do aplicativo , que são preenchidas automaticamente no Cloud Functions.
  • Para disponibilizar chaves privadas e credenciais para serviços que não são do Google para o Cloud Functions, use o Cloud Secret Manager .

Criptografar informações confidenciais

Se você não puder evitar passar informações confidenciais para sua função de nuvem, deverá criar sua própria solução personalizada para criptografar as informações.

Funções simples são mais seguras; se você precisar de complexidade, considere o Cloud Run

Tente manter suas Cloud Functions o mais simples e compreensíveis possível. A complexidade em suas funções geralmente pode levar a erros difíceis de detectar ou a comportamentos inesperados.

Se você precisar de lógica complexa ou configurações de ambiente, considere usar o Cloud Run em vez do Cloud Functions.