Autenticazione della federazione delle identità per la forza lavoro

Questa pagina descrive come configurare e utilizzare la federazione delle identità per la forza lavoro (nota anche come autenticazione IAM di terze parti) con Cloud SQL. La federazione delle identità della forza lavoro ti consente di utilizzare il tuo provider di identità (IdP) esistente, ad esempio Microsoft Active Directory o Okta, per accedere alle istanze Cloud SQL senza richiedere un Google account.

I vantaggi principali dell'utilizzo della federazione delle identità per la forza lavoro includono:

  • Riduzione del sovraccarico: non è necessario verificare i domini o sincronizzare le identità con Cloud Identity.
  • Maggiore sicurezza: gestione centralizzata dell'accesso al database tramite il tuo IdP aziendale esistente.
  • Facilità di scalabilità: adatto a grandi organizzazioni con esigenze complesse di gestione delle identità.

Per una descrizione dettagliata della federazione delle identità per la forza lavoro, consulta la panoramica della federazione delle identità per la forza lavoro.

Come funziona

La federazione delle identità per la forza lavoro consente agli utenti di autenticarsi in Google Cloud utilizzando un'identità esterna. Per Cloud SQL, questo significa che i principal di un pool di forza lavoro possono connettersi alle istanze Cloud SQL per PostgreSQL.

Cloud SQL supporta la federazione delle identità per la forza lavoro tramite il tipo di utente CLOUD_IAM_WORKFORCE_IDENTITY. Per concedere l'accesso, Cloud SQL convalida le credenziali della forza lavoro e l'autorizzazione IAM a livello di progetto durante l'accesso.

Prima di iniziare

Prima di configurare l'autenticazione del database della federazione delle identità della forza lavoro, assicurati di soddisfare i seguenti prerequisiti:

Ruoli e autorizzazioni

Per ottenere le autorizzazioni necessarie per configurare e utilizzare l'autenticazione della federazione delle identità per la forza lavoro, chiedi all'amministratore di concederti i seguenti ruoli IAM nell'organizzazione:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Configura l'autenticazione della federazione delle identità della forza lavoro

Le sezioni seguenti spiegano come configurare l'istanza in modo che utilizzi l'autenticazione della federazione delle identità per la forza lavoro.

Abilita l'autenticazione IAM sull'istanza

Per abilitare l'autenticazione IAM, imposta il flag cloudsql.iam_authentication su on.

Console

  1. Nella Google Cloud console, vai alla pagina Istanze Cloud SQL.

    Vai a Istanze Cloud SQL

  2. Per aprire la pagina Panoramica di un'istanza, fai clic sul nome dell'istanza.
  3. Fai clic su Modifica.
  4. Espandi la sezione Personalizza la tua istanza.
  5. Espandi la sezione Connessioni.
  6. Nella sezione Sicurezza, seleziona la casella di controllo Abilita autenticazione IAM di Cloud SQL.
  7. Fai clic su Salva.

gcloud

Utilizza il seguente comando per attivare l'autenticazione IAM:

gcloud sql instances patch INSTANCE_NAME \
    --database-flags=cloudsql.iam_authentication=on
  

Sostituisci INSTANCE_NAME con il nome dell'istanza.

Terraform

Aggiungi il blocco database_flags alla risorsa google_sql_database_instance:

resource "google_sql_database_instance" "instance" {
  name             = "INSTANCE_NAME"
  database_version = "POSTGRES_15"
  region           = "REGION"

  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql.iam_authentication"
      value = "on"
    }
  }
}
  

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome dell'istanza
  • REGION: la regione in cui risiede l'istanza.

REST v1

Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

  • PROJECT_ID: l'ID progetto
  • LOCATION_ID: l'ID località
  • INSTANCE_ID: l'ID istanza desiderato
  • REGION: la regione desiderata
  • DATABASE_VERSION: stringa enum della versione del database. Ad esempio: POSTGRES_12
  • PASSWORD: la password per l'utente root
  • MACHINE_TYPE: stringa enum del tipo di macchina (livello), come: db-custom-[CPUS]-[MEMORY_MBS]

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances

Corpo JSON della richiesta:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

