Attivare o disattivare la protezione dall'enumerazione delle email

Questa guida spiega la funzionalità di protezione dall'enumerazione delle email e mostra come attivarla e disattivarla. Se hai creato il tuo progetto a partire dal 15 settembre 2023, la protezione dall'enumerazione delle email è abilitata per impostazione predefinita.

Panoramica

L'enumerazione delle email è un tipo di attacco di forza bruta in cui un malintenzionato tenta di indovinare o confermare gli utenti in un sistema passando un indirizzo email all'API e controllando la risposta.

Senza la protezione dall'enumerazione delle email, Identity Platform restituisce informazioni che possono essere utilizzate in un attacco di enumerazione delle email:

  • Viene effettuato un tentativo di accesso con un indirizzo email che non esiste nel sistema. Identity Platform restituisce un errore EMAIL_NOT_FOUND.

  • Viene effettuato un tentativo di registrazione con un indirizzo email già esistente nel sistema. Identity Platform restituisce un errore EMAIL_EXISTS.

Puoi utilizzare la funzionalità di protezione dall'enumerazione delle email di Identity Platform per proteggere gli account utente nella tua app da questi attacchi.

Quando la protezione da enumerazione email è abilitata, il tuo progetto ha il seguente comportamento:

  • L'API fetchSignInForEmail non andrà a buon fine. Il collegamento di utenti autenticati anonimi a un indirizzo email non funzionerà nemmeno prima della versione 22.3.0 dell'SDK per Android, 10.18.0 per iOS e 10.6.0 per il web.

  • Un elenco dei metodi di accesso per un indirizzo email specificato non viene più restituito quando viene chiamato il metodo dell'API REST createAuthUri o il metodo dell'SDK client fetchSignInMethodsForEmail su tutte le piattaforme.

  • Gli utenti non possono modificare il proprio indirizzo email senza prima verificare il nuovo indirizzo. Ad esempio, non puoi più modificare l'indirizzo email di un utente con l'API REST di update, l'API REST di setAccountInfo o il metodo dell'SDK client di updateEmail su tutte le piattaforme.

    Puoi utilizzare verifyBeforeUpdateEmail per il web e Android o sendEmailVerification(beforeUpdatingEmail:) per iOS.

  • Non puoi più utilizzare l'API REST setAccountInfo per collegare un provider email/password a un account utente esistente. Non puoi più utilizzare il metodo dell'SDK client linkWithCredential con un EmailAuthCredential su qualsiasi piattaforma. Utilizza invece l'API REST signUp, passando il token ID dell'utente nel campo idToken e i campi email e password da collegare.

  • Rimuove le risposte di errore per i flussi di verifica email, inclusi quelli avviati chiamando l'API REST sendOobCode con i tipi di richiesta VERIFY_AND_CHANGE_EMAIL o PASSWORD_RESET e chiamando verifyBeforeUpdateEmail per web e Android, sendEmailVerification(beforeUpdatingEmail:) per iOS o sendPasswordResetEmail su tutte le piattaforme.

    Quando effettui una richiesta di reimpostazione della password, viene inviata un'email di verifica solo se l'indirizzo email esiste; quando effettui una richiesta di modifica dell'indirizzo email, viene inviata un'email di verifica solo se l'indirizzo email non esiste già. In entrambi i casi, non sono presenti messaggi di errore specifici che indicano quando le email non vengono inviate.

    Ti consigliamo di non consentire agli utenti di registrarsi senza un flusso di verifica dell'email.

  • I casi di accesso non validi restituiscono una risposta di errore INVALID_LOGIN_CREDENTIALS. I casi di registrazione non validi continuano a restituire errori EMAIL_EXISTS. Consulta i consigli nella sezione successiva.

Se la tua app si basa su uno dei comportamenti modificati dalla protezione dall'enumerazione delle email, puoi disattivarla. Tuttavia, questa soluzione non è consigliata a lungo termine. Consulta la sezione seguente.

Suggerimenti sulla sicurezza

