Configurare l'accesso sensibile al contesto per i service account

Questa guida descrive come configurare l'accesso sensibile al contesto per contribuire a proteggere l'accesso dei service account alle API Google Cloud , in base ai livelli di accesso che definisci.

Limitazioni

Le seguenti limitazioni si applicano alle policy di accesso sensibile al contesto per i service account:

  • Non puoi utilizzare attributi basati sulla rete o sull'indirizzo IP per le associazioni dei service account se il account di servizio viene utilizzato per le esecuzioni del workflow e Cloud Scheduler.

  • Le policy di accesso sensibile al contesto non possono bloccare le connessioni ai cluster privati di Google Kubernetes Engine (GKE) utilizzando kubectl o a Cloud SQL utilizzando il proxy di autenticazione.

  • Se un livello di accesso che associ a un account di servizio contiene attributi non supportati, ad esempio attributi Device, l'accesso sensibile al contesto nega l'accesso all'API.

  • I livelli di accesso con ambito non sono supportati per i service account.

Se utilizzi Cloud Build e Cloud Run, ti consigliamo di utilizzare le seguenti funzionalità integrate di Virtual Private Cloud (VPC):

Prima di iniziare

  1. Assicurati di avere un'organizzazioneGoogle Cloud e almeno un progettoGoogle Cloud .
  2. 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 senza costi per l'esecuzione, il test e il deployment dei workload.
  3. Installa Google Cloud CLI.

  4. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  5. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  6. Crea o seleziona un progetto Google Cloud .

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per cui ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Crea un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  7. Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .

  8. Abilita le API IAM, Gestore contesto accesso e API Resource Manager, se non sono già abilitate:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  9. Installa Google Cloud CLI.

  10. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  11. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  12. Crea o seleziona un progetto Google Cloud .

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per cui ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Crea un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  13. Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .

  14. Abilita le API IAM, Gestore contesto accesso e API Resource Manager, se non sono già abilitate:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  15. Aggiorna i componenti di Google Cloud CLI:
    gcloud components update --quiet
  16. Crea un service account nel tuo progetto, se non ne hai già uno. Questo account di servizio è la destinazione della policy di accesso sensibile al contesto.

Ruoli obbligatori

Questa sezione descrive i ruoli Identity and Access Management (IAM) necessari per utilizzare l'accesso sensibile al contesto.

Ruoli a livello di progetto

Per ottenere l'autorizzazione necessaria a livello di progetto, chiedi all'amministratore di concederti il ruolo IAM Amministratore service account (roles/iam.serviceAccountAdmin) nell'account utente o nel account di servizio. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene l'autorizzazione the required permissions necessaria per a livello di progetto.

Potresti anche ottenere questa autorizzazione con ruoli personalizzati o altri ruoli predefiniti.

Ruoli a livello di organizzazione

Per ottenere l'autorizzazione necessaria a livello di organizzazione, chiedi all'amministratore di concederti i seguenti ruoli IAM nell'account utente o nel account di servizio:

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

Questo ruolo predefinito contiene l'autorizzazione the required permissions, necessaria a livello di organizzazione.

Potresti anche ottenere questa autorizzazione con ruoli personalizzati o altri ruoli predefiniti.

Associa le policy di accesso sensibile al contesto a diversi livelli di risorse

Puoi associare le policy di accesso sensibile al contesto con la stessa modalità di applicazione forzata alle risorse che si trovano a livelli diversi della gerarchia delle risorse. Quando una risorsa tenta di accedere, l'accesso sensibile al contesto utilizza la policy associata a quella risorsa prima di tentare di utilizzare una policy associata a una risorsa di livello superiore.

Ad esempio, puoi associare una policy in modalità di applicazione forzata direttamente a un account di servizio e una policy in modalità di applicazione forzata diversa al progetto che contiene il account di servizio. Quando il account di servizio tenta di accedere alle risorse, l'accesso sensibile al contesto valuta la policy associata al account di servizio. Per gli altri service account del progetto a cui non sono associate policy, l'accesso sensibile al contesto valuta la policy in modalità di applicazione forzata associata al progetto. Lo stesso vale se la modalità di applicazione forzata è impostata su dry run sia per la policy a livello di progetto sia per la policy a livello di service account.

