Compartir a través de


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.

Requisitos previos

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.

Limitaciones

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.

Activación de KMS para un almacén de claves público

En las secciones siguientes, se describe cómo activar KMS para un almacén de claves público.

Creación de un almacén de claves público y una clave

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.

Creación de un almacén de claves y una clave para un almacén de claves público que no use RBAC

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.

Creación de un almacén de claves y una clave para un almacén de claves público con RBAC

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.

Creación de una identidad administrada asignada por el usuario para un almacén de claves público

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.

Asignación de permisos para descifrar y cifrar un almacén de claves público

En las secciones siguientes, se describe cómo asignar permisos de descifrado y cifrado para un almacén de claves privado.

Asignación de permisos para un almacén de claves público que no use RBAC

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

Asignación de permisos para un almacén de claves público con RBAC

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 -

Rotación de las claves existentes en un almacén de claves público

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.

Después de rotar la versión de la clave KMS con el nuevo keyId, compruebe securityProfile.azureKeyVaultKms.keyId en el JSON del recurso de AKS. Asegúrese de que la nueva versión de clave está en uso.

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 -

Activación de KMS para un almacén de claves privado

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.

Creación de un almacén de claves privado y una clave

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.

Creación de una identidad administrada asignada por el usuario para un almacén de claves privado

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.

Asignación de permisos para descifrar y cifrar un almacén de claves privado

En las secciones siguientes, se describe cómo asignar permisos de descifrado y cifrado para un almacén de claves privado.

Asignación de permisos para un almacén de claves privado que no use RBAC

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

Asignación de permisos para un almacén de claves privado con RBAC

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 -

Rotación de las claves existentes en un almacén de claves privado

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.

Después de rotar la versión de la clave KMS con el nuevo keyId, compruebe securityProfile.azureKeyVaultKms.keyId en el JSON del recurso de AKS. Asegúrese de que la nueva versión de clave está en uso.

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 -

Actualización del modo de un almacén de claves

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.

Desactivación de KMS en el clúster

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 -

Cambio del modo del almacén de claves

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.

Activación de KMS para el clúster con el almacén de claves actualizado

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.

Desactivación de KMS

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 -

Compatibilidad con KMS v2

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.

Migración a 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:

  1. Desactive KMS en el clúster.
  2. Realizar la migración de almacenamiento.
  3. Actualice el clúster a la versión 1.27 o posterior.
  4. Active KMS en el clúster.
  5. Realizar la migración de almacenamiento.

Desactivación de KMS para migrar el 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

Migración del almacenamiento

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 -

Actualización del clúster de AKS

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

Activación de KMS después de la migración de almacenamiento

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.

Migración del almacenamiento para KMS v2

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 -

Observabilidad de KMS

JSON de recurso de AKS

Puede comprobar la configuración de KMS en el JSON del recurso de AKS mediante:

  1. Usar el comando az aks show
  2. A través de Azure Portal

La sección securityProfile.azureKeyVaultKms muestra la configuración de KMS, incluidas las versiones de almacén de claves, clave, clave actual y previa.

Diagnóstico y solución de problemas

Dado que el complemento KMS es un sidecar de kube-apiserver Pod, no se puede acceder directamente a él. Para mejorar la observabilidad de KMS, puede comprobar el estado del KMS mediante:

  1. Abra la página de Azure Portal del clúster de AKS
  2. Vaya a Diagnose and solve problems y busque KMS
  3. En el detector KMS, puede ver el estado de KMS y si se encuentra en algunos escenarios de error conocidos

Tome KeyExpired: Operation encrypt is not allowed on an expired key como ejemplo:

Dado que el complemento KMS de AKS actualmente solo permite el almacén de claves BYO y la clave, es su responsabilidad administrar el ciclo de vida de la clave. Si la clave ha expirado, el complemento KMS no podrá descifrar los secretos existentes. Debe

  1. Ampliar la fecha de expiración de la clave para que el KMS funcione
  2. Rotar la versión de la clave