Per inviare la richiesta, espandi una di queste 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": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

  • PROJECT_ID: l'ID progetto
  • LOCATION_ID: l'ID località
  • INSTANCE_ID: l'ID istanza desiderato
  • REGION: la regione desiderata
  • DATABASE_VERSION: stringa enum della versione del database. Ad esempio: POSTGRES_12
  • PASSWORD: la password per l'utente root
  • MACHINE_TYPE: stringa enum del tipo di macchina (livello), come: db-custom-[CPUS]-[MEMORY_MBS]

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances

Corpo JSON della richiesta:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

Per inviare la richiesta, espandi una di queste 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": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Aggiungi l'utente dell'identità della forza lavoro all'istanza

Aggiungi l'entità esterna alla tua istanza utilizzando il tipo CLOUD_IAM_WORKFORCE_IDENTITY.

Assicurati che l'ID utente che utilizzi corrisponda al valore fornito dal mapping degli attributi del tuo provider di identità per la forza lavoro. In genere, viene configurato come indirizzo email, ad esempio cruz@example.com.

Console

  1. Nella Google Cloud console, vai alla pagina Istanze Cloud SQL.

    Vai a Istanze 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 il riquadro Aggiungi un account utente all'istanza INSTANCE_NAME.
  5. Seleziona Federazione delle identità per la forza lavoro.
  6. Nel campo Utente della forza lavoro, inserisci l'ID utente dell'utente che vuoi aggiungere.
  7. Fai clic su Aggiungi.

gcloud

Esegui questo comando per creare l'utente:

gcloud sql users create USER_ID \
    --instance=INSTANCE_NAME \
    --type=CLOUD_IAM_WORKFORCE_IDENTITY
  

Sostituisci quanto segue:

  • USER_ID: l'ID utente dell'utente che vuoi aggiungere, ad esempio cruz@example.com.
  • INSTANCE_NAME: il nome dell'istanza

Terraform

Utilizza la risorsa google_sql_user per definire l'utente dell'identità della forza lavoro:

resource "google_sql_user" "workforce_user" {
  name     = "USER_ID" # e.g., "cruz@example.com"
  instance = "INSTANCE_NAME"
  type     = "CLOUD_IAM_WORKFORCE_IDENTITY"
}
  

Sostituisci quanto segue:

  • USER_ID: l'ID utente dell'utente che vuoi aggiungere, ad esempio cruz@example.com.
  • INSTANCE_NAME: il nome dell'istanza

REST v1

Creare un account utente

Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

  • PROJECT_ID: l'ID progetto
  • INSTANCE_ID: l'ID istanza dell'istanza a cui stai aggiungendo l'utente
  • USERNAME: l'indirizzo email dell'utente

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

Corpo JSON della richiesta:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}

Per inviare la richiesta, espandi una di queste 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"
}

REST v1beta4

Creare un account utente

Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

  • PROJECT_ID: l'ID progetto
  • INSTANCE_ID: l'ID istanza dell'istanza a cui stai aggiungendo l'utente
  • USERNAME: l'indirizzo email dell'utente

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

Corpo JSON della richiesta:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
  }

Per inviare la richiesta, espandi una di queste 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"
}

Concedi il ruolo utente dell'istanza

Concedi il ruolo roles/cloudsql.instanceUser all'entità di identità della forza lavoro o all'intero pool.

Console

  1. Nella Google Cloud console, vai alla pagina Service account.

    Vai a IAM

  2. Fai clic su Concedi l'accesso.
  3. Nel campo Nuove entità, esegui una delle seguenti operazioni:

    • Per concedere l'accesso a un'entità individuale, inserisci l'identità della forza lavoro come principal:

      principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID

    • Per concedere l'accesso all'intero pool, inserisci il pool di forza lavoro come principalSet:

      principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*

  4. Nell'elenco Ruolo, seleziona Cloud SQL > Utente istanza Cloud SQL.
  5. (Facoltativo) Se vuoi connetterti utilizzando il proxy di autenticazione Cloud SQL o i connettori di linguaggio Cloud SQL, fai clic su Aggiungi un altro ruolo e poi seleziona Cloud SQL > Client Cloud SQL.
  6. Fai clic su Salva.

gcloud

Per concedere l'accesso a un singolo utente, utilizza il comando gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" \
    --role="roles/cloudsql.instanceUser"
  