Puoi utilizzare più policy per eseguirne il deployment in modo incrementale e selettivo, ad esempio:

  1. Associa una policy in modalità dry run a livello di progetto e assicurati che funzioni come previsto controllando gli eventi di accesso negato in Cloud Audit Logs.
  2. Associa la policy in modalità di applicazione forzata solo a service account specifici.
  3. Associa la policy in modalità di applicazione forzata a livello di progetto e associa una policy meno restrittiva in modalità di applicazione forzata a service account specifici, in base alle esigenze.

Attributi del livello di accesso per i service account

Questa sezione elenca gli attributi del livello di accesso supportati per i service account.

Per i service account sono supportati i seguenti attributi:

  • Subnet IP, basate sull'indirizzo IP pubblico.
  • Reti VPC, basate sull'indirizzo IP privato.
  • Geolocalizzazione, basata sull'indirizzo IP pubblico.

    Quando il account di servizio effettua una richiesta alle API Google Cloud, l'accesso sensibile al contesto valuta la richiesta e confronta l'indirizzo IP della richiesta con gli indirizzi IP specificati nella policy di accesso sensibile al contesto. Se gli indirizzi IP corrispondono, l'accesso sensibile al contesto consente la chiamata API. Se gli indirizzi IP non corrispondono, l'accesso sensibile al contesto nega la chiamata API.

  • Un livello di accesso personalizzato con un'espressione Common Expression Language (CEL). L'espressione deve restituire true per consentire l'accesso e false per negarlo.

    La seguente espressione CEL è utile per limitare l'accesso da parte dei service account.

    L'espressione restituisce true se la richiesta proviene da uno o più numeri di progetto specificati:

        expression: "originatesFromProjects(origin, ['projects/PROJECT_NUMBER'])"
        

    originatesFromProjects controlla se la richiesta proviene da una rete associata al progetto specificato e se proviene da un indirizzo IP privato.

  • Ora del giorno, che si basa sull'ora e sulla data della richiesta in un fuso orario specificato.

    Per saperne di più, consulta Configurazione delle condizioni di accesso per ora e giorno.

Crea un livello di accesso

Questa sezione descrive come creare un livello di accesso all'interno della tua organizzazione. I livelli di accesso definiscono le condizioni in base alle quali è consentito l'accesso.

  1. Segui le istruzioni per creare un livello di accesso di base o creare un livello di accesso personalizzato.

  2. Prendi nota del nome completo del livello di accesso, che ha il seguente formato: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME.

Crea un'associazione di accesso

Associa il livello di accesso al account di servizio selezionato. In questo modo vengono applicate le condizioni definite nel livello di accesso. Puoi associare il livello di accesso a un singolo account di servizio o a tutti i service account di un progetto.

Associa il livello di accesso a un account di servizio specifico

Questa sezione descrive come associare il livello di accesso a un service account specifico.

gcloud

Associa il livello di accesso a un account di servizio utilizzando gcloud CLI.

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Sostituisci quanto segue:

  • ORGANIZATION_ID: il tuo ID organizzazione Google Cloud.
  • SERVICE_ACCOUNT_NAME: l'ID del service account di destinazione (la parte dell'indirizzo email prima del simbolo @).
  • SERVICE_ACCOUNT_PROJECT_ID: l'ID del progetto che contiene il account di servizio di destinazione.
  • POLICY_ID: l'ID della policy di accesso di Gestore contesto accesso.
  • ACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato.

    Per utilizzare l'accesso sensibile al contesto senza applicare il livello di accesso e non consentire l'accesso, puoi associare il livello di accesso in modalità dry run.

API REST

Per associare il livello di accesso a un account di servizio specifico utilizzando l'API REST, esegui questo comando:

  1. Crea un file request.json con i seguenti contenuti:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Sostituisci quanto segue:

    • SERVICE_ACCOUNT_NAME: l'ID del account di servizio di destinazione (la parte dell'indirizzo email prima del simbolo @).

    • SERVICE_ACCOUNT_PROJECT_ID: l'ID del progetto che contiene il account di servizio di destinazione.

    • POLICY_ID: l'ID della policy di accesso di Gestore contesto accesso.

    • ACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato.

  2. Esegui questo comando:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del progetto che utilizzi per effettuare le chiamate API.

    • ORGANIZATION_ID: il tuo ID organizzazione Google Cloud.

