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
- 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 e inizializza l'interfaccia a riga di comando di Google Cloud.
-
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 e inizializza l'interfaccia a riga di comando di Google Cloud.
-
Attiva Cloud Key Management Service API.
- Assicurati di avere il ruolo Amministratore Cloud SQL sul tuo account utente.
- Abilita l'autenticazione IAM dei database sulla tua istanza Cloud SQL.
- 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.
- 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
-
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
- Per aprire la pagina Panoramica di un'istanza, fai clic sul nome dell'istanza.
- 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'utente o dell'account di servizio che vuoi aggiungere nel campo Membro.
- Fai clic su Aggiungi. L'utente è ora presente nell'elenco degli utenti.
- Per concedere i privilegi di accesso utente, fai clic su
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
-
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
- Per aprire la pagina Panoramica di un'istanza, fai clic sul nome dell'istanza.
- Seleziona Utenti dal menu di navigazione SQL.
- Fai clic su in corrispondenza dell'utente che vuoi rimuovere.
- 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
- Scopri di più sull'autenticazione del database IAM.
- Scopri come accedere a un database Cloud SQL.
- Scopri come configurare le istanze per l'autenticazione IAM dei database.