Questa pagina descrive come aggiungere un account utente o di servizio che utilizza l'autenticazione del database IAM a un database e come gestire tali account utente e di servizio. Per ulteriori informazioni sull'integrazione IAM, consulta la panoramica dell'autenticazione dei database IAM.
Prima di iniziare
- 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.
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
- Installa Google Cloud CLI.
-
Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:
gcloud init
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
- Installa Google Cloud CLI.
-
Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:
gcloud init
-
Attiva Cloud Key Management Service API.
- Assicurati di disporre del ruolo Amministratore Cloud SQL nel tuo account utente.
- Abilita l'autenticazione del database IAM sull'istanza Cloud SQL.
- Assicurati di concedere l'accesso IAM agli utenti che ne hanno bisogno per ogni progetto contenente i database a cui devono accedere. Consulta la pagina relativa a concessione, modifica e revoca dell'accesso alle risorse.
- Assicurati di aver aggiunto un account di servizio per ogni servizio che richiede l'accesso ai database nel progetto.
Aggiungi un utente o un account di servizio IAM 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 si utilizzano 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 database e seleziona IAM come metodo di autenticazione:
Console
-
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
- Per aprire la pagina Panoramica di un'istanza, fai clic sul suo nome.
- Seleziona Utenti dal menu di navigazione SQL.
- Fai clic su Aggiungi account utente. Si apre la scheda Aggiungi un account utente all'istanza instance_name.
- Fai clic sul pulsante di opzione Cloud IAM.
- Aggiungi l'indirizzo email dell'account utente o di servizio che vuoi aggiungere nel campo Entità.
- Fai clic su Aggiungi. L'utente è ora presente nell'elenco degli utenti.
Se l'utente non è assegnato al ruolo Utente istanza Cloud SQL, viene visualizzata un'icona
a sinistra del nome utente.
Per assegnare i privilegi di accesso utente, fai clic sull'icona, quindi seleziona Aggiungi ruolo IAM. L'icona non viene più visualizzata. Ora l'utente è un membro del ruolo.
gcloud
Creare un account utente
Utilizza 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'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: nome dell'istanza a cui vuoi autorizzare l'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 i dati della richiesta, effettua le seguenti sostituzioni:
- project-id: l'ID progetto
- instance-id: l'ID dell'istanza a cui stai aggiungendo l'utente
- username: l'indirizzo email dell'utente
- operation-id: l'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 i dati della richiesta, effettua le seguenti sostituzioni:
- service-acct: l'indirizzo email del tuo account di servizio
- project-id: l'ID progetto
- instance-id: l'ID dell'istanza a cui stai aggiungendo l'account di servizio
- operation-id: l'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 i dati della richiesta, effettua le seguenti sostituzioni:
- project-id: l'ID progetto
- instance-id: l'ID dell'istanza a cui stai aggiungendo l'utente
- username: l'indirizzo email dell'utente
- operation-id: l'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 i dati della richiesta, effettua le seguenti sostituzioni:
- service-acct: l'indirizzo email del tuo account di servizio
- project-id: l'ID progetto
- instance-id: l'ID dell'istanza a cui stai aggiungendo l'account di servizio
- operation-id: l'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 account utente o di servizio si connette a un database, può eseguire query a fronte di qualsiasi oggetto del database il cui accesso è stato concesso a PUBBLICO.
Se necessitano di accesso aggiuntivo, è possibile concedere più 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 utilizzare le virgolette intorno all'email perché contiene caratteri speciali (
@
e.
) - TABLE_NAME: il nome della tabella a cui vuoi concedere l'accesso all'utente.
grant select on TABLE_NAME to "USERNAME";
Rimuovi un utente o un account di servizio IAM dal database
Per rimuovere un utente o un account di servizio dal database, devi eliminare l'account dall'istanza:
Console
-
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
- Per aprire la pagina Panoramica di un'istanza, fai clic sul suo nome.
- Seleziona Utenti dal menu di navigazione SQL.
- Fai clic su per l'utente da rimuovere.
- Seleziona Rimuovi. In questo modo l'accesso verrà revocato solo a questa istanza.
gcloud
Revocare un utente
Utilizza 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
Elimina 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 i dati della richiesta, effettua le seguenti sostituzioni:
- project-id: l'ID progetto
- instance-id: l'ID istanza che preferisci.
- username: l'indirizzo email dell'account dell'utente o del 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" }
Visualizza le informazioni di accesso nei log di controllo
Puoi abilitare gli audit log per acquisire gli accessi IAM al database. Quando si verificano problemi di accesso, puoi utilizzare gli audit log per diagnosticare il problema.
Nota:l'audit logging comporta costi aggiuntivi. Per ulteriori informazioni, consulta la pagina relativa ai prezzi per i dati di logging.
Dopo la configurazione, puoi visualizzare gli audit log di accesso ai dati degli 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
Quando un tentativo di accesso non riesce, 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 maggiori dettagli sull'errore. Per ulteriori informazioni, consulta la sezione 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 ricevuto. Se il messaggio non indica che
hai utilizzato "Autenticazione utente Cloud SQL IAM" o
"Autenticazione account di servizio Cloud SQL IAM", verifica che
il tipo di utente del database utilizzato per accedere sia CLOUD_IAM_USER
o
CLOUD_IAM_SERVICE_ACCOUNT
.
Per verificarlo, 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'indirizzo email dell'utente IAM.
Se hai utilizzato l'autenticazione del database IAM, 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 per l'utente o l'account di servizio IAM previsto e che non sia scaduto.
Se i dettagli indicano la mancanza di 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 il ruolo personalizzato nel criterio IAM del progetto dell'istanza. Per ulteriori informazioni, utilizza lo strumento per la risoluzione dei problemi relativi ai criteri di IAM.
Se l'accesso non riesce a causa dell'indisponibilità dell'autenticazione del database IAM, l'utente può accedere utilizzando l'utente e la password PostgreSQL predefiniti. Questo metodo di accesso consente comunque all'utente di accedere all'intero database. Verifica che la connessione sia protetta.
Passaggi successivi
- Scopri di più sull'autenticazione del database IAM.
- Scopri come accedere a un database Cloud SQL.
- Scopri come configurare le istanze per l'autenticazione del database IAM.