Associa il livello di accesso a tutti i service account di un progetto

Questa sezione descrive come associare il livello di accesso a tutti i service account di un progetto.

gcloud

Per associare il livello di accesso a tutti i service account di un progetto utilizzando gcloud CLI, esegui questo comando:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Sostituisci quanto segue:

  • ORGANIZATION_ID: il tuo ID organizzazione Google Cloud.
  • PROJECT_NUMBER: il numero di progetto che contiene tutti i service account a cui vuoi associare l'accesso.
  • POLICY_ID: l'ID della policy di accesso di Gestore contesto accesso.
  • ACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato.

API REST

Per associare il livello di accesso a tutti i service account di un progetto utilizzando l'API REST, segui questi passaggi:

  1. Crea un file request.json con i seguenti contenuti:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero di progetto che contiene tutti i service account a cui vuoi associare l'accesso.
    • POLICY_ID: l'ID della policy di accesso di Gestore contesto accesso.
    • ACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato.
  2. Esegui questo comando:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del progetto che utilizzi per effettuare le chiamate API.
    • ORGANIZATION_ID: il tuo ID organizzazione Google Cloud.

Per utilizzare l'accesso sensibile al contesto senza applicare il livello di accesso e negare l'accesso, puoi associare il livello di accesso in modalità dry run.

La risposta dell'API per l'operazione di creazione del binding include il nome del binding, che contiene l'ID binding univoco.

Utilizza la modalità dry run

Puoi associare il livello di accesso in modalità dry run. Quando utilizzi la modalità dry run, i tuoi service account possono continuare ad accedere alle risorse senza applicazione. Tuttavia, se i tuoi service account tentano un accesso che viola il livello di accesso, l'accesso sensibile al contesto registra la violazione in Cloud Audit Logs.

Associa il livello di accesso in modalità dry run

gcloud

Per associare il livello di accesso in modalità dry run, sostituisci il parametro --level con --dry-run-level, formattato come segue:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

API REST

Per associare il livello di accesso in modalità dry run, crea il file request.json con i seguenti contenuti:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

Sostituisci quanto segue:

  • TARGET_PROJECT_NUMBER: il numero del progetto di destinazione.
  • POLICY_ID: l'ID della policy di accesso di Gestore contesto accesso.
  • ACCESS_LEVEL_NAME: il nome del livello di accesso.

Controlla Cloud Audit Logs

Questa sezione descrive come controllare in Cloud Audit Logs i rifiuti di accesso in modalità dry run per il tuo account di servizio. Per saperne di più sulla ricerca di voci in modalità dry run in Cloud Audit Logs, consulta Visualizza i log della modalità dry run.

Console

Per visualizzare i rifiuti di accesso ai account di servizio in modalità dry run di Cloud Audit Logs utilizzando la console Google Cloud , segui questi passaggi:

Nella console Google Cloud , vai alla pagina Esplora log:

Vai a Esplora log

Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

  1. Nella console Google Cloud , seleziona il progetto o l'organizzazione.

  2. Nel campo Query di log, inserisci la seguente query:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("SERVICE_ACCOUNT_NAME")
    
  3. Nel selettore dell'intervallo di tempo, scegli un intervallo di tempo relativo predefinito, ad esempio Ultimi 30 minuti, Ultima ora o Ultime 24 ore, oppure specifica un intervallo personalizzato.

gcloud

Per visualizzare i rifiuti di accesso dei account di servizio in modalità dry run di Cloud Audit Logs utilizzando gcloud CLI, segui questi passaggi:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("SERVICE_ACCOUNT_NAME")' \
  --organization=ORGANIZATION_ID

Sostituisci quanto segue:

  • ORGANIZATION_ID: l'ID dell'organizzazione.
  • SERVICE_ACCOUNT_NAME: l'ID del service account (la parte dell'indirizzo email prima del simbolo @).

Il comando gcloud logging read supporta il flag --freshness per visualizzare le informazioni di logging in periodi di tempo relativi. Ad esempio, aggiungendo --freshness=3h al comando, puoi visualizzare le voci di log della modalità dry run delle ultime 3 ore.

Passaggi successivi