Gestione degli utenti con autenticazione IAM

Questa pagina descrive come aggiungere un account utente o di servizio che utilizza l'autenticazione IAM del database a un database e come gestire tali account utente e account di servizio. Per ulteriori informazioni sull'integrazione IAM, consulta Panoramica dell'autenticazione IAM dei database.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  4. Installa e inizializza l'interfaccia a riga di comando di Google Cloud.
  5. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  7. Installa e inizializza l'interfaccia a riga di comando di Google Cloud.
  8. Attiva Cloud Key Management Service API.

    Abilita l'API

  9. Assicurati di avere il ruolo Amministratore Cloud SQL sul tuo account utente.

    Vai alla pagina IAM

  10. Abilita l'autenticazione IAM dei database sulla tua istanza Cloud SQL.
  11. Assicurati di concedere l'accesso IAM agli utenti che ne hanno bisogno per ogni progetto contenente database a cui gli utenti devono accedere. Consulta Concessione, modifica e revoca dell'accesso alle risorse.
  12. Assicurati di aver aggiunto un account di servizio per ogni servizio che richiede l'accesso ai database nel progetto.

Aggiungi un utente IAM o un account di servizio al database

Devi creare un nuovo utente di database per ogni utente IAM a cui vuoi concedere l'accesso all'istanza di database. Il nome utente del database deve essere l'indirizzo email dell'utente IAM, ad esempio test-user@gmail.com.

Quando utilizzi i comandi REST, il nome utente deve utilizzare le virgolette perché contiene caratteri speciali (@ e .).

Gli account di servizio utilizzano il formato service-account-name@project-id.iam.gserviceaccount.com.

Per aggiungere un utente IAM o un account di servizio, aggiungi un nuovo utente di database e seleziona IAM come metodo di autenticazione:

console

  1. In Google Cloud Console, vai alla pagina Istanze Cloud SQL.

    Vai alle istanze di Cloud SQL

  2. Per aprire la pagina Panoramica di un'istanza, fai clic sul nome dell'istanza.
  3. Seleziona Utenti dal menu di navigazione SQL.
  4. Fai clic su Aggiungi account utente. Si apre la scheda Aggiungi un account utente all'istanza instance_name.
  5. Fai clic sul pulsante di opzione Cloud IAM.
  6. Aggiungi l'indirizzo email dell'utente o dell'account di servizio che vuoi aggiungere nel campo Membro.
  7. Fai clic su Aggiungi. L'utente è ora presente nell'elenco degli utenti.
  8. Per concedere i privilegi di accesso utente, fai clic su triangolo e seleziona Aggiungi ruolo IAM. Questa azione assegna il ruolo Utente istanza Cloud SQL all'utente.

gcloud

Creare un account utente

Usa l'email, ad esempio test-user@gmail.com, per identificare l'utente.

Sostituisci quanto segue:

  • USERNAME: l'indirizzo email dell'utente.
  • INSTANCE_NAME: il nome dell'istanza a cui vuoi autorizzare l'accesso l'utente.
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

Creare un account di servizio

Sostituisci quanto segue:

  • SERVICE_ACCT: l'indirizzo email dell'account di servizio.
  • INSTANCE_NAME: il nome dell'istanza a cui vuoi autorizzare l'accesso dell'account di servizio.
gcloud sql users create SERVICE_ACCT \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

REST v1

Creare un account utente

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • project-id: l'ID progetto
  • instance-id: ID dell'istanza a cui stai aggiungendo l'utente
  • username: l'indirizzo email dell'utente
  • operation-id: ID dell'operazione

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Corpo JSON richiesta:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Creare un account di servizio

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • service-acct: l'indirizzo email del tuo account di servizio
  • project-id: l'ID progetto
  • instance-id: ID dell'istanza a cui stai aggiungendo l'account di servizio
  • operation-id: ID dell'operazione

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

Corpo JSON richiesta:

