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 seus recursos do Firebase e os dados de seus usuários seguros, siga estas diretrizes. Nem todos os itens se aplicarão necessariamente aos seus requisitos, mas lembre-se deles ao desenvolver seu aplicativo.

Evite o 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 informá-lo sobre 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 escalonar para tráfego normal

O Cloud Functions é dimensionado 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ções, muitas vezes as cotas serão ativadas e limitarão automaticamente o tráfego para seu aplicativo. Certifique-se de monitorar seu painel de uso e cobrança , mas você também pode definir alertas de orçamento em seu projeto para ser notificado quando o uso de recursos estiver superando as expectativas.

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

Pode ser fácil executar 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 ativos fazendo seu desenvolvimento com o conjunto de emuladores do Firebase .

(E se você fizer o DOS acidentalmente, desimplante sua função removendo-a do 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 precisar apresentar o resultado de uma função em tempo real, poderá reduzir 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 .

Compreender 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 no código do cliente. Saiba mais sobre as chaves de API para Firebase .

Configurar o escopo da chave de API

Como um impedimento adicional contra um invasor que tente 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 HTTP FCM legada ) são confidenciais e devem ser mantidas em segredo.

Manter as chaves da conta de serviço em segredo

Além disso, 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 em produção ou modo bloqueado

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

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

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

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; adicione-o ao CI

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

Autenticação

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

Se você já tem um sistema de login seguro, seja um sistema personalizado ou um serviço de terceiros, pode usar o sistema existente para se autenticar nos serviços do Firebase. Crie JWTs personalizados 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 de terceiros, consulte a postagem do blog Authenticate with Firebase using Okta .

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

Se você usa os recursos de autenticação gerenciada do Firebase, as opções de 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 por senha de e-mail: defina uma cota restrita para o endpoint de entrada para evitar ataques de força bruta

Se você usa o serviço de autenticação de senha de e-mail gerenciado do Firebase, reduza 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 Console do Google Cloud .

Faça upgrade para o Cloud Identity Platform para autenticação multifator

Para segurança extra no login, você pode adicionar suporte à autenticação multifator fazendo upgrade 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 a quente

Use apenas a autenticação anônima para salvar o estado básico dos usuários antes que eles realmente 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ônimos não persistirão se o usuário limpar o armazenamento local ou alternar os dispositivos. Se você precisar manter os dados além das reinicializações do aplicativo em um único dispositivo, converta o usuário em uma conta permanente .

Use regras de segurança que exigem que os usuários tenham se convertido em um provedor de login ou verificado seus e-mails

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 exigem 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 do ambiente

Definir projetos de desenvolvimento e preparação

Configure projetos separados do Firebase para desenvolvimento, preparação e produção. Não mescle o código do cliente na produção até que ele seja testado no projeto de teste.

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

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

Se sua equipe usa 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 de ortografia 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 àquela que você pretende instalar pode conter código malicioso.

Não atualize 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 agregue valor e verifique se o mantenedor ainda é uma parte em quem você confia.

Instale bibliotecas watchdog como dependências de desenvolvimento ou teste

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

Configurar monitoramento para Funções; verifique-o após as atualizações da biblioteca

Se você usa o SDK do registrador do Cloud Functions , pode monitorar e ser alertado sobre comportamentos incomuns, incluindo comportamentos causados ​​por atualizações da biblioteca.

Segurança do Cloud Function

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ções, as 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 no código.
  • Se você estiver usando o SDK Admin do Firebase em um Cloud Function, não precisará fornecer explicitamente as credenciais da conta de serviço, pois 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 do 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 o Cloud Function, 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 o Cloud Functions o mais simples e compreensível possível. A complexidade em suas funções geralmente pode levar a bugs difíceis de detectar ou a um comportamento inesperado.

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