Ative ou desative a proteção de enumeração de emails

Este guia explica a funcionalidade de proteção contra enumeração de emails e mostra como ativá-la e desativá-la. Se criou o seu projeto a 15 de setembro de 2023 ou após essa data, a proteção de enumeração de emails está ativada por predefinição.

Vista geral

A enumeração de emails é um tipo de ataque de força bruta em que um ator malicioso tenta adivinhar ou confirmar utilizadores num sistema transmitindo um endereço de email à API e verificando a resposta.

Sem a proteção de enumeração de emails, a Identity Platform devolve informações que podem ser usadas num ataque de enumeração de emails:

  • É feita uma tentativa de início de sessão com um endereço de email que não existe no sistema. O Identity Platform devolve um erro EMAIL_NOT_FOUND.

  • É feita uma tentativa de inscrição com um endereço de email que já existe no sistema. O Identity Platform devolve um erro EMAIL_EXISTS.

Pode usar a funcionalidade de proteção de enumeração de emails da Identity Platform para proteger as contas de utilizadores na sua app contra estes ataques.

Quando a proteção de enumeração de emails está ativada, o seu projeto tem o seguinte comportamento:

  • A API fetchSignInForEmail vai falhar. A associação de utilizadores autenticados anónimos a um endereço de email também não funciona antes da versão 22.3.0 do SDK para Android, 10.18.0 para iOS e 10.6.0 para a Web.

  • Já não é devolvida uma lista de métodos de início de sessão para um endereço de email especificado quando chama a API REST createAuthUri ou o método do SDK do cliente fetchSignInMethodsForEmail em todas as plataformas.

  • Os utilizadores não podem alterar o respetivo endereço de email sem primeiro validar o novo endereço. Por exemplo, já não pode alterar o endereço de email de um utilizador com a API REST update, a API REST setAccountInfo nem o método do SDK de cliente updateEmail em todas as plataformas.

    Em alternativa, pode usar verifyBeforeUpdateEmail para a Web e o Android ou sendEmailVerification(beforeUpdatingEmail:) para iOS.

  • Já não pode usar a API REST setAccountInfo para associar um fornecedor de email/palavra-passe a uma conta de utilizador existente. Já não pode usar o linkWithCredential método do SDK do cliente com um EmailAuthCredential em nenhuma plataforma. Em alternativa, use a API REST signUp, transmitindo o token de ID do utilizador no campo idToken e os campos email e password para fazer a associação.

  • Remove as respostas de erro para fluxos de validação de email, incluindo fluxos iniciados através da chamada da API REST sendOobCode com os tipos de pedidos VERIFY_AND_CHANGE_EMAIL ou PASSWORD_RESET e através da chamada de verifyBeforeUpdateEmail para a Web e o Android, sendEmailVerification(beforeUpdatingEmail:) para o iOS ou sendPasswordResetEmail em todas as plataformas.

    Quando faz um pedido de reposição de palavra-passe, é enviado um email de validação apenas se o endereço de email existir. Quando faz um pedido de alteração do endereço de email, é enviado um email de validação apenas se o endereço de email ainda não existir. Em ambos os casos, não existem mensagens de erro específicas que indiquem quando os emails não são enviados.

    Recomendamos que não permita que os utilizadores se inscrevam sem um fluxo de validação de email.

  • Os casos de início de sessão inválidos devolvem uma resposta de erro INVALID_LOGIN_CREDENTIALS. Os casos de inscrição inválida continuam a devolver erros EMAIL_EXISTS. Consulte as recomendações na secção seguinte.

Se a sua app depender de algum dos comportamentos alterados pela proteção de enumeração de emails, pode desativá-la. No entanto, isto não é recomendado a longo prazo. Consulte a secção seguinte.

Recomendações de segurança

