Procedura: Abilitare la crittografia per i segreti di Kubernetes utilizzando il provider KMS

Si applica a: AKS locale su Azure

I cluster Kubernetes archiviano piccole informazioni denominate segreti in un archivio segreto Kubernetes persistente (etcd). Questi segreti contengono spesso dati sensibili, ad esempio password, token o certificati, critici per il funzionamento delle applicazioni distribuite in K8s. Per impostazione predefinita, queste informazioni vengono codificate ma non crittografate a riposo; ciò significa che, se una persona non autorizzata ottiene l'accesso all'archiviazione sottostante, potrebbe potenzialmente decodificare questi segreti. Un Provider KMS risolve questa lacuna crittografando i dati sottostanti. Ogni segreto all'interno dell'archivio segreto viene prima crittografato con una chiave DEK (Data Encryption Key) univoca generata dal server API K8s. Questa chiave DEK viene mantenuta temporaneamente in memoria e non viene mai scritta su disco. Il server API richiede quindi che il fornitore KMS cifri la chiave DEK usando una chiave di crittografia della chiave (KEK). Il segreto crittografato finale include sia i dati crittografati che la chiave DEK crittografata, assicurando che i segreti rimangano sicuri e inaccessibili senza la chiave kek.

Il servizio Azure Kubernetes Service su Azure Local include la crittografia dei segreti etcd tramite un provider KMS. Tutti i cluster Kubernetes in Azure Locale prima della versione 2510 hanno un provider KMS v1 predefinito abilitato per impostazione predefinita. Questo provider genera la chiave di crittografia della chiave (KEK) e la ruota automaticamente ogni 30 giorni.

A partire dalla versione 2510 di AKS su Azure Local, KMS v2 è abilitato per impostazione predefinita nelle nuove distribuzioni di cluster. I cluster esistenti continuano a usare KMS versione 1. Per ulteriori informazioni sul provider del Key Management Service v2, consultare le linee guida ufficiali.

Questo articolo fornisce informazioni sul provider KMS, sulla verifica della crittografia e sull'aggiornamento dei segreti dopo la rotazione del KEK. Per altre informazioni, vedere la documentazione ufficiale di Kubernetes per il provider del Servizio di gestione delle chiavi.

KmS v2 in Azure Local 2510 e versioni successive

Il Servizio di gestione delle chiavi v1 è deprecato con Kubernetes v1.28 ed è consigliabile eseguire la migrazione al Servizio di gestione delle chiavi v2. Lo standard KMS v2 elimina i colli di bottiglia delle prestazioni presenti in KMS v1 rimuovendo la necessità di decrittografia seriale durante l'avvio del cluster, riducendo il sovraccarico delle chiamate API ed evitando i limiti di velocità del servizio di chiavi esterno. Ciò comporta una maggiore inizializzazione del cluster e un avvio più semplice dell'applicazione. Altri vantaggi includono maggiore affidabilità, scalabilità oltre 2.000 segreti e maggiore osservabilità tramite controlli di integrità più avanzati.

Il KMS Provider v2 viene abilitato automaticamente per tutti i nuovi cluster che crei su AKS Arc: non è necessario eseguire alcuna azione. Il provider genera immediatamente una nuova chiave kek e quindi lo ruota automaticamente ogni 30 giorni, riducendo il rischio di compromissione della chiave. Dopo ogni rotazione, usa questo nuovo KEK per crittografare il DEK per i seguenti segreti creati. I segreti esistenti nel cluster non vengono ricrittografati automaticamente. Per il momento, i cluster esistenti continuano a usare il provider KMS v1.

Prima di iniziare

Prima di iniziare, assicurarsi che vengano soddisfatti i seguenti prerequisiti:

Accedere al cluster abilitato per Microsoft Entra

Ottenere le credenziali utente per accedere al cluster usando il comando az aksarc get-credentials . È necessaria la risorsa Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action , inclusa nell'autorizzazione del ruolo utente del cluster Arc del servizio Azure Kubernetes :

az aksarc get-credentials --resource-group $resource_group --name $aks_cluster_name

Verificare che il provider del Servizio di gestione delle chiavi sia abilitato (facoltativo)

Questo passaggio è facoltativo se si vuole verificare che il provider del Servizio di gestione delle chiavi sia abilitato. Eseguire il comando seguente e verificare che lo stato di integrità dei kms-provider sia OK:

