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:
Per Cloud Run, utilizza l'accesso VPC serverless.
Per Cloud Build, utilizza i pool privati.
Prima di iniziare
- Assicurati di avere un'Google Cloud organizzazione e almeno un Google Cloud progetto.
- 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.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
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'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon 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_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
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'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon 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_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
- Aggiorna i componenti di Google Cloud CLI:
gcloud components update --quiet
- 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:
- Cloud Access Binding Admin (
roles/accesscontextmanager.gcpAccessAdmin) - Access Context Manager Admin (
roles/accesscontextmanager.policyAdmin)
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:
- 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.
- Associa il criterio di accesso in modalità di applicazione forzata solo a service account specifici.
- 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
trueper consentire l'accesso efalseper negarlo.La seguente espressione CEL è utile per limitare l'accesso tramite service account.
L'espressione restituisce
truese la richiesta ha avuto origine da uno o più numeri di progetto specificati:expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"originatesFromProjectscontrolla 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.
Segui le istruzioni per creare un livello di accesso di base o creare un livello di accesso personalizzato.
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 organizzazioneSERVICE_ACCOUNT_NAME: il nome, non l'email, del account di servizio di destinazioneSERVICE_ACCOUNT_PROJECT_ID: l'ID del progetto che contiene il account di servizio di destinazionePOLICY_ID: l'ID della policy di accessoACCESS_LEVEL_NAME: il nome del livello di accesso che hai creatoPer 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:
Crea un file
request.jsoncon 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 destinazioneSERVICE_ACCOUNT_PROJECT_ID: l'ID del progetto che contiene il account di servizio di destinazionePOLICY_ID: l'ID della policy di accessoACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato
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 APIORGANIZATION_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 organizzazionePROJECT_NUMBER: il numero del progetto che contiene tutti i service account a cui vuoi associare l'accessoPOLICY_ID: l'ID della policy di accessoACCESS_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:
Crea un file
request.jsoncon 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'accessoPOLICY_ID: l'ID della policy di accessoACCESS_LEVEL_NAME: il nome del livello di accesso che hai creato.
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 APIORGANIZATION_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 destinazionePOLICY_ID: l'ID della policy di accessoACCESS_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:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.
Nella console Google Cloud , seleziona il progetto o l'organizzazione.
Nel campo Query log, inserisci la seguente query:
protoPayload.serviceName="contextawareaccess.googleapis.com" protoPayload.metadata.dryRunEvaluationResult:DENIED SEARCH("`SERVICE_ACCOUNT_NAME`")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'organizzazioneSERVICE_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
Esamina Cloud Audit Logs.
Utilizza la seguente query di log ed esamina le voci di log per ulteriori informazioni.
protoPayload.serviceName="contextawareaccess.googleapis.com"
Esamina il nome della risorsa del livello di accesso che Accesso sensibile al contesto segnala quando registra gli eventi di applicazione.
Assicurati che il livello di accesso sia una risorsa a livello di organizzazione.
Assicurati che il livello di accesso nelle policy di accesso si basi su attributi supportati per i service account.
Verifica che la policy di accesso sia associata al account di servizio previsto.
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.
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
- Scopri come gestire i binding di accesso.