Partager via


Ajouter le chiffrement etcd Key Management Service à un cluster Azure Kubernetes Service

Cet article explique comment activer le chiffrement au repos pour vos secrets Azure Kubernetes Service (AKS) dans un magasin clé-valeur etcd à l’aide d’Azure Key Vault et du plug-in Key Management Service (KMS). Vous pouvez utiliser le plug-in KMS pour :

  • Utilisez une clé dans un coffre de clés pour le chiffrement etcd.
  • Apporter vos propres clés.
  • Fournissez le chiffrement au repos pour les secrets stockés dans etcd.
  • Faites pivoter les clés dans un coffre de clés.

Pour plus d’informations sur l’utilisation de KMS, consultez Utilisation d’un fournisseur KMS pour le chiffrement des données.

Prérequis

  • Compte Azure avec un abonnement actif. Créez un compte gratuitement.
  • Azure CLI version 2.39.0 ou ultérieure. Exécutez az --version pour rechercher votre version. Si vous devez effectuer une installation ou une mise à niveau, consultez Installer Azure CLI.

Avertissement

KMS prend en charge Konnectivity ou l’intégration VNet du serveur d’API (préversion) pour le coffre de clés public.

KMS prend en charge seulement l’intégration VNet du serveur d’API (préversion) pour le coffre de clés privé.

Vous pouvez utiliser kubectl get po -n kube-system pour vérifier les résultats et montrer qu’un pod konnectivity-agent est en cours d’exécution. Si un pod est en cours d’exécution, le cluster AKS utilise Konnectivity. Lorsque vous utilisez l’intégration au réseau virtuel du serveur d’API, vous pouvez exécuter la commande az aks show -g -n pour vérifier que le paramètre enableVnetIntegration est défini sur true.

Limites

Les limitations suivantes s’appliquent lorsque vous intégrez le chiffrement etcd KMS à AKS :

  • La suppression de la clé, du coffre de clés ou de l’identité associée n’est pas prise en charge.
  • Le chiffrement etcd KMS ne fonctionne pas avec l’identité managée affectée par le système. La stratégie d’accès au coffre de clés doit être définie avant que la fonctionnalité soit activée. L’identité managée affectée par le système n’est pas disponible tant que le cluster n’est pas créé. Considérez la dépendance de cycle.
  • Azure Key Vault avec un paramètre de pare-feu « autoriser l’accès public à partir de réseaux virtuels et d’adresses IP spécifiques » ou « désactiver l’accès public » n’est pas pris en charge, car il bloque le trafic du plug-in KMS vers le coffre de clés.
  • Le nombre maximal de secrets pris en charge par un cluster sur lequel KMS est activé est de 2 000. Toutefois, il est important de noter que KMS v2 n’est pas limité par cette restriction et peut gérer un plus grand nombre de secrets.
  • Apportez votre propre coffre de clés Azure à partir d’un autre locataire n’est pas pris en charge.
  • Lorsque KMS est activé, vous ne pouvez pas modifier le mode de coffre de clés associé (public ou privé). Pour mettre à jour un mode coffre de clés, vous devez d’abord désactiver KMS, puis le réactiver.
  • Si KMS est activé sur un cluster et que celui-ci a un coffre de clés privé, ce cluster doit utiliser le tunnel de l’intégration VNet du serveur d’API (préversion). Konnectivity n’est pas pris en charge.
  • L’utilisation de l’API Virtual Machine Scale Sets pour mettre à l’échelle des nœuds dans le cluster jusqu’à zéro libère les nœuds. Le cluster tombe ensuite en panne et devient irrécupérable.
  • Après avoir désactivé KMS, vous ne pouvez pas détruire les clés. La destruction des clés entraîne l’arrêt du fonctionnement du serveur d’API.

KMS prend en charge un coffre de clés public ou un coffre de clés privé.

Activer KMS pour un coffre de clés public

Les sections suivantes décrivent comment activer KMS pour un coffre de clés public.

Créer un coffre de clés public et une clé

Avertissement

La suppression de la clé ou du coffre de clés n’est pas prise en charge et entraîne l’impossibilité de récupérer les secrets dans le cluster.

Si vous devez récupérer votre coffre de clés ou votre clé, consultez Gestion de la reprise d’activité d’Azure Key Vault avec suppression réversible et protection contre la suppression définitive.

