Configurare l'accesso sensibile al contesto per i service account

Questa guida descrive come configurare l'accesso sensibile al contesto per proteggere l'accesso all'account di servizio alle API in base ai livelli di accesso che definisci. Google Cloud

Limitazioni

Ai criteri di accesso sensibile al contesto per gli account di servizio si applicano le seguenti limitazioni:

  • Gli attributi basati sulla rete o sull'indirizzo IP non possono essere utilizzati per i binding dei service account se questi verranno utilizzati per le esecuzioni dei flussi di lavoro e Cloud Scheduler.

  • Le connessioni ai cluster GKE privati, utilizzando kubectl, e a Cloud SQL, utilizzando Auth Proxy, non possono essere bloccate dalle norme di accesso sensibile al contesto.

  • Se un livello di accesso associato a un account di servizio contiene attributi non supportati, ad esempio attributi Device, l'accesso API viene negato.

  • 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à VPC integrate:

Prima di iniziare

  1. Assicurati di avere un'Google Cloud organizzazione e almeno un Google Cloud progetto.
  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 carichi di lavoro.
  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 Google Cloud progetto.

    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.
    • Creare 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. Installa Google Cloud CLI.

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

  10. Per inizializzare gcloud CLI, esegui questo comando:

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

    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.
    • Creare 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 .

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

  13. Aggiorna i componenti di Google Cloud CLI:
    gcloud components update --quiet
  14. Crea un account di servizio nel tuo progetto se non ne hai già uno. Questo account di servizio è la destinazione della policy di accesso.

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 Service Account Admin (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 sull'account utente o sul 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 a diversi livelli di risorse

Puoi associare criteri di accesso con la stessa modalità di applicazione a risorse che si trovano a diversi livelli della gerarchia delle risorse. Quando una risorsa tenta l'accesso, 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 un criterio di accesso in modalità di applicazione direttamente a un account di servizio e un criterio in modalità di applicazione diverso al progetto che contiene il account di servizio. Quando il account di servizio tenta di accedere alle risorse, l'accesso sensibile al contesto valuta il criterio associato al account di servizio. Per gli altri service account nel progetto a cui non sono associate policy di accesso sensibile al contesto, quest'ultimo valuta la policy in modalità di applicazione associata al progetto. Lo stesso vale se la modalità di applicazione è 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 di accesso per implementare in modo incrementale e selettivo le policy di accesso. Ad esempio, puoi:

  1. Associa una policy di accesso 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 il criterio di accesso in modalità di applicazione forzata solo a service account specifici.
  3. Collega la policy di accesso in modalità di applicazione a livello di progetto e collega una policy di accesso in modalità di applicazione meno restrittiva a service account specifici in base alle necessità.

Attributi dei livelli di accesso per i service account

Questa sezione elenca i livelli di accesso supportati per i service account.

Per i service account sono supportati i seguenti attributi:

  • Subnet IP, che si basano sull'indirizzo IP pubblico.
  • Reti VPC, basate sull'indirizzo IP privato.
  • Geolocalizzazione, che si basa sull'indirizzo IP pubblico.

    Quando il account di servizio effettua una richiesta alle API Google Cloud, la richiesta viene valutata dall'accesso sensibile al contesto e l'indirizzo IP della richiesta viene confrontato con gli indirizzi IP specificati nel criterio di accesso sensibile al contesto. Se gli indirizzi IP corrispondono, la chiamata API è consentita. Se l'indirizzo IP non corrisponde, la chiamata API viene rifiutata.

  • 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 tramite service account.

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

        expression: "originatesFromProjects(origin, [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, basata su ora e data della richiesta in un fuso orario specificato.

    Per ulteriori informazioni, vedi 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 della policy di accesso, che ha il 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 all'interno 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: l' Google Cloud ID organizzazione
  • SERVICE_ACCOUNT_NAME: il nome, non l'email, del account di servizio di destinazione
  • SERVICE_ACCOUNT_PROJECT_ID: l'ID del progetto che contiene il account di servizio di destinazione
  • POLICY_ID: l'ID della policy di accesso
  • ACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato

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

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 il seguente contenuto:

    {
      "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: il nome, non l'email, del account di servizio di destinazione

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

    • POLICY_ID: l'ID della policy di 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: l'ID della tua Google Cloud organizzazione.

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

Questa sezione descrive come associare il livello di accesso a tutti gli account di servizio in 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: l' Google Cloud ID organizzazione
  • PROJECT_NUMBER: il numero del progetto che contiene tutti i service account a cui vuoi associare l'accesso
  • POLICY_ID: l'ID della policy di 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:

  1. Crea un file request.json con il seguente contenuto:

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

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del progetto che contiene tutti i service account a cui vuoi associare l'accesso
    • POLICY_ID: l'ID della policy di 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: l' Google Cloud ID organizzazione

Per utilizzare l'accesso sensibile al contesto senza applicare forzatamente il livello di accesso e negare l'accesso, puoi associare la policy di accesso in modalità di prova.

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

Utilizzare la modalità dry run

Puoi associare la policy 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 di accedere in violazione delle norme di accesso, le violazioni vengono registrate in Cloud Audit Logs.

Associa le policy di accesso in modalità dry run

gcloud

Per associare le policy 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 le policy 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
  • ACCESS_LEVEL_NAME: il nome del livello di accesso

Controllare Cloud Audit Logs

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

Console

Per visualizzare i negazioni di accesso all'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 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 periodo 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 al account di servizio in modalità di simulazione di Cloud Audit Logs utilizzando gcloud CLI:

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: il nome del account di servizio

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

Risoluzione dei problemi

Questa sezione descrive come risolvere i problemi relativi all'accesso sensibile al contesto per gli account di servizio.

Risoluzione dei problemi generali

  1. Esamina Cloud Audit Logs.

    Utilizza la seguente query di log ed esamina le voci di log per ulteriori informazioni.

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    
  2. Esamina il nome della risorsa del livello di accesso che Accesso sensibile al contesto segnala quando registra gli eventi di applicazione.

  3. Assicurati che il livello di accesso sia una risorsa a livello di organizzazione.

  4. Assicurati che il livello di accesso nelle policy di accesso si basi su attributi supportati per i service account.

  5. Verifica che la policy di accesso sia associata al account di servizio previsto.

  6. Assicurati che l'identità del tuo utente non sia limitata da una norma di accesso. Ciò può accadere quando un'identità utente è membro di un gruppo Google che ha un criterio di accesso vincolato. Questo criterio potrebbe limitare l'accesso degli utenti, impedendo a sua volta il flusso di chiamate all'account di servizio.

  7. Contatta l'amministratore della sicurezza.

Accesso negato

L'accesso è negato per i seguenti motivi:

  • Hai associato la policy di accesso in modalità di applicazione anziché in modalità dry run.

    Anziché l'applicazione forzata, puoi utilizzare la modalità dry run per consentire ai service account di accedere alle risorse e registrare gli eventi di applicazione forzata senza negare effettivamente l'accesso alle risorse. Inoltre, puoi seguire le istruzioni generali per la risoluzione dei problemi.

  • Il livello di accesso deve essere aggiornato per includere più origini. Ad esempio, viene utilizzato un indirizzo IP che non era incluso nel livello di accesso al momento della creazione.

Passaggi successivi