Adición del cifrado de etcd del Servicio de administración de claves a un clúster de Azure Kubernetes Service
En este artículo, se muestra cómo activar el cifrado en reposo de los secretos de Azure Kubernetes Service (AKS) en un almacén de clave-valor de etcd mediante Azure Key Vault y el complemento del Servicio de administración de claves (KMS). Puede usar el complemento de KMS para:
- Usar una clave de un almacén de claves para el cifrado de etcd.
- Traer sus propias claves.
- Proporcionar cifrado en reposo para los secretos almacenados en etcd.
- Rotar las claves de un almacén de claves.
Para obtener más información sobre el uso de KMS, consulte Uso de un proveedor de KMS para el cifrado de datos.
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- Versión 2.39.0 o posterior de la CLI de Azure. Ejecute
az --version
para buscar su versión. Si necesita instalarla o actualizarla, consulte Instalación de la CLI de Azure.
Advertencia
A partir del 15 de septiembre de 2024, Konnectivity ya no se admite para almacenes de claves privadas en nuevas suscripciones o en suscripciones que no hayan usado esta configuración anteriormente. En el caso de las suscripciones que actualmente usan esta configuración o que la han usado en los últimos 60 días, el soporte continuará hasta que el soporte técnico de la comunidad para la versión 1.30 de AKS llegue al final de su ciclo de vida útil.
KMS admite Konnectivity o la integración con red virtual de servidor de API (versión preliminar) para almacenes de claves públicas.
KMS admite la integración con red virtual de servidor de API (versión preliminar) para almacenes de claves públicos y privados.
Puede usar kubectl get po -n kube-system
para comprobar los resultados y mostrar que se está ejecutando un pod de konnectivity-agent. Si se está ejecutando un pod, el clúster de AKS usa Konnectivity. Al usar la integración de red virtual del servidor de API, puede ejecutar el comando az aks show -g -n
para comprobar que la configuración enableVnetIntegration
esté establecida en true
.
Las siguientes limitaciones se aplican al integrar el cifrado KMS etcd con AKS:
- No se admite la eliminación de la clave, el almacén de claves o la identidad asociada.
- El cifrado etcd de KMS no funciona con la identidad administrada asignada por el sistema. La directiva de acceso del almacén de claves se debe establecer antes de activar la característica. La identidad administrada asignada por el sistema no está disponible hasta después de crear el clúster. Tenga en cuenta la dependencia del ciclo.
- Azure Key Vault con una configuración de firewall "permitir el acceso público desde redes virtuales y direcciones IP específicas" o "deshabilitar el acceso público" no se admite porque bloquea el tráfico del complemento KMS al almacén de claves.
- El número máximo de secretos admitidos por un clúster que tiene KMS activado es de 2000. Sin embargo, es importante tener en cuenta que KMS v2 no está limitado por esta restricción y puede controlar un mayor número de secretos.
- No se admite la opción Bring your own (BYO) para Azure Key Vault desde otro inquilino.
- Con KMS activado, no se puede cambiar el modo del almacén de claves asociado (público frente a privado). Para actualizar el modo de un almacén de claves, primero debe desactivar KMS y, a continuación, volver a activarlo.
- Si un clúster tiene KMS activado y tiene un almacén de claves privadas, debe usar el túnel de integración de red virtual del servidor de API (versión preliminar). No se admite Konnectivity.
- El uso de la API de Virtual Machine Scale Sets para reducir los nodos del clúster a cero desasigna los nodos. A continuación, el clúster deja de funcionar y se vuelve irrecuperable.
- Después de desactivar KMS, no puede destruir las claves. La destrucción de las claves hace que el servidor de API deje de funcionar.
KMS admite un almacén de claves público o un almacén de claves privado.
En las secciones siguientes, se describe cómo activar KMS para un almacén de claves público.
Advertencia
No se admite la eliminación de la clave o el almacén de claves, y esto provoca que los secretos del clúster sean irrecuperables.
Si necesita recuperar el almacén de claves o la clave, consulte Administración de la recuperación de Azure Key Vault con eliminación temporal y protección contra purga.
Use az keyvault create
para crear un almacén de claves sin usar el control de acceso basado en roles de Azure (RBAC de Azure):
az keyvault create --name MyKeyVault --resource-group MyResourceGroup
Utilice az keyvault key create
para crear una clave:
az keyvault key create --name MyKeyName --vault-name MyKeyVault
Utilice az keyvault key show
para exportar el identificador de la clave:
export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID
En este ejemplo, el identificador de la clave se almacena en KEY_ID
.
Use az keyvault create
para crear un almacén de claves con RBAC de Azure:
export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup --enable-rbac-authorization true --query id -o tsv)
Asígnese permisos para crear una clave:
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
Utilice az keyvault key create
para crear una clave:
az keyvault key create --name MyKeyName --vault-name MyKeyVault
Utilice az keyvault key show
para exportar el identificador de la clave:
export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID
En este ejemplo, el identificador de la clave se almacena en KEY_ID
.
Utilice az identity create
para crear una identidad administrada asignada por el usuario:
az identity create --name MyIdentity --resource-group MyResourceGroup
Utilice az identity show
para obtener el id. de objeto de la identidad:
IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID
En el ejemplo anterior, el valor del id. de objeto de la identidad se almacena en IDENTITY_OBJECT_ID
.
Utilice az identity show
para obtener el id. de recurso de la identidad:
IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID
En este ejemplo, el valor del identificador de recurso de la identidad se almacena en IDENTITY_RESOURCE_ID
.
En las secciones siguientes, se describe cómo asignar permisos de descifrado y cifrado para un almacén de claves privado.
Si el almacén de claves no está establecido con --enable-rbac-authorization
, puede usar az keyvault set-policy
para crear una directiva del almacén de claves de Azure.
az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID
Si el almacén de claves está establecido con --enable-rbac-authorization
, asigne el rol Usuario criptográfico de Key Vault para conceder permisos de descifrado y cifrado.
az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
Creación de un clúster de AKS que tenga un almacén de claves público y activación del cifrado de etcd de KMS
Para activar el cifrado de etcd de KMS, cree un clúster de AKS mediante el comando az aks create. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-id
con 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
Actualización de un clúster de AKS existente para activar el cifrado de etcd de KMS para un almacén de claves público
Para activar el cifrado de etcd de KMS para un clúster existente, use el comando az aks update. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-id
con 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
Use el siguiente comando para actualizar todos los secretos. Si no ejecuta este comando, los secretos creados anteriormente dejarán de estar cifrados. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Después de cambiar el identificador de la clave (tanto el cambio del nombre de la clave como de la versión de la clave), puede usar el comando az aks update. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-id
con az-aks-update
para rotar las claves existentes en KMS.
Advertencia
Recuerde actualizar todos los secretos después de la rotación de claves. Si no actualiza todos los secretos, los secretos no son accesibles si las claves que se crearon anteriormente no existen o ya no funcionan.
KMS usa 2 claves al mismo tiempo. Después de la primera rotación de claves, debe asegurarse de que las claves antiguas y nuevas son válidas (no expiradas) hasta la siguiente rotación de claves. Después de la segunda rotación de claves, la clave más antigua se puede quitar o expirar de forma segura.
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
Use el siguiente comando para actualizar todos los secretos. Si no ejecuta este comando, los secretos creados anteriormente todavía están cifrados con la clave anterior. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Si activa KMS para un almacén de claves privado, AKS crea automáticamente un punto de conexión privado y un vínculo privado en el grupo de recursos del nodo. Se agrega al almacén de claves una conexión de punto de conexión privado con el clúster de AKS.
Advertencia
KMS solo admite la integración de red virtual del servidor de API (versión preliminar) para el almacén de claves privadas.
Advertencia
No se admite la eliminación de la clave o el almacén de claves, y esto provoca que los secretos del clúster sean irrecuperables.
Si necesita recuperar el almacén de claves o la clave, consulte Administración de la recuperación de Azure Key Vault con eliminación temporal y protección contra purga.
Use az keyvault create
para crear un almacén de claves privado:
az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
Utilice az keyvault key create
para crear una clave:
az keyvault key create --name MyKeyName --vault-name MyKeyVault
No se admite la creación o actualización de claves en un almacén de claves privado que no tenga un punto de conexión privado. Para obtener información sobre cómo administrar almacenes de claves privados, consulte Integración de un almacén de claves mediante Azure Private Link.
Utilice az identity create
para crear una identidad administrada asignada por el usuario:
az identity create --name MyIdentity --resource-group MyResourceGroup
Utilice az identity show
para obtener el id. de objeto de la identidad:
IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID
En el ejemplo anterior, el valor del id. de objeto de la identidad se almacena en IDENTITY_OBJECT_ID
.
Utilice az identity show
para obtener el id. de recurso de la identidad:
IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID
En este ejemplo, el valor del identificador de recurso de la identidad se almacena en IDENTITY_RESOURCE_ID
.
En las secciones siguientes, se describe cómo asignar permisos de descifrado y cifrado para un almacén de claves privado.
Nota
Al usar un almacén de claves privado, AKS no puede validar los permisos de la identidad. Compruebe que se haya concedido permiso a la identidad para acceder al almacén de claves antes de habilitar KMS.
Si el almacén de claves no está establecido con --enable-rbac-authorization
, puede usar az keyvault set-policy
para crear una directiva del almacén de claves en Azure:
az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID
Si el almacén de claves está establecido con --enable-rbac-authorization
, asigne un rol de RBAC de Azure que incluya permisos de descifrado y cifrado:
az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
En el caso de los almacenes de claves privados, se requiere el rol Colaborador de Key Vault para crear un vínculo privado entre el almacén de claves privado y el clúster.
az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
Creación de un clúster de AKS que tenga un almacén de claves privado y activación del cifrado de etcd de KMS
Para activar el cifrado de etcd de KMS para un almacén de claves privado, cree un clúster de AKS mediante el comando az aks create. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-id
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-vault-resource-id
con 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
Actualización de un clúster de AKS existente para activar el cifrado de etcd de KMS para un almacén de claves privado
Para activar el cifrado de etcd de KMS en un clúster existente que tenga un almacén de claves privado, use el comando az aks update. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-id
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-vault-resource-id
con 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
Use el siguiente comando para actualizar todos los secretos. Si no ejecuta este comando, los secretos creados anteriormente no estarán cifrados. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Después de cambiar el identificador de la clave (incluidos el nombre de la clave y la versión de la clave), puede usar el comando az aks update. Puede usar los parámetros --enable-azure-keyvault-kms
, --azure-keyvault-kms-key-id
, --azure-keyvault-kms-key-vault-network-access
y --azure-keyvault-kms-key-vault-resource-id
con az-aks-update
para rotar las claves existentes de KMS.
Advertencia
Recuerde actualizar todos los secretos después de la rotación de claves. Si no actualiza todos los secretos, los secretos no son accesibles si las claves que se crearon anteriormente no existen o ya no funcionan.
Después de rotar la clave, la clave anterior (key1) todavía está almacenada en caché y no se debe eliminar. Si desea eliminar la clave anterior (key1) de inmediato, debe rotar la clave dos veces. A continuación, key2 y key3 se almacenan en caché y key1 se puede eliminar sin afectar al clúster existente.
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
Use el siguiente comando para actualizar todos los secretos. Si no actualiza todos los secretos, los secretos creados anteriormente están cifrados con la clave anterior. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Nota
Para cambiar un almacén de claves diferente con un modo diferente (ya sea público o privado), puede ejecutar az aks update
directamente. Para cambiar el modo de un almacén de claves adjunto, primero debe desactivar KMS y, a continuación, volver a activarlo con los nuevos identificadores del almacén de claves.
En las secciones siguientes, se describe cómo migrar un almacén de claves público adjunto al modo privado. Estos pasos también se pueden usar para migrar de privado a público.
Desactive KMS en un clúster existente y libere el almacén de claves:
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
Use el siguiente comando para actualizar todos los secretos. Si no ejecuta este comando, los secretos creados anteriormente todavía están cifrados con la clave anterior. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Actualice el almacén de claves de público a privado:
az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
Para migrar de un conjunto privado a público establecido --public-network-access
a Enabled
en el comando anterior.
Active KMS con el almacén de claves privado actualizado:
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
Después de configurar KMS, puede activar la configuración de diagnóstico del almacén de claves para comprobar los registros de cifrado.
Antes de desactivar KMS, puede usar el siguiente comando de la CLI de Azure para comprobar si KMS está activado:
az aks list --query "[].{Name:name, KmsEnabled:securityProfile.azureKeyVaultKms.enabled, KeyId:securityProfile.azureKeyVaultKms.keyId}" -o table
Si los resultados confirman que KMS está activado, ejecute el siguiente comando para desactivar KMS en el clúster:
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
Use el siguiente comando para actualizar todos los secretos. Si no ejecuta este comando, los secretos creados anteriormente todavía están cifrados con la clave anterior y los permisos de cifrado y descifrado en el almacén de claves siguen siendo necesarios. Para clústeres más grandes, es posible que quiera subdividir los secretos por espacio de nombres o crear un script de actualización.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
A partir de la versión 1.27 de AKS, la activación de la característica KMS configura KMS v2. Con KMS v2, no está limitado a los 2000 secretos que admiten las versiones anteriores. Para obtener más información, consulte Mejoras de KMS V2.
Si la versión del clúster es anterior a la 1.27 y ya ha activado KMS, se bloquea la actualización a la versión 1.27 o posterior del clúster. Siga estos pasos para migrar a KMS v2:
- Desactive KMS en el clúster.
- Realizar la migración de almacenamiento.
- Actualice el clúster a la versión 1.27 o posterior.
- Active KMS en el clúster.
- Realizar la migración de almacenamiento.
Para desactivar KMS en un clúster existente, use el comando az aks update
con el argumento --disable-azure-keyvault-kms
:
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
Para actualizar todos los secretos, use el comando kubectl get secrets
con el argumento --all-namespaces
:
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Para actualizar un clúster de AKS, use el comando az aks upgrade
. Establezca la versión en la 1.27.x
o posterior mediante el argumento --kubernetes-version
.
az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <AKS version>
Este es un ejemplo:
az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version 1.27.1
Puede volver a activar la característica KMS en el clúster para cifrar los secretos. Después, el clúster de AKS usará KMS v2. Si no desea migrar a KMS v2, puede crear un nuevo clúster de la versión 1.27 o posterior con KMS activado.
Para volver a cifrar todos los secretos en KMS v2, use el comando kubectl get secrets
con el argumento --all-namespaces
:
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Comentarios de Azure Kubernetes Service
Azure Kubernetes Service es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: