Usare le proprie chiavi (BYOK) con dischi gestiti di Azure in servizio Azure Kubernetes (AKS)

Azure crittografa tutti i dati inattivi in un disco gestito. Per impostazione predefinita, i dati vengono crittografati con chiavi gestite da Microsoft. Per un maggiore controllo sulle chiavi di crittografia, è possibile fornire chiavi gestite dal cliente da usare per la crittografia dei dati inattivi sia per il sistema operativo sia per i dischi dati per i cluster del servizio Azure Kubernetes.

Altre informazioni sulle chiavi gestite dal cliente in Linux e Windows.

Prerequisiti

  • È necessario abilitare l'eliminazione temporanea e la protezione dall'eliminazione per Azure Key Vault quando si usa Key Vault per crittografare i dischi gestiti.
  • È necessaria l'interfaccia della riga di comando di Azure versione 2.11.1 o successiva.
  • La crittografia dei dischi dati e le chiavi gestite dal cliente sono supportate nelle versioni di Kubernetes 1.24 e successive.
  • Se si sceglie di ruotare (modificare) periodicamente le chiavi, vedere Chiavi gestite dal cliente e la crittografia del disco gestito di Azure per altre informazioni.

Limiti

  • La crittografia di un disco del sistema operativo con chiavi gestite dal cliente può essere abilitata solo quando si crea un cluster del servizio Azure Kubernetes.

  • I cubi virtuali non sono supportati.

  • Quando si crittografa un pool di nodi abilitato per il disco del sistema operativo temporaneo con chiavi gestite dal cliente, se si vuole ruotare la chiave in Azure Key Vault, è necessario:

    • ridurre il numero di pool di nodi a 0
    • ruotare la chiave
    • aumentare le prestazioni del pool di nodi al conteggio originale.

Creare un'istanza di Azure Key Vault

Usare un'istanza di Azure Key Vault per archiviare le chiavi. Facoltativamente, è possibile usare il portale di Azure per Configurare le chiavi gestite dal cliente con Azure Key Vault

Creare un nuovo gruppo di risorse, quindi creare una nuova istanza Key Vault e abilitare l'eliminazione temporanea e la protezione dall'eliminazione temporanea. Assicurarsi di usare gli stessi nomi di area e gruppo di risorse per ogni comando.

# Optionally retrieve Azure region short names for use on upcoming commands
az account list-locations
# Create new resource group in a supported Azure region
az group create --location myAzureRegionName --name myResourceGroup

# Create an Azure Key Vault resource in a supported Azure region
az keyvault create --name myKeyVaultName --resource-group myResourceGroup --location myAzureRegionName  --enable-purge-protection true

Creare un'istanza di un set di crittografia dischi

Sostituire myKeyVaultNamecon il nome della chiave nell'insieme di credenziali delle chiavi. Per completare i passaggi seguenti, è necessaria anche una chiave archiviata in Azure Key Vault. Archiviare la chiave esistente nell'insieme di credenziali delle chiavi creato nei passaggi precedenti oppure generare una nuova chiave e sostituire myKeyName con il nome della chiave.

# Retrieve the Key Vault Id and store it in a variable
keyVaultId=$(az keyvault show --name myKeyVaultName --query "[id]" -o tsv)

# Retrieve the Key Vault key URL and store it in a variable
keyVaultKeyUrl=$(az keyvault key show --vault-name myKeyVaultName --name myKeyName --query "[key.kid]" -o tsv)

# Create a DiskEncryptionSet
az disk-encryption-set create --name myDiskEncryptionSetName --location myAzureRegionName --resource-group myResourceGroup --source-vault $keyVaultId --key-url $keyVaultKeyUrl

Importante

Assicurarsi che DiskEncryptionSet si trovi nella stessa area del cluster del servizio Azure Kubernetes e che l'identità del cluster del servizio Azure Kubernetes abbia accesso in lettura all'oggetto DiskEncryptionSet.

Concedere a DiskEncryptionSet l'accesso all'insieme di credenziali delle chiavi

Usare DiskEncryptionSet e i gruppi di risorse creati nei passaggi precedenti e concedere alla risorsa DiskEncryptionSet l'accesso all'insieme di credenziali delle chiavi di Azure.

