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
À compter du 15 septembre 2024, Konnectivity n’est plus pris en charge pour les coffres de clés privées pour les nouveaux abonnements ou les abonnements qui n’ont pas déjà utilisé cette configuration. Pour les abonnements qui utilisent actuellement cette configuration ou qui l’ont utilisée au cours des 60 derniers jours, le support continuera jusqu’à ce qu’AKS version 1.30 atteigne la fin de vie du support communautaire.
KMS prend en charge Konnectivity ou l’intégration VNet du serveur d’API (préversion) pour les coffres de clés publiques.
KMS prend en charge l’intégration au réseau virtuel (VNet) du serveur d’API (préversion) pour les coffres de clés privés et publics.
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-access
et --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-access
et --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-access
et --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
Utilisez az keyvault key create
pour créer une clé :
az keyvault key create --name MyKeyName --vault-name MyKeyVault
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
Attribuer des autorisations pour créer une liaison privée
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-access
et --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-access
et --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-access
et --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 :
- Désactivez KMS sur le cluster.
- Effectuez la migration du stockage.
- Mettez à niveau le cluster vers la version 1.27 ou supérieure.
- Activez KMS sur le cluster.
- 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 -
Azure Kubernetes Service