Risolvere i problemi relativi all'autenticazione IAM

Questa pagina descrive come risolvere i problemi di autenticazione Identity and Access Management (IAM) per AlloyDB per PostgreSQL.

Per determinare la causa di un tentativo di autenticazione basato su IAM non riuscito:

  1. Nella console Google Cloud , vai alla pagina Esplora log:

    Vai a Esplora log

  2. Nell'elenco a discesa Tutte le risorse, seleziona Istanza AlloyDB.

  3. Nella sezione Gravità, fai clic su Avviso.

    Se Avviso non è un'opzione, significa che non sono stati registrati errori di autenticazione nella finestra temporale selezionata. Potrebbe essere necessario regolare la finestra utilizzando i controlli di Esplora log.

  4. In Risultati delle query, controlla le voci di log per uno dei seguenti messaggi:

    Request had invalid authentication credentials.
    Il token di accesso non è valido.
    Caller does not have required permission to use project.
    L'entità IAM non dispone dei ruoli IAM necessari o delle autorizzazioni. Il messaggio di errore completo specifica i ruoli o le autorizzazioni mancanti.
    IAM principal does not match database user.

    L'entità IAM autenticata specificata dal token di accesso non corrisponde all'utente database a cui vuoi connetterti.

    Per visualizzare l'entità specificata dal token, esegui questo comando:

    curl -H "Content-Type: application/x-www-form-urlencoded" \
        -d "access_token=ACCESS_TOKEN" \
        https://www.googleapis.com/oauth2/v1/tokeninfo
    

    Sostituisci ACCESS_TOKEN con il token di accesso OAuth 2.0.

    Questo errore si verifica anche se l'entità abbreviata del account di servizio, ovvero l'indirizzo email senza il suffisso .gserviceaccount.com, supera i 63 caratteri.

    PostgreSQL ha un limite di 63 caratteri per gli identificatori di ruoli e utenti. Anche se AlloyDB ti consente di creare l'utente, PostgreSQL tronca il nome del ruolo a 63 byte nel catalogo interno. Durante l'accesso, il livello di autenticazione IAM di AlloyDB confronta l'entità completa e non troncata del token OAuth con il ruolo database troncato, il che comporta una mancata corrispondenza delle stringhe.

    Soluzione alternativa: utilizza account di servizio account

    Se non riesci ad abbreviare il nome del account di servizio, puoi aggirare questa limitazione utilizzando la simulazione dell'identità dei account di servizio. In questo modo, l'identità che esegue il workload viene separata dall'identità utilizzata per accedere al database:

    1. Crea un account di servizio proxy con un nome il cui principal abbreviato, escluso il suffisso .gserviceaccount.com, contenga al massimo 63 caratteri, ad esempio db-proxy@PROJECT_ID.iam.gserviceaccount.com.
    2. Aggiungi il account di servizio proxy al cluster AlloyDB come utente del database IAM_BASED con il nome utente db-proxy@PROJECT_ID.iam.
    3. In IAM, concedi all'account di servizio originale del workload il ruolo Service Account Token Creator (roles/iam.serviceAccountTokenCreator) sull'account di servizio proxy.
    4. Configura l'applicazione, il connettore o il proxy di autenticazione per la connessione utilizzando l'identità proxy.

    Ad esempio, puoi connetterti utilizzando il comando gcloud beta alloydb connect con il flag --impersonate-service-account:

    gcloud beta alloydb connect INSTANCE_ID \
        --cluster=CLUSTER_ID \
        --region=REGION_ID \
        --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \
        --auto-iam-authn
    

    Sostituisci quanto segue:

    • INSTANCE_ID: l'ID dell'istanza AlloyDB.
    • CLUSTER_ID: l'ID del cluster che contiene l'istanza.
    • REGION_ID: la regione in cui risiede il cluster.
    • PROXY_SERVICE_ACCOUNT_EMAIL: l'indirizzo email completo del account di servizio proxy.

    Nota: l'account di servizio originale non richiede l'accesso diretto alla connessione al database, ma solo l'autorizzazione a rappresentare l'account proxy. Il account di servizio proxy contiene i privilegi del database.

    Request had insufficient scopes.
    Il token di accesso non contiene l'ambito alloydb.login o l'ambito cloud-platform. È necessario almeno uno di questi ambiti.