Share via


Adición de Servicio de administración de claves cifrado etcd a un clúster de Azure Kubernetes Service

En este artículo se muestra cómo activar el cifrado en reposo para los secretos de Azure Kubernetes Service (AKS) en un almacén de clave-valor etcd mediante Azure Key Vault y el complemento Servicio de administración de claves (KMS). Puede usar el complemento KMS para:

  • Use una clave en un almacén de claves para el cifrado etcd.
  • Traer sus propias claves.
  • Proporcione cifrado en reposo para los secretos almacenados en etcd.
  • Gire las claves en un almacén de claves.

Para obtener más información sobre el uso de KMS, consulte Cifrado de datos secretos en reposo.

Requisitos previos

Advertencia

KMS admite konnectivity o integración con red virtual del servidor de API (versión preliminar).

Puede usar kubectl get po -n kube-system para comprobar los resultados y mostrar que se está ejecutando un pod konnectivity-agent. Si se está ejecutando un pod, el clúster de AKS usa Konnectivity. Al usar la integración con red virtual del servidor de API, puede ejecutar el az aks show -g -n comando para comprobar que la enableVnetIntegration configuración está establecida trueen .

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 debe establecerse antes de que se active la característica. La identidad administrada asignada por el sistema no está disponible hasta después de crear el clúster. Considere la dependencia del ciclo.
  • Azure Key Vault con un firewall para permitir 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 traiga su propio almacén de claves de Azure (BYO) desde otro inquilino.
  • Con KMS activado, no se puede cambiar el modo de almacén de claves asociado (público frente a privado). Para actualizar un modo de almacén de claves, primero debe desactivar KMS y volver a activarlo.
  • Si un clúster tiene KMS activado, tiene un almacén de claves privado y no usa el túnel de integración de red virtual del servidor de API, no se puede detener e iniciar el clúster.
  • El uso de virtual Machine Scale Sets API para escalar 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ública o un almacén de claves privado.

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

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

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 hace que los secretos del clúster sean irrecuperables.

Si necesita recuperar el almacén de claves o la clave, consulte Administración de recuperación de Azure Key Vault con eliminación temporal y protección de purga.

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

Use az keyvault create para crear un almacén de claves sin usar el control de acceso basado en rol de Azure (RBAC de Azure):

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

Use az keyvault key create para crear una clave:

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

Use az keyvault key show para exportar el identificador de clave:

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

En este ejemplo se almacena el identificador de clave en KEY_ID.

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

Use az keyvault create para crear un almacén de claves mediante RBAC de Azure:

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

Asigne 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 --out tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

Use az keyvault key create para crear una clave:

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

Use az keyvault key show para exportar el identificador de clave:

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

En este ejemplo se almacena el identificador de clave en KEY_ID.

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

Use az identity create para crear una identidad administrada asignada por el usuario:

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

Use az identity show para obtener el identificador del objeto de identidad:

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

En el ejemplo anterior se almacena el valor del identificador de objeto de identidad en IDENTITY_OBJECT_ID.

Use az identity show para obtener el identificador de recurso de identidad:

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

En este ejemplo se almacena el valor del identificador de recurso de identidad en IDENTITY_RESOURCE_ID.

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

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ública que no sea RBAC

Si el almacén de claves no está establecido con --enable-rbac-authorization, puede usar az keyvault set-policy para crear una directiva de Azure Key Vault.

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

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

Si el almacén de claves se establece 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 active el cifrado etcd de KMS

Para activar el cifrado etcd de KMS, cree un clúster de AKS mediante el comando az aks create . Puede usar los --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-vault-network-accessy --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

Actualización de un clúster de AKS existente para activar el cifrado de KMS etcd para un almacén de claves pública

Para activar el cifrado etcd de KMS para un clúster existente, use el comando az aks update . Puede usar los --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-vault-network-accessy --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 ya no se cifran. 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 claves existentes en un almacén de claves pública

Después de cambiar el identificador de clave (incluido el cambio del nombre de la clave o la versión de la clave), puede usar el comando az aks update . Puede usar los --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-vault-network-accessy --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.

Después de girar la clave, la clave anterior (key1) todavía se almacena en caché y no se debe eliminar. Si desea eliminar la clave anterior (key1) inmediatamente, 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-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 se cifran 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. El almacén de claves se agrega una conexión de punto de conexión privado con el clúster de AKS.

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 hace que los secretos del clúster sean irrecuperables.

Si necesita recuperar el almacén de claves o la clave, consulte Administración de recuperación de Azure Key Vault con eliminación temporal y protección de 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

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

Use az identity create para crear una identidad administrada asignada por el usuario:

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

Use az identity show para obtener el identificador del objeto de identidad:

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

En el ejemplo anterior se almacena el valor del identificador de objeto de identidad en IDENTITY_OBJECT_ID.

Use az identity show para obtener el identificador de recurso de identidad:

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

En este ejemplo se almacena el valor del identificador de recurso de identidad 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 privada que no es RBAC

Nota:

Al usar un almacén de claves privado, AKS no puede validar los permisos de la identidad. Compruebe que se ha 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 de almacén de claves en Azure:

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

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

Si el almacén de claves se establece con --enable-rbac-authorization, asigne un rol de RBAC de Azure que incluya los 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 active el cifrado etcd de KMS

Para activar el cifrado 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 --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accessy --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

Actualización de un clúster de AKS existente para activar el cifrado de KMS etcd para un almacén de claves privado

Para activar el cifrado etcd de KMS en un clúster existente que tiene un almacén de claves privado, use el comando az aks update . Puede usar los --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accessy --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 se cifran. 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 claves existentes en un almacén de claves privado

Después de cambiar el identificador de clave (incluido el nombre de clave y la versión de la clave), puede usar el comando az aks update . Puede usar los --enable-azure-keyvault-kmsparámetros , --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accessy --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 girar la clave, la clave anterior (key1) todavía se almacena en caché y no se debe eliminar. Si desea eliminar la clave anterior (key1) inmediatamente, 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 se cifran 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 de un modo de almacén de claves

Nota:

Para cambiar otro almacén de claves con un modo diferente (ya sea público o privado), puede ejecutarse az aks update directamente. Para cambiar el modo de un almacén de claves conectado, primero debe desactivar KMS y, a continuación, volver a activarlo mediante los nuevos identificadores del almacén de claves.

En las secciones siguientes se describe cómo migrar un almacén de claves pública conectado al modo privado.

Desactivar 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

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

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

Active KMS mediante el almacén de claves privada 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.

Desactivar 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 kmS que 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 se cifran 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, al activar la característica KMS se configura KMS v2. Con KMS v2, no se limita a los 2000 secretos que admiten 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 posterior a la 1.27 y ya ha activado KMS, se bloquea la actualización a KMS 1.27 o posterior. 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.

Desactivar KMS para migrar el almacenamiento

Para desactivar KMS en un clúster existente, use el az aks update comando con el --disable-azure-keyvault-kms argumento :

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

Migración del almacenamiento

Para actualizar todos los secretos, use el kubectl get secrets comando con el --all-namespaces argumento :

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 az aks upgrade comando . Establezca la versión 1.27.x en o posterior mediante el --kubernetes-version argumento .

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

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

Puede volver a activar la característica de KMS en el clúster para cifrar los secretos. Después, el clúster de AKS usa KMS v2. Si no desea migrar a KMS v2, puede crear un nuevo clúster que sea 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 kubectl get secrets comando con el --all-namespaces argumento :

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