# Retrieve the DiskEncryptionSet value and set a variable
desIdentity=$(az disk-encryption-set show --name myDiskEncryptionSetName --resource-group myResourceGroup --query "[identity.principalId]" -o tsv)

# Update security policy settings
az keyvault set-policy --name myKeyVaultName --resource-group myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get

Creare un nuovo cluster del servizio Azure Kubernetes e crittografare il disco del sistema operativo

Creare un nuovo gruppo di risorse o selezionare un gruppo di risorse esistente che ospita altri cluster del servizio Azure Kubernetes (AKS), quindi usare la chiave per la crittografia usando dischi del sistema operativo collegati alla rete o un disco del sistema operativo temporaneo. Per impostazione predefinita, un cluster usa un disco temporaneo del sistema operativo quando possibile in combinazione con le dimensioni della macchina virtuale e le dimensioni del disco del sistema operativo.

Eseguire il comando seguente per recuperare il valore DiskEncryptionSet e impostare una variabile:

diskEncryptionSetId=$(az disk-encryption-set show --name mydiskEncryptionSetName --resource-group myResourceGroup --query "[id]" -o tsv)

Se si vuole creare un nuovo gruppo di risorse per il cluster, eseguire il comando seguente:

az group create --name myResourceGroup --location myAzureRegionName

Per creare un normale cluster usando dischi del sistema operativo collegati alla rete crittografati con la chiave, è possibile farlo specificando l'argomento --node-osdisk-type=Managed.

az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Per creare un normale cluster usando dischi del sistema operativo collegati alla rete crittografati con la chiave, è possibile farlo specificando l'argomento --node-osdisk-type=Ephemeral. È anche necessario specificare l'argomento --node-vm-size perché le dimensioni predefinite della macchina virtuale sono troppo piccole e non supportano il disco del sistema operativo temporaneo.

az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Ephemeral --node-vm-size Standard_DS3_v2

Quando vengono aggiunti nuovi pool di nodi al cluster, la chiave gestita dal cliente fornita durante il processo di creazione viene usata per crittografare il disco del sistema operativo. L'esempio seguente illustra come distribuire un nuovo pool di nodi con un disco temporaneo del sistema operativo.

az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral

Crittografare il disco dati del cluster del servizio Azure Kubernetes

Se è già stato specificato un set di crittografia del disco durante la creazione del cluster, la crittografia dei dischi dati con lo stesso set di crittografia del disco è l'opzione predefinita. Pertanto, questo passaggio è facoltativo. Tuttavia, se si desidera crittografare i dischi dati con un set di crittografia del disco diverso, è possibile seguire questa procedura.

Importante

Assicurarsi di avere le credenziali appropriate del servizio Azure Kubernetes. L'identità gestita deve avere accesso collaboratore al gruppo di risorse in cui viene distribuito diskencryptionset. In caso contrario, verrà visualizzato un errore che suggerisce che l'identità gestita non dispone delle autorizzazioni.

Per assegnare l'identità del cluster del servizio Azure Kubernetes, eseguire i comandi seguenti:

aksIdentity=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId

Creare un file denominato byok-azure-disk.yaml che contiene le informazioni seguenti. Sostituire myAzureSubscriptionId, myResourceGroupe myDiskEncrptionSetName con i valori e applicare il file yaml. Assicurarsi di usare il gruppo di risorse in cui è distribuito DiskEncryptionSet.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: byok
provisioner: disk.csi.azure.com # replace with "kubernetes.io/azure-disk" if aks version is less than 1.21
parameters:
  skuname: StandardSSD_LRS
  kind: managed
  diskEncryptionSetID: "/subscriptions/{myAzureSubscriptionId}/resourceGroups/{myResourceGroup}/providers/Microsoft.Compute/diskEncryptionSets/{myDiskEncryptionSetName}"

Eseguire quindi i comandi seguenti per aggiornare il cluster del servizio Azure Kubernetes:

# Get credentials
az aks get-credentials --name myAksCluster --resource-group myResourceGroup --output table

# Update cluster
kubectl apply -f byok-azure-disk.yaml

Passaggi successivi

Esaminare le procedure consigliate per la sicurezza del cluster del servizio Azure Kubernetes