Créer un coffre de clés et une clé pour un coffre de clés public non RBAC

Utilisez az keyvault create pour créer un coffre de clés sans utiliser le contrôle d’accès en fonction du rôle Azure (Azure RBAC) :

az keyvault create --name MyKeyVault --resource-group MyResourceGroup

Utilisez az keyvault key create pour créer une clé :

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Utilisez az keyvault key show pour exporter l’ID de clé :

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Cet exemple stocke l’ID de clé dans KEY_ID.

Créer un coffre de clés et une clé pour un coffre de clés public RBAC

Utilisez az keyvault create pour créer un coffre de clés à l’aide d’Azure RBAC :

export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup  --enable-rbac-authorization true --query id -o tsv)

Attribuez-vous les autorisations de créer une clé :

az role assignment create --role "Key Vault Crypto Officer" --assignee-object-id $(az ad signed-in-user show --query id -o tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

Utilisez az keyvault key create pour créer une clé :

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Utilisez az keyvault key show pour exporter l’ID de clé :

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Cet exemple stocke l’ID de clé dans KEY_ID.

Créer une identité managée affectée par l’utilisateur pour un coffre de clés public

Utilisez az identity create pour créer une identité managée affectée par l’utilisateur :

az identity create --name MyIdentity --resource-group MyResourceGroup

Utilisez az identity show pour obtenir l’ID d’objet d’identité :

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

L’exemple précédent stocke la valeur de l’ID d’objet d’identité dans IDENTITY_OBJECT_ID.

Utilisez az identity show pour obtenir l’ID de la ressource d’identité :

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Cet exemple stocke la valeur de l’ID de ressource d’identité dans IDENTITY_RESOURCE_ID.

Attribuer des autorisations pour déchiffrer et chiffrer un coffre de clés public

Les sections suivantes décrivent comment attribuer des autorisations de déchiffrement et de chiffrement pour un coffre de clés privé.

Attribuer des autorisations pour un coffre de clés public non RBAC

Si votre coffre de clés n’est pas défini avec --enable-rbac-authorization, vous pouvez utiliser az keyvault set-policy pour créer une stratégie de coffre de clés Azure.

az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Attribuer des autorisations pour un coffre de clés public RBAC

Si votre coffre de clés est défini avec --enable-rbac-authorization, attribuez le rôle utilisateur Crypto Key Vault pour donner des autorisations de déchiffrement et de chiffrement.

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Créer un cluster AKS doté d’un coffre de clés public et activer le chiffrement etcd KMS

Pour activer le chiffrement etcd KMS, créez un cluster AKS à l’aide de la commande az aks create. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-id avec az aks create.

az aks create \
    --name myAKSCluster \
    --resource-group MyResourceGroup \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-vault-network-access "Public" \
    --azure-keyvault-kms-key-id $KEY_ID \
    --generate-ssh-keys

Mettre à jour un cluster AKS existant pour activer le chiffrement etcd KMS pour un coffre de clés public

Pour activer le chiffrement etcd KMS pour un cluster existant, utilisez la commande az aks update. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-id avec az-aks-update.

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous n’exécutez pas cette commande, les secrets créés précédemment ne sont plus chiffrés. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Faire pivoter des clés existantes dans un coffre de clés public

Après avoir modifié l’ID de clé (y compris la modification du nom de clé ou de la version de la clé), vous pouvez utiliser la commande az aks update. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-id avec az-aks-update pour faire pivoter les clés existantes dans KMS.

Avertissement

N’oubliez pas de mettre à jour tous les secrets après la rotation des clés. Si vous ne mettez pas à jour tous les secrets, les secrets sont inaccessibles si les clés créées précédemment n’existent pas ou ne fonctionnent plus.

KMS utilise 2 clés en même temps. Après la première rotation des clés, vous devez vous assurer que l’ancienne et la nouvelle clé sont valides (non expirées) jusqu’à la rotation suivante des clés. Après la deuxième rotation des clés, la clé la plus ancienne peut être supprimée/expirée en toute sécurité

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $NEW_KEY_ID 

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous n’exécutez pas cette commande, les secrets créés précédemment sont toujours chiffrés avec la clé précédente. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Activer KMS pour un coffre de clés privé

Si vous activez KMS pour un coffre de clés privé, AKS crée automatiquement un point de terminaison privé et une liaison privée dans le groupe de ressources de nœud. Une connexion de point de terminaison privé avec le cluster AKS est ajoutée au coffre de clés.

Avertissement

KMS prend en charge seulement l’intégration VNet du serveur d’API (préversion) pour le coffre de clés privé.

Créer un coffre de clés privé et une clé

Avertissement

La suppression de la clé ou du coffre de clés n’est pas prise en charge et entraîne l’impossibilité de récupérer les secrets dans le cluster.

Si vous devez récupérer votre coffre de clés ou votre clé, consultez Gestion de la reprise d’activité d’Azure Key Vault avec suppression réversible et protection contre la suppression définitive.

Utilisez az keyvault create pour créer un coffre de clés privé :

az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

La création ou la mise à jour de clés dans un coffre de clés privé qui n’a pas de point de terminaison privé n’est pas prise en charge. Pour savoir comment gérer des coffres de clés privés, consultez Intégrer un coffre de clés à l’aide d’Azure Private Link.

Créer une identité managée affectée par l’utilisateur pour un coffre de clés privé

Utilisez az identity create pour créer une identité managée affectée par l’utilisateur :

az identity create --name MyIdentity --resource-group MyResourceGroup

Utilisez az identity show pour obtenir l’ID d’objet d’identité :

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

L’exemple précédent stocke la valeur de l’ID d’objet d’identité dans IDENTITY_OBJECT_ID.

Utilisez az identity show pour obtenir l’ID de la ressource d’identité :

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Cet exemple stocke la valeur de l’ID de ressource d’identité dans IDENTITY_RESOURCE_ID.

Attribuer des autorisations pour déchiffrer et chiffrer un coffre de clés privé

Les sections suivantes décrivent comment attribuer des autorisations de déchiffrement et de chiffrement pour un coffre de clés privé.

Attribuer des autorisations pour un coffre de clés privé non RBAC

Remarque

Lorsque vous utilisez un coffre de clés privé, AKS ne peut pas valider les autorisations de l’identité. Vérifiez que l’identité a reçu l’autorisation d’accéder au coffre de clés avant d’activer KMS.

Si votre coffre de clés n’est pas défini avec --enable-rbac-authorization, vous pouvez utiliser az keyvault set-policy pour créer une stratégie de coffre de clés dans Azure :

az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Attribuer des autorisations pour un coffre de clés privé RBAC

Si votre coffre de clés est défini avec --enable-rbac-authorization, attribuez un rôle Azure RBAC qui inclut des autorisations de déchiffrement et de chiffrement :

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Pour les coffres de clés privés, le rôle Contributeur Key Vault est requis pour créer une liaison privée entre le coffre de clés privé et le cluster.

az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Créer un cluster AKS doté d’un coffre de clés privé et activer le chiffrement etcd KMS

Pour activer le chiffrement etcd KMS pour un coffre de clés privé, créez un cluster AKS à l’aide de la commande az aks create. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-vault-resource-id avec az-aks-create.

az aks create \
    --name myAKSCluster \
    --resource-group MyResourceGroup \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID \
    --azure-keyvault-kms-key-vault-network-access "Private" \
    --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID \
    --generate-ssh-keys

Mettre à jour un cluster AKS existant pour activer le chiffrement etcd KMS pour un coffre de clés privé

Pour activer le chiffrement etcd KMS sur un cluster existant doté d’un coffre de clés privé, utilisez la commande az aks update. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-vault-resource-id avec az-aks-update.

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous n’exécutez pas cette commande, les secrets créés précédemment ne sont pas chiffrés. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Faire pivoter des clés existantes dans un coffre de clés privé

Après avoir modifié l’ID de clé (y compris le nom de la clé et de la version de la clé), vous pouvez utiliser la commande az aks update. Vous pouvez utiliser les paramètres --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesset --azure-keyvault-kms-key-vault-resource-id avec az-aks-update pour faire pivoter les clés existantes de KMS.

Avertissement

N’oubliez pas de mettre à jour tous les secrets après la rotation des clés. Si vous ne mettez pas à jour tous les secrets, les secrets sont inaccessibles si les clés créées précédemment n’existent pas ou ne fonctionnent plus.

Après avoir pivoté la clé, la clé précédente (key1) est toujours mise en cache et ne doit pas être supprimée. Si vous souhaitez supprimer immédiatement la clé précédente (key1), vous devez faire tourner la clé deux fois. Ensuite, key2 et key3 sont mises en cache, et key1 peut être supprimée sans affecter le cluster existant.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous ne mettez pas à jour tous les secrets, les secrets créés précédemment sont chiffrés avec la clé précédente. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Mettre à jour un mode de coffre de clés

Remarque

Pour modifier un autre coffre de clés en mode différent (public ou privé), vous pouvez exécuter az aks update directement. Pour modifier le mode d’un coffre de clés attaché, vous devez d’abord désactiver KMS, puis l’activer à nouveau en utilisant les nouveaux ID du coffre de clés.

Les sections suivantes décrivent comment passer un coffre de clés public attaché au mode privé. Ces étapes peuvent également être utilisées pour la migration d’un environnement privé vers un environnement public.

Désactiver KMS sur le cluster

Désactivez KMS sur un cluster existant et libérez le coffre de clés :

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous n’exécutez pas cette commande, les secrets créés précédemment sont toujours chiffrés avec la clé précédente. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Modifier le mode du coffre de clés

Passer le coffre de clés de public à privé :

az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Pour migrer d’un environnement privé vers un environnement public, définissez --public-network-access sur Enabled dans la commande ci-dessus.

Activer KMS pour le cluster à l’aide du coffre de clés mis à jour

Activez KMS à l’aide du coffre de clés privé mis à jour :

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Après avoir configuré KMS, vous pouvez activer les paramètres de diagnostic du coffre de clés pour vérifier les journaux de chiffrement.

Désactiver KMS

Avant de désactiver KMS, vous pouvez utiliser la commande Azure CLI suivante pour vérifier si KMS est activé :

az aks list --query "[].{Name:name, KmsEnabled:securityProfile.azureKeyVaultKms.enabled, KeyId:securityProfile.azureKeyVaultKms.keyId}" -o table

Si les résultats confirment que KMS est activé, exécutez la commande suivante pour désactiver KMS sur le cluster :

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Utilisez la commande suivante pour mettre à jour tous les secrets. Si vous n’exécutez pas cette commande, les secrets créés précédemment sont toujours chiffrés avec la clé précédente, et les autorisations de chiffrement et de déchiffrement sur le coffre de clés sont toujours requises. Pour les clusters plus volumineux, vous souhaiterez peut-être subdiviser les secrets par espace de noms ou créer un script de mise à jour.

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

Prise en charge de KMS v2

À compter d’AKS version 1.27, l’activation de la fonctionnalité KMS configure KMS v2. Avec KMS v2, vous n’êtes pas limité aux 2 000 secrets pris en charge par les versions antérieures. Pour plus d’informations, consultez Améliorations KMS v2.

Migrer vers KMS v2

Si votre version de cluster est antérieure à la version 1.27 et que vous avez déjà activé KMS, la mise à niveau vers le cluster version 1.27 ou ultérieure est bloquée. Procédez comme suit pour migrer vers KMS v2 :

  1. Désactivez KMS sur le cluster.
  2. Effectuez la migration du stockage.
  3. Mettez à niveau le cluster vers la version 1.27 ou supérieure.
  4. Activez KMS sur le cluster.
  5. Effectuez la migration du stockage.

Désactiver KMS pour migrer le stockage

Pour désactiver KMS sur un cluster existant, utilisez la commande az aks update avec l’argument --disable-azure-keyvault-kms :

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Migrer le stockage

Pour mettre à jour tous les secrets, utilisez la commande kubectl get secrets avec l’argument --all-namespaces :

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

Mettre à niveau le cluster AKS

Utilisez la commande az aks upgrade pour mettre à niveau un cluster AKS. Définissez la version sur 1.27.x ou version ultérieure à l’aide de l’argument --kubernetes-version.

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <AKS version>

Voici un exemple :

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version 1.27.1

Activer KMS après la migration du stockage

Vous pouvez réactiver la fonctionnalité KMS sur le cluster pour chiffrer les secrets. Ensuite, le cluster AKS utilise KMS v2. Si vous ne souhaitez pas migrer vers KMS v2, vous pouvez créer un cluster version 1.27 ou ultérieure avec KMS activé.

Migrer le stockage pour KMS v2

Pour chiffrer à nouveau tous les secrets dans KMS v2, utilisez la commande kubectl get secrets avec l’argument --all-namespaces :

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