Questo tutorial mostra come archiviare i dati sensibili utilizzati dai cluster Google Kubernetes Engine (GKE) in Secret Manager. Scopri come accedere in modo più sicuro ai dati dai tuoi pod utilizzando Workload Identity Federation for GKE e le librerie clientGoogle Cloud .
L'archiviazione dei dati sensibili al di fuori dello spazio di archiviazione del cluster riduce il rischio di accesso non autorizzato ai dati in caso di attacco. L'utilizzo della federazione delle identità dei workload per GKE per accedere ai dati consente di evitare i rischi associati alla gestione delle chiavi dei account di servizio di lunga durata e di controllare l'accesso ai secret utilizzando Identity and Access Management (IAM) anziché le regole RBAC nel cluster. Puoi utilizzare qualsiasi fornitore di archiviazione di secret esterni, come Secret Manager o HashiCorp Vault.
Questa pagina è rivolta agli esperti di sicurezza che vogliono spostare i dati sensibili fuori dallo spazio di archiviazione nel cluster. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE Enterprise.
Questo tutorial utilizza un cluster GKE Autopilot. Per eseguire i passaggi utilizzando GKE Standard, devi abilitare manualmente la federazione delle identità per i carichi di lavoro per GKE.
Puoi utilizzare la federazione delle identità dei carichi di lavoro per GKE per accedere a qualsiasi API Google Cloud dai carichi di lavoro GKE senza dover utilizzare approcci meno sicuri come i file delle chiavi dell'account di servizio statici. Questo tutorial utilizza Secret Manager come esempio, ma puoi utilizzare gli stessi passaggi per accedere ad altre Google Cloud API. Per saperne di più, consulta la pagina Workload Identity Federation for GKE.
Obiettivi
- Crea un secret in Google Cloud Secret Manager.
- Crea un cluster GKE Autopilot, spazi dei nomi Kubernetes e account di servizio Kubernetes.
- Crea criteri di autorizzazione IAM per concedere l'accesso ai tuoi service account Kubernetes sul secret.
- Utilizza le applicazioni di test per verificare l'accesso all'account di servizio.
- Esegui un'app di esempio che accede al secret utilizzando l'API Secret Manager.
Costi
In questo documento, utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Secret Manager APIs:
gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Secret Manager APIs:
gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/secretmanager.admin, roles/container.clusterAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Prepara l'ambiente
Clona il repository GitHub che contiene i file di esempio per questo tutorial:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd ~/kubernetes-engine-samples/security/wi-secrets
Crea un secret in Secret Manager
Il seguente esempio mostra i dati che utilizzerai per creare un secret:
Crea un secret per archiviare i dati di esempio:
gcloud secrets create bq-readonly-key \ --data-file=manifests/bq-readonly-key \ --ttl=3600s
Questo comando esegue le seguenti operazioni:
- Crea un nuovo secret Secret Manager con la chiave di esempio
nella regione
us-central1
Google Cloud . - Imposta la scadenza del secret un'ora dopo l'esecuzione del comando.
- Crea un nuovo secret Secret Manager con la chiave di esempio
nella regione
Crea il cluster e le risorse Kubernetes
Crea un cluster GKE, spazi dei nomi Kubernetes e service account Kubernetes. Crea due spazi dei nomi, uno per l'accesso di sola lettura e uno per l'accesso in lettura/scrittura al secret. Crea anche un account di servizio Kubernetes in ogni spazio dei nomi da utilizzare con la federazione delle identità per i carichi di lavoro per GKE.
Crea un cluster GKE Autopilot:
gcloud container clusters create-auto secret-cluster \ --region=us-central1
Il deployment del cluster potrebbe richiedere circa cinque minuti. I cluster Autopilot hanno sempre abilitata la federazione delle identità per i carichi di lavoro per GKE. Se invece vuoi utilizzare un cluster GKE Standard, devi abilitare manualmente la federazione delle identità per i carichi di lavoro per GKE prima di continuare.
Crea uno spazio dei nomi
readonly-ns
e uno spazio dei nomiadmin-ns
:kubectl create namespace readonly-ns kubectl create namespace admin-ns
Crea un account di servizio Kubernetes
readonly-sa
e un account di servizio Kubernetesadmin-sa
:kubectl create serviceaccount readonly-sa --namespace=readonly-ns kubectl create serviceaccount admin-sa --namespace=admin-ns
Creazione di criteri di autorizzazione IAM
Concedi all'account di servizio
readonly-sa
l'accesso in sola lettura al secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/readonly-ns/sa/readonly-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=None
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero di progetto Google Cloud numerico.PROJECT_ID
: il tuo ID progetto Google Cloud .
Concedi all'account di servizio
admin-sa
l'accesso in lettura e scrittura al secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=None gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretVersionAdder' \ --condition=None
Verifica l'accesso segreto
Esegui il deployment dei pod di test in ogni spazio dei nomi per verificare l'accesso in lettura e scrittura e di sola lettura.
Rivedi il manifest del pod di sola lettura:
Questo pod utilizza il account di servizio
readonly-sa
nello spazio dei nomireadonly-ns
.Rivedi il manifest del pod di lettura/scrittura:
Questo pod utilizza il account di servizio
admin-sa
nello spazio dei nomiadmin-ns
.Esegui il deployment dei pod di test:
kubectl apply -f manifests/admin-pod.yaml kubectl apply -f manifests/readonly-pod.yaml
L'avvio dei pod potrebbe richiedere alcuni minuti. Per monitorare l'avanzamento, esegui questo comando:
watch kubectl get pods -n readonly-ns
Quando lo stato del pod cambia in
RUNNING
, premiCtrl+C
per tornare alla riga di comando.
Testare l'accesso di sola lettura
Apri una shell nel pod
readonly-test
:kubectl exec -it readonly-test --namespace=readonly-ns -- /bin/bash
Prova a leggere il secret:
gcloud secrets versions access 1 --secret=bq-readonly-key
L'output è
key=my-api-key
.Prova a scrivere nuovi dati nel secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-
L'output è simile al seguente:
ERROR: (gcloud.secrets.versions.add) PERMISSION_DENIED: Permission 'secretmanager.versions.add' denied for resource 'projects/PROJECT_ID/secrets/bq-readonly-key' (or it may not exist).
Il pod che utilizza l'account di servizio di sola lettura può solo leggere il secret e non può scrivere nuovi dati.
Esci dal pod:
exit
Testare l'accesso in lettura/scrittura
Apri una shell nel pod
admin-test
:kubectl exec -it admin-test --namespace=admin-ns -- /bin/bash
Prova a leggere il secret:
gcloud secrets versions access 1 --secret=bq-readonly-key
L'output è
key=my-api-key
.Prova a scrivere nuovi dati nel secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-
L'output è simile al seguente:
Created version [2] of the secret [bq-readonly-key].
Leggi la nuova versione del secret:
gcloud secrets versions access 2 --secret=bq-readonly-key
L'output è
my-second-api-key
.Esci dal pod:
exit
I pod ottengono solo il livello di accesso che hai concesso all'account di servizio Kubernetes utilizzato nel manifest del pod. Tutti i pod che utilizzano l'account Kubernetes admin-sa
nello spazio dei nomi admin-ns
possono scrivere nuove versioni del secret, ma tutti i pod nello spazio dei nomi readonly-ns
che utilizzano il account di servizio Kubernetes readonly-sa
possono solo leggere il secret.
Accedere ai secret dal codice
In questa sezione, imparerai a:
Esegui il deployment di un'applicazione di esempio che legge il secret in Secret Manager utilizzando le librerie client.
Verifica che l'applicazione possa accedere al tuo secret.
Ti consigliamo di accedere ai secret di Secret Manager dal codice dell'applicazione ogni volta che è possibile, utilizzando l'API Secret Manager.
Esamina il codice sorgente dell'applicazione di esempio:
Questa applicazione chiama l'API Secret Manager per tentare di leggere il segreto.
Esamina il manifest del pod dell'applicazione di esempio:
Questo manifest fa quanto segue:
- Crea un pod nello spazio dei nomi
readonly-ns
che utilizza il account di servizioreadonly-sa
. - Esegue il pull di un'applicazione di esempio da un registro delle immagini Google. Questa
applicazione chiama l'API Secret Manager utilizzando le
librerie clientGoogle Cloud . Puoi visualizzare il codice dell'applicazione
in
/main.go
nel repository. - Imposta le variabili di ambiente da utilizzare per l'applicazione di esempio.
- Crea un pod nello spazio dei nomi
Sostituisci le variabili di ambiente nell'applicazione di esempio:
sed -i "s/YOUR_PROJECT_ID/PROJECT_ID/g" "manifests/secret-app.yaml"
Distribuisci l'applicazione di esempio:
kubectl apply -f manifests/secret-app.yaml
Potrebbero essere necessari alcuni minuti prima che il pod inizi a funzionare. Se il pod ha bisogno di un nuovo nodo nel cluster, potresti notare eventi di tipo
CrashLoopBackOff
mentre GKE esegue il provisioning del nodo. Gli arresti anomali si interrompono quando il provisioning del nodo viene eseguito correttamente.Verifica l'accesso segreto:
kubectl logs readonly-secret-test -n readonly-ns
L'output è
my-second-api-key
. Se l'output è vuoto, il pod potrebbe non essere ancora in esecuzione. Attendi alcuni minuti e riprova.
Approcci alternativi
Se devi montare i tuoi dati sensibili sui pod, utilizza il componente aggiuntivo Secret Manager per GKE. Questo componente aggiuntivo esegue il deployment e gestisce il provider Google Cloud Secret Manager per il driver CSI Kubernetes Secret Store nei tuoi cluster GKE. Per istruzioni, consulta Utilizzare il componente aggiuntivo Secret Manager con GKE.
Fornire i secret come volumi montati comporta i seguenti rischi:
- I volumi montati sono vulnerabili agli attacchi di attraversamento delle directory.
- Le variabili di ambiente possono essere compromesse a causa di errori di configurazione, ad esempio l'apertura di un endpoint di debug.
Se possibile, ti consigliamo di accedere ai secret a livello di programmazione tramite l'API Secret Manager. Per istruzioni, utilizza l'applicazione di esempio in questo tutorial o consulta le librerie client Secret Manager.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina singole risorse
Elimina il cluster:
gcloud container clusters delete secret-cluster \ --region=us-central1
(Facoltativo) Elimina il secret in Secret Manager:
gcloud secrets delete bq-readonly-key
Se non esegui questo passaggio, il segreto scade automaticamente perché hai impostato il flag
--ttl
durante la creazione.
Elimina il progetto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Passaggi successivi
- Scopri di più sul funzionamento di Workload Identity Federation for GKE.
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.