kubectl get --raw='/readyz?verbose'
[+]ping ok
[+]Log ok
[+]etcd ok
[+]kms-providers ok
[+]poststarthook/start-encryption-provider-config-automatic-reload ok

Verificare che i dati siano crittografati (facoltativo)

Questo passaggio è facoltativo se si vuole verificare che i segreti e i dati siano stati crittografati usando un provider del Servizio di gestione delle chiavi. Vedere la documentazione di Kubernetes. È possibile usare i comandi seguenti per verificare che i dati siano crittografati:

kubectl exec --stdin --tty <etcd pod name> -n kube-system --etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt get /registry/secrets/default/db-user-pass -w fields
  • kubectl exec: si tratta del comando kubectl usato per eseguire un comando all'interno di un pod in esecuzione. Consente di eseguire comandi all'interno del contenitore di un pod.

  • --stdin: Questo flag consente di inviare input (stdin) al comando in esecuzione all'interno del pod.

  • --tty: questo flag alloca un TTY (terminale) per il comando, rendendo il comportamento come se si interagisce con una sessione del terminale.

  • <etcd pod name>: per trovare il nome del pod etcd, eseguire il comando seguente:

    kubectl get pods -n kube-system | findstr etcd-moc
    
  • -n kube-system: specifica lo spazio dei nomi in cui si trova il pod. kube-system è lo spazio dei nomi predefinito usato da Kubernetes per i componenti di sistema, ad esempio etcd e altri servizi del piano di controllo.

  • --etcdctl: Legge il segreto da etcd. I campi aggiuntivi vengono usati per l'autenticazione prima di ottenere l'accesso a etcd.

Nell'output del comando vengono restituiti i campi seguenti:

"ClusterID" : <cluster id> 
"MemberID" : <member id> 
"Revision" : <revision number> 
"RaftTerm" : 2 
"Key" : <path to the key>
"CreateRevision" : <revision number at the time the key was created> 
"ModRevision" :  <revision number at the time the key was modified> 
"Version" : <version of the key-value pair in etcd> 
"Value" : "k8s:enc:kms:v1:kms-plugin: <encrypted secret value>"  
"Lease" : <lease associated with the secret> 
"More" : <indicates if there are more results> 
"Count" : <number of key-value pairs returned> 

Dopo aver eseguito il comando, esaminare il campo Value nell'output nella finestra del terminale. Questo output mostra il valore archiviato nell'archivio dei segreti etcd per questa chiave, ovvero il valore crittografato del segreto. Il valore viene crittografato utilizzando un provider KMS. Il k8s:enc:kms:v1: prefisso indica che Kubernetes usa il provider KMS v1 per archiviare il segreto in un formato crittografato.

Annotazioni

Se si usa il kubectl describe secrets comando per recuperare i segreti, vengono restituiti in formato con codifica Base64, ma non crittografati. Il kubectl describe comando recupera i dettagli di una risorsa Kubernetes tramite il server API, che gestisce automaticamente la crittografia e la decrittografia. Per i dati sensibili, ad esempio i segreti, anche se vengono montati in un pod, il server API garantisce che vengano decrittografati quando si accede. Di conseguenza, l'esecuzione del kubectl describe comando non visualizza i segreti nel formato crittografato, ma piuttosto nel formato decrittografato se vengono usati da una risorsa.

Come aggiornare i dati sensibili dopo la rotazione della chiave KEK

Il KEK viene aggiornato automaticamente ogni 30 giorni. A questo punto, ogni segreto rimane crittografato con la chiave kek in uso al momento della creazione. La prossima volta che aggiorni il segreto, esso viene nuovamente crittografato con la chiave KEK corrente. Se non si aggiornano regolarmente i valori dei segreti come parte dei processi regolari, è consigliabile riscrivirli (con lo stesso valore) ogni 30 giorni in ogni caso. In questo modo si garantisce di seguire le procedure consigliate di Kubernetes e che ogni segreto sia crittografato con la chiave kek più recente. Per i cluster di dimensioni maggiori, è consigliabile aggiornare i segreti di ogni spazio dei nomi a sua volta o sviluppare uno script o un'altra automazione per semplificare il processo.

kubectl get secrets --all-namespaces -o json | kubectl replace -f - 

Risoluzione dei problemi

Se si verificano errori con il provider del Servizio di gestione delle chiavi, seguire la procedura nella pagina Risoluzione dei problemi per risolvere il problema.

Passaggi successivi