BYOK (Bring Your Own Keys) avec des disques managés Azure dans Azure Kubernetes Service (AKS)

Azure chiffre toutes les données dans un disque managé au repos. Par défaut, les données sont chiffrées avec des clés managées par Microsoft Pour plus de contrôle sur les clés de chiffrement, vous pouvez fournir des clés gérées par le client à utiliser pour le chiffrement au repos des disques de système d’exploitation et des disques de données pour vos clusters AKS.

En savoir plus sur les clés gérées par le client sur Linux et Windows.

Prérequis

  • Vous devez activer la suppression réversible et la protection contre le vidage pour Azure Key Vault lors de l’utilisation de Key Vault pour chiffrer des disques managés.
  • Vous devez disposer d’Azure CLI 2.11.1 ou d’un version ultérieure.
  • Le chiffrement de disque de données et les clés gérées par le client sont pris en charge sur Kubernetes versions 1.24 et ultérieures.
  • Si vous choisissez de faire pivoter (modifier) régulièrement vos clés, consultez Clés gérées par le client et chiffrement du disque managé Azure pour plus d’informations.

Limites

  • Le chiffrement d’un disque de système d’exploitation avec des clés managées par le client ne peut être activé que lors de la création d’un cluster AKS.

  • Les nœuds virtuels ne sont pas pris en charge.

  • Lors du chiffrement d’un pool de nœuds de système d’exploitation éphémère avec disque avec des clés gérées par le client, si vous souhaitez faire pivoter la clé dans Azure Key Vault, vous devez :

    • Réduire le nombre de pools de nœuds à 0
    • Faire pivoter la clé
    • Augmentez le pool de nœuds jusqu’au nombre d’origine.

Créer une instance Azure Key Vault

Utilisez une instance Azure Key Vault pour stocker vos clés. Vous pouvez éventuellement utiliser le portail Azure pour configurer des clés gérées par le client avec Azure Key Vault

Créez un groupe de ressources, puis une instance Key Vault. Activez ensuite la suppression réversible et la protection contre le vidage. Veillez à utiliser les mêmes noms de régions et de groupes de ressources pour chaque commande.

# 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

Créer une instance de DiskEncryptionSet

Remplacez myKeyVaultName par le nom de votre coffre de clés. Vous devez également disposer d’une clé stockée dans Azure Key Vault pour effectuer les étapes suivantes. Stockez votre clé existante dans le coffre de clés que vous avez créé au cours des étapes précédentes, ou générez une nouvelle clé et remplacez myKeyName avec le nom de votre clé.

# 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

Important

Vérifiez que DiskEncryptionSet se trouve dans la même région que votre cluster AKS et que l’identité du cluster AKS a accès en lecture au DiskEncryptionSet.

Accorder à DiskEncryptionSet l’accès au coffre de clés

Utilisez DiskEncryptionSet et les groupes de ressources que vous avez créés lors des étapes précédentes, puis accordez à la ressource DiskEncryptionSet l’accès au coffre de clés 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

Créer un cluster AKS et chiffrer le disque de système d’exploitation

Créez un groupe de ressources ou sélectionnez un groupe de ressources existant hébergeant d’autres clusters AKS, puis utilisez votre clé pour chiffrer les disques de système d’exploitation attachés au réseau ou à l’aide d’un disque de système d’exploitation éphémère. Par défaut, un cluster utilise un disque de système d’exploitation éphémère lorsque cela est possible conjointement avec la taille de machine virtuelle et la taille du disque du système d’exploitation.

Exécutez la commande suivante pour récupérer la valeur DiskEncryptionSet et définir une variable :

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

Si vous souhaitez créer un groupe de ressources pour le cluster, exécutez la commande suivante :

az group create -n myResourceGroup -l myAzureRegionName

Pour créer un cluster ordinaire à l’aide de disques de système d’exploitation attachés au réseau avec votre clé, vous pouvez le faire en spécifiant l’argument --node-osdisk-type=Managed.

az aks create -n myAKSCluster -g myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Pour créer un cluster avec un disque de système d’exploitation éphémère chiffré avec votre clé, vous pouvez le faire en spécifiant l’argument --node-osdisk-type=Ephemeral . Vous devez également spécifier l’argument --node-vm-size , car la taille de machine virtuelle par défaut est trop petite et ne prend pas en charge le disque de système d’exploitation éphémère.

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

Quand de nouveaux pools de nœuds sont ajoutés au cluster créé ci-dessus, la clé gérée par le client fournie pendant le processus de création est utilisée pour chiffrer le disque de système d’exploitation. L’exemple suivant montre comment déployer un nouveau pool de nœuds avec un disque de système d’exploitation éphémère.

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

Chiffrer votre disque de données de cluster AKS

Si vous avez déjà fourni un jeu de chiffrement de disque lors de la création du cluster, l’option par défaut est le chiffrement des disques de données avec le même jeu de chiffrement de disque. Cette étape est donc facultative. Si vous souhaitez toutefois chiffrer des disques de données avec un autre jeu de chiffrement de disque, vous pouvez suivre ces étapes.

Important

Vérifiez que vous disposez des informations d’identification AKS appropriées. L’identité managée doit disposer d’un accès contributeur au groupe de ressources où diskencryptionset est déployé. Sinon, cela renvoie une erreur suggérant que l’identité managée ne dispose pas d’autorisations.

Pour attribuer à l'identité du cluster AKS le rôle Contributor pour le diskencryptionset, exécutez les commandes suivantes :

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

Créez un fichier appelé byok-azure-disk.yaml et contenant les informations suivantes. Remplacez myAzureSubscriptionId, myResourceGroup et myDiskEncrptionSetName par vos valeurs, puis appliquez le fichier YAML. Veillez à utiliser le groupe de ressources dans lequel votre ressource DiskEncryptionSet est déployée.

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}"

Ensuite, exécutez les commandes suivantes pour mettre à jour votre cluster AKS :

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

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

Étapes suivantes

Consulter les bonnes pratiques relatives à la sécurité des clusters AKS