{
    "name": "service-acct"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

REST v1beta4

Creare un account utente

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • project-id: l'ID progetto
  • instance-id: ID dell'istanza a cui stai aggiungendo l'utente
  • username: l'indirizzo email dell'utente
  • operation-id: ID dell'operazione

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Corpo JSON richiesta:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Creare un account di servizio

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • service-acct: l'indirizzo email del tuo account di servizio
  • project-id: l'ID progetto
  • instance-id: ID dell'istanza a cui stai aggiungendo l'account di servizio
  • operation-id: ID dell'operazione

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

Corpo JSON richiesta:

{
    "name": "service-acct"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Concedi i privilegi di database all'utente IAM

Quando si aggiunge un utente IAM a un'istanza di database, per impostazione predefinita al nuovo utente non vengono concessi privilegi su alcun database.

Quando un utente o un account di servizio si connette a un database, può eseguire query su qualsiasi oggetto del database il cui accesso è stato concesso a PUBLIC.

Se necessitano di accesso aggiuntivo, è possibile concedere ulteriori privilegi utilizzando l'istruzione GRANT. Consulta la pagina di riferimento GRANT per un elenco completo dei privilegi che puoi concedere agli utenti e agli account di servizio. Esegui GRANT dalla riga di comando.

Sostituisci quanto segue:

  • USERNAME: l'indirizzo email dell'utente. Devi inserire le virgolette in tutto l'email perché contiene caratteri speciali (@ e .)
  • TABLE_NAME: il nome della tabella a cui vuoi concedere all'utente l'accesso.
    grant select on TABLE_NAME to "USERNAME";
    

Rimuovi un utente IAM o un account di servizio dal database

Per rimuovere un utente o un account di servizio dal database, devi eliminare l'account dall'istanza:

console

  1. In Google Cloud Console, vai alla pagina Istanze Cloud SQL.

    Vai alle istanze di Cloud SQL

  2. Per aprire la pagina Panoramica di un'istanza, fai clic sul nome dell'istanza.
  3. Seleziona Utenti dal menu di navigazione SQL.
  4. Fai clic su in corrispondenza dell'utente che vuoi rimuovere.
  5. Seleziona Rimuovi. Questa operazione revoca l'accesso solo a questa istanza.

gcloud

Revocare un utente

Usa l'email, ad esempio test-user@gmail.com, per identificare l'utente.

Sostituisci quanto segue:

  • USERNAME: l'indirizzo email senza il nome @domain.
  • INSTANCE_NAME: il nome dell'istanza da cui vuoi rimuovere l'utente.
gcloud sql users delete USERNAME \
--instance=INSTANCE_NAME

Eliminare l'account di servizio

Sostituisci quanto segue:

  • SERVICE_ACCT: l'indirizzo email dell'account di servizio.
  • INSTANCE_NAME: il nome dell'istanza da cui vuoi rimuovere l'utente.
gcloud sql users delete SERVICE_ACCT \
--instance=INSTANCE_NAME

REST v1beta4

La richiesta riportata di seguito utilizza il metodo users:delete per eliminare l'account utente specificato.

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • project-id: l'ID progetto
  • instance-id: l'ID istanza desiderato
  • username: indirizzo email dell'account dell'utente o di servizio

Metodo HTTP e URL:

DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=&name=username

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:38:41.217Z",
  "startTime": "2020-02-07T22:38:41.217Z",
  "endTime": "2020-02-07T22:38:44.801Z",
  "operationType": "DELETE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Visualizzare le informazioni di accesso nei log di controllo

Puoi abilitare i log di controllo per acquisire gli accessi IAM al database. In caso di problemi di accesso, puoi utilizzare i log di controllo per diagnosticare il problema.

Nota: l'audit logging comporta costi aggiuntivi. Per ulteriori informazioni, consulta la sezione Prezzi per il logging dei dati.

Dopo la configurazione, puoi visualizzare i log di controllo di accesso ai dati di accessi riusciti utilizzando Esplora log.

Ad esempio, un log potrebbe contenere informazioni simili alle seguenti:

{
 insertId: "..."
 logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
 protoPayload: {
  @type: "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail: "..."
  }
  authorizationInfo: [
   0: {
    granted: true
    permission: "cloudsql.instances.login"
    resource: "instances/..."
    resourceAttributes: {
    }
   }
  ]
  methodName: "cloudsql.instances.login"
  request: {
   @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
   clientIpAddress: "..."
   database: "..."
   databaseSessionId: ...
   instance: "projects/.../locations/us-central1/instances/..."
   user: "..."
  }
  requestMetadata: {
   callerIp: "..."
   destinationAttributes: {
   }
   requestAttributes: {
    auth: {
    }
    time: "..."
   }
  }
  resourceName: "instances/..."
  serviceName: "cloudsql.googleapis.com"
  status: {
  }
 }
 receiveTimestamp: "..."
 resource: {
  labels: {
   database_id: "...:..."
   project_id: "..."
   region: "us-central"
  }
  type: "cloudsql_database"
 }
 severity: "INFO"
 timestamp: "..."
}

Risolvere i problemi di accesso non riuscito

Quando un tentativo di accesso ha esito negativo, PostgreSQL restituisce un messaggio di errore minimo per motivi di sicurezza. Ad esempio:

PGPASSWORD=not-a-password psql --host=... --username=... --dbname=...
psql: error: could not connect to server: FATAL:  Cloud SQL IAM user authentication failed for user "..."
FATAL:  pg_hba.conf rejects connection for host "...", user "...", database "...", SSL off

Puoi esaminare i log degli errori PostgreSQL per ulteriori dettagli sull'errore. Per ulteriori informazioni, consulta la sezione relativa alla visualizzazione dei log.

Ad esempio, per l'errore precedente, la seguente voce di log spiega l'azione che puoi intraprendere per risolvere il problema.

F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.

Controlla il messaggio di errore che ricevi. Se il messaggio non indica che hai utilizzato l'autenticazione utente Cloud SQL IAM o l'autenticazione dell'account di servizio IAM di Cloud SQL, verifica che il tipo di utente del database utilizzato per accedere sia CLOUD_IAM_USER o CLOUD_IAM_SERVICE_ACCOUNT. Per verificare, puoi utilizzare Google Cloud Console o il comando gcloud sql users list. Per un utente IAM, verifica che il nome utente del database sia l'email dell'utente IAM.

Se hai utilizzato l'autenticazione IAM dei database, controlla i dettagli del messaggio di errore. Puoi trovare il messaggio di errore nel log degli errori del database. Se indica che il token di accesso (OAuth 2.0) che hai inviato come password non è valido, puoi utilizzare il comando gcloud auth application-default print-access-token gcloud per trovare i dettagli del token nel seguente modo:

curl -H "Content-Type: application/x-www-form-urlencoded" \
-d "access_token=$(gcloud auth application-default print-access-token)" \
https://www.googleapis.com/oauth2/v1/tokeninfo

Verifica che il token sia dell'utente o dell'account IAM di servizio previsto e che non sia scaduto.

Se i dettagli indicano che l'utente non ha l'autorizzazione, verifica che all'utente o all'account di servizio IAM venga concessa l'autorizzazione cloudsql.instances.login utilizzando il ruolo Cloud SQL Instance User predefinito o personalizzato nel criterio IAM del progetto dell'istanza. Utilizza lo strumento per la risoluzione dei problemi relativi ai criteri IAM per ulteriore assistenza.

Se l'accesso non riesce a causa dell'impossibilità di autenticazione del database IAM, l'utente può accedere utilizzando l'utente e la password PostgreSQL predefiniti. Questo metodo di accesso fornisce ancora all'utente l'accesso all'intero database. Verifica che la connessione sia protetta.

Passaggi successivi