Sostituisci quanto segue:

  • USER_ID: l'ID utente dell'utente che vuoi aggiungere, ad esempio cruz@example.com.
  • POOL_ID: l'ID del pool di forza lavoro.
  • PROJECT_ID: l'identificatore del progetto che contiene l'istanza.

Per concedere l'accesso all'intero pool di forza lavoro, utilizza il comando gcloud projects add-iam-policy-binding con il formato membro principalSet:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*" \
    --role="roles/cloudsql.instanceUser"
  

Terraform

Utilizza la risorsa google_project_iam_member per concedere il ruolo all'entità della forza lavoro:

resource "google_project_iam_member" "workforce_user_iam" {
  project = "PROJECT_ID"
  role    = "roles/cloudsql.instanceUser"
  member  = "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
}
  

Sostituisci quanto segue:

  • USER_ID: l'ID utente dell'utente che vuoi aggiungere, ad esempio cruz@example.com.
  • POOL_ID: l'ID del pool di forza lavoro.
  • PROJECT_ID: l'identificatore del progetto che contiene l'istanza.

REST

Per concedere policy IAM utilizzando l'API, recupera la policy IAM del progetto utilizzando il metodo getIamPolicy. Quindi, aggiungi la nuova associazione alla policy e infine applica la policy aggiornata utilizzando il metodo setIamPolicy.

Di seguito è riportato un esempio di payload di associazione da aggiungere alla tua policy IAM:

{
  "bindings": [
    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
      ]
    }
  ]
}
  

Sostituisci quanto segue:

  • USER_ID: l'ID utente dell'utente che vuoi aggiungere, ad esempio cruz@example.com.
  • POOL_ID: l'ID del pool di forza lavoro.

Concedi privilegi per il database

Puoi specificare i ruoli di database da concedere durante la creazione dell'utente di identità della forza lavoro oppure concedere manualmente i privilegi di database all'interno del database.

Ad esempio, per concedere i privilegi manualmente:

GRANT SELECT ON TABLE_NAME TO "USER_ID";

Sostituisci quanto segue:

  • TABLE_NAME: il nome della tabella del database.
  • USER_ID l'ID utente del database delle identità della forza lavoro user, ad esempio cruz@example.com.

Connettersi all'istanza

Ora puoi connetterti all'istanza utilizzando gcloud CLI o il proxy di autenticazione Cloud SQL.

Utilizza gcloud CLI.

Devi prima autenticarti con la tua identità della forza lavoro prima di poter generare un token di accesso.

  1. Per l'autenticazione tramite la federazione delle identità per la forza lavoro, utilizza il comando gcloud auth login con il flag --cred-file:

    gcloud auth login --cred-file=CONFIGURATION_FILE
    

    Sostituisci CONFIGURATION_FILE con il percorso del file di configurazione generato per il tuo provider di identità della forza lavoro.

  2. Per connetterti utilizzando un token generato, esegui questo comando:

    bash export PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"

    Sostituisci quanto segue:

  3. INSTANCE_IP: l'indirizzo IP dell'istanza Cloud SQL.

  4. USER_ID: l'ID utente dell'utente della forza lavoro, ad esempio cruz@example.com.

  5. DB_NAME: il nome del database a cui vuoi connetterti.

Utilizzo del proxy di autenticazione Cloud SQL

Avvia il proxy con il flag --auto-iam-authn:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn

Per saperne di più sul proxy, consulta Informazioni sul proxy di autenticazione Cloud SQL.

Limitazioni e restrizioni

  • ID utente duplicato nei pool: Cloud SQL non è in grado di distinguere i soggetti con lo stesso ID utente in diversi pool di forza lavoro o provider di identità. Se utilizzi più pool o fornitori di forza lavoro, devi utilizzare le policy IAM per assicurarti di non concedere l'autorizzazione di accesso roles/cloudsql.instanceUser a nomi soggetto duplicati di pool o fornitori diversi. In questo modo si impedisce l'accesso non autorizzato da un altro pool o provider con lo stesso ID utente.
  • Quota di accesso: esiste una quota di 12.000 accessi al minuto per ogni istanza, che include i tentativi di accesso riusciti e non riusciti. Quando la quota viene superata, gli accessi non sono temporaneamente disponibili. Ti consigliamo di evitare accessi frequenti e di limitare gli accessi utilizzando reti autorizzate.

Passaggi successivi