Scopri come criptare i Secret di Kubernetes a livello dell'applicazione utilizzando una chiave gestita da te in Cloud Key Management Service (Cloud KMS). Poiché questa funzione si basa su funzionalità di Cloud KMS, è consigliabile acquisire familiarità con rotazione delle chiavi e crittografia envelope.
Per seguire le indicazioni dettagliate per questa attività direttamente nella console Google Cloud, fai clic su Procedura guidata:
Panoramica
Per impostazione predefinita, Google Kubernetes Engine (GKE) cripta i contenuti dei clienti archiviati a riposo, inclusi i secret. GKE gestisce questa crittografia predefinita per conto tuo senza che tu debba fare altro.
La crittografia dei secret a livello di applicazione fornisce un ulteriore livello di sicurezza per i dati sensibili, come come Secret, archiviati in etcd. Puoi utilizzare una chiave gestita con Cloud KMS per criptare i dati in si trovano al livello dell'applicazione. Questa crittografia protegge da malintenzionati che accedere a una copia offline di etcd.
Per utilizzare la crittografia dei secret a livello di applicazione, devi prima creare una chiave Cloud KMS e concedere all'account di servizio GKE l'accesso alla chiave. Puoi utilizzare una chiave dispone di uno qualsiasi dei livelli di protezione supportati da Cloud KMS.
Assicurati che la chiave si trovi nella stessa località del cluster per ridurre la latenza e previeni i casi in cui le risorse dipendono da servizi distribuiti in più errori domini. Dopo aver creato una chiave, puoi abilitare la funzionalità su una chiave nuova o esistente specificando la chiave che vuoi utilizzare. Quando attivi la funzionalità, GKE cripta tutti i secret nuovi ed esistenti utilizzando la tua chiave di crittografia.
Crittografia envelope
Kubernetes offre la crittografia con envelope dei secret con un provider KMS, il che significa che per criptare i secret viene utilizzata una chiave locale, comunemente chiamata chiave di crittografia dei dati (DEK). La DEK stessa è criptata con un'altra chiave chiamata chiave di crittografia della chiave (KEK). Kubernetes non memorizza la KEK.
La crittografia envelope offre i seguenti vantaggi:
- Miglioramento delle prestazioni rispetto alla crittografia con chiave pubblica: GKE utilizza l'API Cloud KMS solo per criptare nuove DEK con la KEK o per decriptare una DEK quando la cache locale è vuota.
- Migliore gestione delle chiavi su larga scala: una singola KEK può criptare più DEK. Il numero di chiavi da archiviare in Cloud KMS è molto inferiore al numero di chiavi che criptano i tuoi dati.
- Capacità di utilizzare una radice di attendibilità centrale: i secret archiviati in Kubernetes può affidarsi a una radice di attendibilità esterna. Ciò significa che puoi utilizzare un'autorità di certificazione centrale, ad esempio un modulo di sicurezza hardware, per tutti i tuoi secret. Un avversario che accede ai tuoi contenitori offline non può ottenere i tuoi segreti.
Con la crittografia dei secret a livello di applicazione in GKE, GKE cripta i secret che utilizzano le DEK locali Provider AES-CBC. GKE cripta le DEK con una KEK che puoi gestire di Cloud KMS.
Per scoprire di più sulla crittografia dell'involucro, consulta Crittografia dell'involucro.
Cosa succede quando crei un secret
Quando crei un nuovo secret, ecco cosa succede:
Il server API Kubernetes genera un DEK univoco per il secret utilizzando un generatore di numeri casuali.
Il server API Kubernetes utilizza la DEK localmente per criptare il secret.
Il plug-in KMS invia la DEK a Cloud KMS per la crittografia. KMS utilizza l'account di servizio GKE del progetto devono eseguire l'autenticazione in Cloud KMS.
Cloud KMS cripta la DEK utilizzando la KEK e la invia nuovamente al plug-in KMS.
Il server API Kubernetes salva il secret e la DEK criptati. La DEK in testo non crittografato non viene salvata su un disco e viene archiviata solo nel server API la memoria.
Il server dell'API Kubernetes crea una voce della cache che mappa la DEK criptata alla DEK in testo non cifrato in memoria. Questo consente al server API di decriptare il secret senza utilizzare Cloud KMS.
Quando un client richiede un segreto al server API Kubernetes, accade quanto segue:
Il server API Kubernetes recupera il secret e la DEK criptati.
Il server API di Kubernetes controlla se nella cache è presente una voce di mappatura esistente e decripta il secret senza utilizzare Cloud KMS.
Se non viene trovata una voce della cache, il plug-in KMS invia la DEK a Cloud KMS per la decrittografia utilizzando la KEK. La DEK decriptata viene quindi utilizzato per decriptare il secret.
Il server API Kubernetes restituisce il secret decriptato al client.
Che cosa succede quando distruggi una chiave
Quando distruggi una KEK in Cloud KMS utilizzata per criptare un secret in GKE, il secret non è più disponibile, a meno che non aggiorni il cluster per utilizzare prima una nuova KEK.
Se prevedi di distruggere una vecchia versione del KEK dopo una rotazione delle chiavi, utilizza prima la nuova versione del KEK per ricripptare il secret. Se vuoi, puoi conservare la versione precedente della KEK per evitare di ricricare i secret, ma continuerai a ricevere la fatturazione per tutte le KEK attive in Cloud KMS. Per i dettagli sui prezzi, consulta Prezzi di Cloud KMS.
A meno che non utilizzi una proiezione del volume dei token dell'account di servizio, gli account di servizio utilizzati dai tuoi carichi di lavoro su GKE utilizzano anche i secret e, se una chiave viene distrutta, questi non sono più disponibili. Incapacità di accedere a questi significa che i carichi di lavoro avranno esito negativo.
Si applicano le seguenti eccezioni:
Pod con accesso esistente ai secret come ambienti o volumi montati mantengono l'accesso.
Il server API Kubernetes può comunque utilizzare le voci di mappatura DEK memorizzate nella cache per decriptare un secret dopo aver distrutto la KEK. Questo consente di riavviare o ripianificare i pod accedere al secret a meno che non si verifichi una delle seguenti situazioni:
- Il piano di controllo del cluster viene riavviato.
- Il pod del server dell'API Kubernetes viene riavviato.
- La voce di mappatura DEK per il secret non è nella cache del server dell'API Kubernetes.
Prima di distruggere un KEK, controlla se è in uso nel tuo cluster. Puoi anche creare un criterio di avviso per l'eliminazione delle chiavi in Cloud KMS.
Prima di iniziare
Per svolgere gli esercizi in questo argomento, hai bisogno di due progetti Google Cloud:
Progetto chiavi: è qui che crei una KEK.
Progetto cluster: è dove crei un cluster che abilita la crittografia dei secret a livello di applicazione.
Nel progetto chiave, assicurati di aver abilitato l'API Cloud KMS.
Nel progetto di chiavi, l'utente che crea il keyring e la chiave deve disporre delle seguenti autorizzazioni IAM:
cloudkms.keyRings.getIamPolicy
cloudkms.keyRings.setIamPolicy
Queste autorizzazioni (e molte altre) vengono concesse al ruolo Identity and Access Management predefinito.
roles/cloudkms.admin
Puoi scoprire di più sulla concessione delle autorizzazioni per la gestione delle chiavi nella documentazione di Cloud KMS.Nel progetto del cluster, assicurati di aver abilitato l'API Google Kubernetes Engine.
Assicurati di aver installato Google Cloud CLI.
Aggiorna
gcloud
alla versione più recente:gcloud components update
Crea una chiave Cloud KMS
Per creare una chiave Cloud KMS, devi prima creare un keyring. Chiavi e sono risorse a livello di regione. Quando crei un keyring, specifica una località che corrisponde alla località del cluster GKE:
Un cluster di zona deve utilizzare un keyring di una regione soprainsieme. Ad esempio, un cluster nella zona
us-central1-a
può utilizzare una chiave solo nella regioneus-central1
.Un cluster regionale deve utilizzare un keyring dalla stessa posizione. Ad esempio, un cluster nella regione
asia-northeast1
deve essere protetto con un keyring della regioneasia-northeast1
.
Puoi utilizzare la CLI gcloud o la console Google Cloud.
Console
Nel progetto chiave, crea un keyring:
Vai alla pagina Gestione delle chiavi nella console Google Cloud.
Fai clic su Crea keyring.
Nel campo Nome del keyring, inserisci il nome del keyring.
Dal menu a discesa Località, seleziona la posizione del tuo cluster Kubernetes in un cluster Kubernetes.
Fai clic su Crea.
Quindi, crea una chiave:
Vai alla pagina Gestione delle chiavi nella console Google Cloud.
Fai clic sul nome del keyring per cui vuoi creare una chiave.
Fai clic su Crea chiave.
Nel campo Nome chiave, inserisci il nome della chiave.
Accetta i valori predefiniti per Periodo di rotazione e A partire dal giorno oppure imposta un periodo di rotazione e un'ora di inizio della chiave se vuoi utilizzare valori diversi.
[Facoltativo] Nel campo Etichette, fai clic su Aggiungi etichetta se vuoi aggiungere aggiungi etichette alla chiave.
Fai clic su Crea.
gcloud
Nel progetto di chiavi, crea un keyring:
gcloud kms keyrings create RING_NAME \
--location=LOCATION \
--project=KEY_PROJECT_ID
Sostituisci quanto segue:
RING_NAME
: il nome del nuovo mazzo di chiavi.LOCATION
: la posizione in cui vuoi creare il keyring.KEY_PROJECT_ID
: l'ID progetto chiave.
Crea una chiave:
gcloud kms keys create KEY_NAME \
--location=LOCATION \
--keyring=RING_NAME \
--purpose=encryption \
--project=KEY_PROJECT_ID
Sostituisci quanto segue:
KEY_NAME
: il nome della nuova chiave.LOCATION
: la località di Cloud KMS in cui hai creato il keyring.RING_NAME
: il nome del tuo keyring.KEY_PROJECT_ID
: l'ID progetto chiave.
Concedi l'autorizzazione per utilizzare la chiave
L'account di servizio GKE nel progetto cluster ha quanto segue nome:
service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Sostituisci CLUSTER_PROJECT_NUMBER
con il tuo cluster
numero di progetto.
Per trovare il numero del progetto utilizzando gcloud CLI, esegui il seguente
comando:
gcloud projects describe CLUSTER_PROJECT_ID \
--format="value(projectNumber)"
Per concedere l'accesso all'account di servizio, puoi utilizzare la console Google Cloud oppure la con gcloud CLI.
Console
Concedi al tuo account di servizio GKE il ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS:
- Apri il browser Chiavi di Cloud Key Management Service nella console Google Cloud.
Apri il browser delle chiavi Cloud KMS Fai clic sul nome del keyring contenente la chiave desiderata.
Seleziona la casella di controllo per la chiave che ti interessa.
La scheda Autorizzazioni nel riquadro della finestra a destra diventa disponibile.
Nella finestra di dialogo Aggiungi membri, specifica l'indirizzo email dell'account di servizio GKE a cui stai concedendo l'accesso.
Nel menu a discesa Seleziona un ruolo, seleziona Cloud KMS CryptoKey Encrypter/Decrypter.
Fai clic su Salva.
gcloud
Concedi al tuo account di servizio GKE il ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS:
gcloud kms keys add-iam-policy-binding KEY_NAME \
--location=LOCATION \
--keyring=RING_NAME \
--member=serviceAccount:SERVICE_ACCOUNT_NAME \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project=KEY_PROJECT_ID
Sostituisci quanto segue:
KEY_NAME
: il nome della chiave.LOCATION
: la località Cloud KMS in cui hai creato la raccolta di chiavi.RING_NAME
: il nome del tuo keyring.SERVICE_ACCOUNT_NAME
: il nome del tuo account di servizio GKE.KEY_PROJECT_ID
: l'ID progetto chiave.
Assicurati che la chiave abbia una quota sufficiente se si tratta di una chiave Cloud HSM
Se utilizzi una chiave Cloud HSM, il progetto Google Cloud che contiene è limitata dalla tua quota di chiavi. Assicurati che disponi di una quota sufficiente per utilizzare le tue chiavi Cloud HSM con la crittografia dei secret a livello di applicazione. Se la quota è esaurita, i nodi potrebbero perdere la connettività al piano di controllo del cluster.
Abilita la crittografia dei secret a livello di applicazione
Puoi abilitare la crittografia dei secret a livello di applicazione su cluster GKE Standard e GKE Autopilot nuovi o esistenti utilizzando la CLI gcloud o la console Google Cloud.
Dopo aver abilitato la crittografia dei secret a livello di applicazione, ti consigliamo di eseguire una rotazione della chiave. Puoi configurare la rotazione automatica delle chiavi in Cloud KMS. Per le istruzioni, consulta la sezione Configurare la rotazione automatica.
Su un nuovo cluster
Puoi creare un nuovo cluster con la crittografia dei secret a livello di applicazione abilitata utilizzando la console Google Cloud o la CLI gcloud.
Console - Autopilot
Per creare un cluster Autopilot con la crittografia dei secret a livello di applicazione abilitata, esegui segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic su add_box Crea.
Nella sezione Autopilot, fai clic su Configura.
Configura il cluster come preferisci.
Nel riquadro di navigazione, fai clic su Opzioni avanzate ed espandi la sezione Sicurezza.
Seleziona la casella di controllo Abilita la crittografia dei secret a livello di applicazione e scegli la chiave che hai creato in Creare una chiave Cloud KMS.
Fai clic su Crea.
Console - Standard
Per creare un cluster Standard con la crittografia dei secret a livello di applicazione abilitata, esegui la seguenti passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic su add_box Crea.
Nella sezione Standard, fai clic su Configura.
Configura il cluster come preferisci.
Nel riquadro di navigazione, in Cluster, fai clic su Sicurezza.
Seleziona la casella di controllo Abilita la crittografia dei secret a livello di applicazione e scegli la chiave che hai creato in Creare una chiave Cloud KMS.
Fai clic su Crea.
gcloud
Per creare un cluster che supporti la crittografia dei secret a livello di applicazione,
specifica un valore per il parametro --database-encryption-key
nella tua creazione
.
gcloud container clusters create-auto CLUSTER_NAME \
--cluster-version=latest \
--region=COMPUTE_REGION \
--database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome che scegli per il nuovo cluster.COMPUTE_REGION
: la regione di Compute Engine in cui vuoi creare il cluster.KEY_PROJECT_ID
: l'ID del tuo progetto principale.LOCATION
: la località di Cloud KMS in cui hai creato il keyring.RING_NAME
: il nome del tuo keyring.KEY_NAME
: il nome della chiave.CLUSTER_PROJECT_ID
: l'ID progetto del cluster.
Puoi abilitare la crittografia dei secret a livello di applicazione su un nuovo cluster Standard utilizzando
il comando gcloud container clusters create
con gli stessi flag.
Su un cluster esistente
Puoi utilizzare gcloud CLI o la console Google Cloud per aggiornare un cluster esistente in modo che utilizzi la crittografia dei secret a livello di applicazione. GKE cripta tutti i tuoi nuovi ed esistenti usando la chiave di crittografia specificata.
Console
Per aggiornare un cluster in modo che supporti la crittografia dei secret a livello di applicazione:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Sicurezza, in Crittografia dei secret a livello di applicazione fai clic su edit Modifica la crittografia dei secret a livello di applicazione.
Seleziona la casella di controllo Abilita la crittografia dei secret a livello di applicazione e scegli la chiave creato in Creare una chiave Cloud KMS.
Fai clic su Salva modifiche.
gcloud
Per abilitare la crittografia dei secret a livello di applicazione su un cluster esistente, esegui seguente comando:
gcloud container clusters update CLUSTER_NAME \
--region=COMPUTE_REGION \
--database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.COMPUTE_REGION
: la regione Compute Engine del cluster.KEY_PROJECT_ID
: l'ID del tuo progetto principale.LOCATION
: la località di Cloud KMS in cui hai creato il keyring.RING_NAME
: il nome del tuo keyring.KEY_NAME
: il nome della chiave.CLUSTER_PROJECT_ID
: l'ID progetto del tuo cluster.
Aggiornare una chiave Cloud KMS
Puoi utilizzare gcloud CLI o la console Google Cloud per aggiornare esistente per utilizzare una nuova chiave Cloud KMS.
Console
Per aggiornare un cluster in modo che utilizzi una nuova chiave Cloud KMS:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Sicurezza, in Crittografia dei secret a livello di applicazione fai clic su edit Modifica la crittografia dei secret a livello di applicazione.
Seleziona la nuova chiave di crittografia che vuoi utilizzare.
Fai clic su Salva modifiche.
gcloud
Aggiorna il cluster esistente in modo da utilizzare una nuova chiave Cloud KMS:
gcloud container clusters update CLUSTER_NAME \
--region=COMPUTE_REGION \
--database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.COMPUTE_REGION
: la regione Compute Engine del cluster.KEY_PROJECT_ID
: l'ID progetto chiave.LOCATION
: la località di Cloud KMS in cui hai creato il keyring.RING_NAME
: il nome del tuo keyring.KEY_NAME
: il nome della chiave.CLUSTER_PROJECT_ID
: l'ID progetto del cluster.
Disabilita la crittografia dei secret a livello di applicazione
Per disattivare la crittografia dei secret a livello di applicazione, puoi utilizzare gcloud CLI o la console Google Cloud.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Sicurezza, nel campo Crittografia dei secret a livello di applicazione, fai clic su edit Modifica crittografia dei secret a livello di applicazione.
Deseleziona la casella di controllo Abilita la crittografia dei secret a livello di applicazione.
Fai clic su Salva modifiche.
gcloud
Per disabilitare la crittografia dei secret a livello di applicazione, esegui questo comando:
gcloud container clusters update CLUSTER_NAME \
--region=COMPUTE_REGION \
--disable-database-encryption \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.COMPUTE_REGION
: la regione Compute Engine del cluster.CLUSTER_PROJECT_ID
: l'ID progetto del tuo cluster.
Verifica che la crittografia dei secret a livello di applicazione sia attiva
Puoi verificare se un cluster utilizza la crittografia dei secret a livello di applicazione utilizzando la console Google Cloud o gcloud CLI.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic sul nome del cluster da modificare.
In Sicurezza, verifica che il campo Crittografia dei secret a livello di applicazione sia visualizzato
Enabled
e che indichi la chiave corretta.
gcloud
Verifica se un cluster utilizza la crittografia dei secret a livello di applicazione:
gcloud container clusters describe CLUSTER_NAME \
--region=COMPUTE_REGION \
--format='value(databaseEncryption)' \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.COMPUTE_REGION
: la regione di Compute Engine nel cluster.CLUSTER_PROJECT_ID
: l'ID progetto del cluster.
Se il cluster utilizza la crittografia dei secret a livello di applicazione, l'output è simile al seguente:
keyName=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME;state=ENCRYPTED
Ruota le chiavi
Ti consigliamo di ruotare le chiavi regolarmente, anche dopo aver abilitare la crittografia dei secret a livello di applicazione. Per istruzioni su come configurare la rotazione automatica delle chiavi per ruotare manualmente le chiavi, consulta la sezione Rotazione delle chiavi.
Quando esegui una rotazione della chiave, i secret esistenti rimangono criptati la versione precedente della chiave di crittografia della chiave (KEK). Per assicurarti che una versione più recente del KEK avvolga un secret, cripta di nuovo il secret dopo la rotazione delle chiavi.
Ad esempio, crei e archivi un secret, Secret1
.
È criptato con DEK1
, che a sua volta è sottoposto a wrapping con KEKv1
.
Una volta che la KEK ruota, criptizzi nuovamente Secret1
in modo che venga sottoposto a wrapping da DEK2
,
che a sua volta è aggregato con KEKv2
, la KEK ruotata.
Ricripta i tuoi secret
Dopo aver eseguito una rotazione delle chiavi, devi criptare di nuovo i secret per avvolgerli con la nuova versione della KEK. Anche se non puoi configurare la ricrittografia automatica utilizzando gcloud CLI, potresti, ad esempio, utilizzare un CronJob il comando di ricrittografia a intervalli regolari.
Per criptare nuovamente manualmente i secret dopo una rotazione delle chiavi, attendi almeno tre ore affinché la nuova versione diventi coerente. Poi tocca ogni secret per forzare la ricrittografia utilizzando un comando come il seguente:
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="TIME"
Sostituisci TIME
con una stringa che indichi quando avviene la rotazione (ad esempio 20200909-090909
).
Limitazioni
- GKE supporta fino a 30.000 secret per cluster la crittografia dei secret a livello di applicazione. Se memorizzi più di 30.000 secret, il cluster potrebbe diventare instabile al momento dell'upgrade, causando una potenziale interruzione dei carichi di lavoro.
- Assicurati che la dimensione media dei metadati di un secret in ogni spazio dei nomi sia inferiore a 5 KiB. Se le dimensioni medie dei metadati sono superiori a 5 KB, il cluster potrebbe entrare in uno stato indesiderato in cui alcuni secret vengono criptati mentre altri vengono decriptati dopo l'attivazione o la disattivazione della funzionalità.
Devi selezionare una chiave nella stessa regione del cluster. Ad esempio, un un cluster di zona in
us-central1-a
può utilizzare solo una chiave nella regioneus-central1
. Per i cluster regionali, le chiavi devono trovarsi nella stessa posizione per ridurre la latenza e per evitare i casi in cui le risorse dipendono da servizi distribuiti su più domini in errore.GKE supporta solo le chiavi di Cloud KMS. Non puoi utilizzare un altro fornitore KMS di Kubernetes o un altro fornitore di crittografia.
Risoluzione dei problemi
Per informazioni sulla risoluzione dei problemi relativi alla crittografia dei secret a livello di applicazione, inclusa la risoluzione dei problemi correlati agli aggiornamenti della crittografia dei secret non riusciti, consulta Risolvere i problemi relativi alla crittografia dei secret a livello di applicazione.
La chiave Cloud KMS è disabilitata
L'account di servizio predefinito di GKE non può utilizzare una chiave Cloud KMS disattivata per la crittografia dei secret a livello di applicazione.
Per riattivare una chiave disattivata, consulta: Abilitare una versione della chiave disabilitata.
Passaggi successivi
- Scopri di più sui secret in Kubernetes.
- Scopri di più sulla gestione dei secret con Cloud KMS.
- Scopri come migliorare la protezione del tuo cluster.