Um dos métodos mais comuns para realizar um ataque de roubo de conta é realizar ataques de preenchimento de credenciais com credenciais que são roubadas ou fáceis de adivinhar. A enumeração de emails também pode ser usada para obter informações confidenciais sobre os seus utilizadores ou para realizar ataques de phishing contra eles. Por estes motivos, a Google recomenda a utilização da funcionalidade de proteção contra a enumeração de emails para proteger as suas apps contra estes ataques.

  • Se criou o seu projeto a 15 de setembro de 2023 ou após essa data, a proteção de enumeração de emails está ativada por predefinição. Recomendamos que deixe a proteção de enumeração de email ativada e se abstenha de confiar em qualquer um dos comportamentos indicados anteriormente neste guia.

  • Se criou o seu projeto antes de 15 de setembro de 2023, a proteção de enumeração de emails não é ativada automaticamente.

    Se as suas apps não dependerem de nenhum dos comportamentos descritos anteriormente neste guia, recomendamos que ative imediatamente a proteção da enumeração de emails.

    Se as suas apps dependerem de algum dos comportamentos descritos anteriormente, recomendamos que comece a migrar para longe dessa dependência e ative a proteção de enumeração de emails assim que possível.

Além de usar a proteção de enumeração de emails, considere tomar medidas para impedir o abuso dos pontos finais de inscrição do seu projeto que continuam a devolver erros EMAIL_EXISTS. Seguem-se algumas formas de o fazer:

  • Ative o App Check.
  • Integre o reCAPTCHA no fluxo de inscrição.
  • Não permitir o início de sessão com endereços de email e palavras-passe ou links de email e, em alternativa, usar métodos como o Início de sessão com o Google.

Ative a proteção contra enumeração de emails

Para ativar a proteção contra enumeração de emails, siga estes passos:

consola do Firebase

  1. Na consola do Firebase, aceda à página Definições de autenticação.

    Aceda às definições de autenticação

    1. No painel Gestão de contas de utilizador, selecione Ações do utilizador.

    2. Selecione Proteção de enumeração de emails (recomendado).

  2. Clique em Guardar.

Node.js

  1. Instale o SDK de administração.

  2. Para ativar a proteção de enumeração de emails, use uma das seguintes opções:

    • Para proteção ao nível do projeto:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      
    • Para proteção ao nível do inquilino:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      

      Substitua TENANT_ID pelo ID do inquilino para o qual quer ativar a proteção de enumeração de emails.

REST

  1. Na Google Cloud consola, imprima um token de acesso para o ID do seu projeto através do comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Ative a proteção de enumeração de emails para o seu ID do projeto através da API Identity Toolkit:

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':true}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

Substitua o seguinte:

  • ACCESS_TOKEN: o token de acesso que gerou anteriormente
  • PROJECT_ID: o ID do seu projeto

Desative a proteção de enumeração de emails

Para desativar a proteção de enumeração de emails, siga estes passos:

consola do Firebase

  1. Na consola do Firebase, aceda à página Definições de autenticação.

    Aceda às definições de autenticação

    1. No painel Gestão de contas de utilizador, selecione Ações do utilizador.

    2. Desmarque a opção Proteção de enumeração de emails (recomendado).

  2. Clique em Guardar.

Node.js

  1. Instale o SDK de administração.

  2. Para desativar a proteção de enumeração de emails, use uma das seguintes opções:

    • Para proteção ao nível do projeto:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      
    • Para proteção ao nível do inquilino:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      

      Substitua TENANT_ID pelo ID do inquilino para o qual quer desativar a proteção de enumeração de emails.

REST

  1. Na Google Cloud consola, imprima um token de acesso para o ID do seu projeto através do comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Desative a proteção de enumeração de emails através da API Identity Toolkit:

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':false}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

Substitua o seguinte:

  • ACCESS_TOKEN: o token de acesso que gerou anteriormente
  • PROJECT_ID: o ID do seu projeto

Exemplo de uma resposta de erro

Se um utilizador tentar iniciar sessão com um endereço de email ou uma palavra-passe incorretos, ou tentar inscrever-se com um endereço de email que já existe no sistema, o Identity Platform devolve um erro semelhante ao seguinte:

{
"code": "auth/internal-error",
"message": "{\"error\":{\"code\":400,\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"errors\":[{\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"domain\":\"global\",\"reason\":\"invalid\"}]}}"
}