Bring your own keys (BYOK) with Azure managed disks in servizio Azure Kubernetes (AKS) (Bring Your Own Keys (BYOK) with Azure Managed Disks in servizio Azure Kubernetes (AKS) (Bring Your Own Keys (BYOK) with Azure Managed Disks in servizio Azure Kubernetes (AKS)

Azure crittografa tutti i dati in un disco gestito inattivi. 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 che 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 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 nodi virtuali non sono supportati.

  • Quando si crittografa un pool di nodi abilitata 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 di 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 -l myAzureRegionName -n myResourceGroup

# Create an Azure Key Vault resource in a supported Azure region
az keyvault create -n myKeyVaultName -g myResourceGroup -l myAzureRegionName  --enable-purge-protection true

Creare un'istanza di DiskEncryptionSet

Sostituire myKeyVaultName con il nome dell'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 -n myDiskEncryptionSetName  -l myAzureRegionName  -g 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 a 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 -n myDiskEncryptionSetName  -g myResourceGroup --query "[identity.principalId]" -o tsv)

# Update security policy settings
az keyvault set-policy -n myKeyVaultName -g 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, quindi usare la chiave per crittografare l'oggetto usando dischi del sistema operativo collegati alla rete o disco temporaneo del sistema operativo. 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 -n mydiskEncryptionSetName -g myResourceGroup --query "[id]" -o tsv)

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

az group create -n myResourceGroup -l 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 -n myAKSCluster -g myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Per creare un cluster con disco temporaneo del sistema operativo crittografato 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 temporaneo del sistema operativo.

az aks create -n myAKSCluster -g 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 -g $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 -g $RG_NAME -n $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId

Creare un file denominato byok-azure-disk.yaml contenente le informazioni seguenti. Sostituire myAzureSubscriptionId, myResourceGroup e 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