Uno dei metodi più comuni per eseguire un attacco di compromissione dell'account è eseguire attacchi di credential stuffing utilizzando credenziali trapelate o facili da indovinare. L'enumerazione delle email può essere utilizzata anche per ottenere informazioni sensibili sui tuoi utenti o per eseguire attacchi di phishing contro di loro. Per questi motivi, Google consiglia di utilizzare la funzionalità di protezione dall'enumerazione delle email per proteggere le tue app da questi attacchi.

  • Se hai creato il progetto a partire dal 15 settembre 2023, la protezione dall'enumerazione delle email è abilitata per impostazione predefinita. Ti consigliamo di lasciare abilitata la protezione dall'enumerazione delle email e di astenerti dall'affidarti a uno dei comportamenti elencati in precedenza in questa guida.

  • Se hai creato il progetto prima del 15 settembre 2023, la protezione dall'enumerazione delle email non è attivata automaticamente.

    Se le tue app non si basano su nessuno dei comportamenti descritti in precedenza in questa guida, ti consigliamo di attivare immediatamente la protezione dall'enumerazione delle email.

    Se le tue app si basano su uno dei comportamenti descritti in precedenza, ti consigliamo di iniziare a eseguire la migrazione per evitare di farlo e di attivare la protezione dall'enumerazione delle email il prima possibile.

Oltre a utilizzare la protezione dall'enumerazione delle email, valuta la possibilità di adottare misure per prevenire l'abuso degli endpoint di registrazione del tuo progetto che continuano a restituire errori EMAIL_EXISTS. Di seguito sono riportati alcuni modi per farlo:

  • Attiva App Check.
  • Integra reCAPTCHA nel flusso di registrazione.
  • Non consentire l'accesso con indirizzi email e password o link via email e utilizza metodi alternativi, come Accedi con Google.

Attivare la protezione dall'enumerazione delle email

Per attivare la protezione dall'enumerazione delle email:

Console Firebase

  1. Nella console Firebase, vai alla pagina Impostazioni di autenticazione.

    Vai alle impostazioni di autenticazione

    1. Nel riquadro Gestione account utente, seleziona Azioni utente.

    2. Seleziona Protezione enumerazione email (consigliata).

  2. Fai clic su Salva.

Node.js

  1. Installa l'SDK Admin.

  2. Per abilitare la protezione da enumerazione email, utilizza uno dei seguenti metodi:

    • Per la protezione a livello di progetto:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      
    • Per la protezione a livello di tenant:

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

      Sostituisci TENANT_ID con l'ID tenant per cui vuoi attivare la protezione dall'enumerazione delle email.

REST

  1. Nella Google Cloud console, stampa un token di accesso per l'ID progetto utilizzando il comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Attiva la protezione dall'enumerazione delle email per il tuo ID progetto utilizzando l'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"
    

Sostituisci quanto segue:

  • ACCESS_TOKEN: il token di accesso che hai generato in precedenza
  • PROJECT_ID: il tuo ID progetto

Disattivare la protezione enumerazione email

Per disattivare la protezione dall'enumerazione delle email:

Console Firebase

  1. Nella console Firebase, vai alla pagina Impostazioni di autenticazione.

    Vai alle impostazioni di autenticazione

    1. Nel riquadro Gestione account utente, seleziona Azioni utente.

    2. Deseleziona Protezione da enumerazione email (consigliata).

  2. Fai clic su Salva.

Node.js

  1. Installa l'SDK Admin.

  2. Per disabilitare la protezione dall'enumerazione delle email, utilizza uno dei seguenti metodi:

    • Per la protezione a livello di progetto:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      
    • Per la protezione a livello di tenant:

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

      Sostituisci TENANT_ID con l'ID tenant per cui vuoi disattivare la protezione dall'enumerazione delle email.

REST

  1. Nella Google Cloud console, stampa un token di accesso per l'ID progetto utilizzando il comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Disattiva la protezione dall'enumerazione delle email utilizzando l'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"
    

Sostituisci quanto segue:

  • ACCESS_TOKEN: il token di accesso che hai generato in precedenza
  • PROJECT_ID: il tuo ID progetto

Esempio di risposta di errore

Se un utente tenta di accedere con un indirizzo email o una password errati oppure tenta di registrarsi con un indirizzo email già esistente nel sistema, Identity Platform restituisce un errore simile al seguente:

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