Traiga sus propias claves (BYOK) con disco administrados de Azure en Azure Kubernetes Service (AKS)

Azure cifra todos los datos de un disco administrado en reposo. De manera predeterminada, los datos se cifran con claves administradas por Microsoft. Para tener más control sobre las claves de cifrado, puede proporcionar claves administradas por el cliente y utilizarlas para el cifrado en reposo del sistema operativo y los discos de datos de los clústeres de AKS.

Obtenga más información sobre las claves administradas por el cliente en Linux y Windows.

Requisitos previos

  • Debe habilitar la protección contra el purgado y la eliminación temporal para Azure Key Vault al usar Key Vault para cifrar los discos administrados.
  • Es necesaria la versión 2.11.1 o posterior de la CLI de Azure.
  • El cifrado de disco de datos y las claves administradas por el cliente se admiten en las versiones 1.24 y posteriores de Kubernetes.
  • Si decide rotar (cambiar) las claves periódicamente, consulte Claves administradas por el cliente y cifrado del disco administrado de Azure para obtener más información.

Limitaciones

  • El cifrado de un disco del sistema operativo con claves administradas por el cliente solo se puede habilitar al crear un clúster de AKS.

  • No se admiten nodos virtuales.

  • Al cifrar un grupo de nodos habilitado para disco de SO efímero con claves administradas por el cliente, si desea rotar la clave en Azure Key Vault, debe realizar lo siguiente:

    • Reducir verticalmente el número de grupos de nodos a 0
    • Rotación de la clave
    • Escalar verticalmente el grupo de nodos al recuento original

Creación de una instancia de Azure Key Vault

Use una instancia de Azure Key Vault para almacenar las claves. Opcionalmente, puede usar Azure Portal para configurar claves administradas por el cliente con Azure Key Vault mediante Azure Portal.

Cree un nuevo grupo de recursos y luego cree una nueva instancia de Key Vault y habilite la protección contra el purgado y la eliminación temporal. Asegúrese de usar los mismos nombres de región y grupo de recursos para cada comando.

# Optionally retrieve Azure region short names for use on upcoming commands
az account list-locations
# Create new resource group in a supported Azure region
az group create -l myAzureRegionName -n myResourceGroup

# Create an Azure Key Vault resource in a supported Azure region
az keyvault create -n myKeyVaultName -g myResourceGroup -l myAzureRegionName  --enable-purge-protection true

Creación de una instancia de DiskEncryptionSet

Reemplace myKeyVaultName por el nombre del almacén de claves. También necesita una clave almacenada en Azure Key Vault para completar los pasos siguientes. Almacene la clave existente en la instancia de Key Vault que creó en los pasos anteriores, o genere una nueva clave y reemplace myKeyName por el nombre de la clave.

# Retrieve the Key Vault Id and store it in a variable
keyVaultId=$(az keyvault show --name myKeyVaultName --query "[id]" -o tsv)

# Retrieve the Key Vault key URL and store it in a variable
keyVaultKeyUrl=$(az keyvault key show --vault-name myKeyVaultName --name myKeyName --query "[key.kid]" -o tsv)

# Create a DiskEncryptionSet
az disk-encryption-set create -n myDiskEncryptionSetName  -l myAzureRegionName  -g myResourceGroup --source-vault $keyVaultId --key-url $keyVaultKeyUrl

Importante

Asegúrese de que DiskEncryptionSet se encuentra en la misma región que el clúster de AKS y de que la identidad del clúster de AKS tiene acceso para leer a DiskEncryptionSet.

Concesión de acceso a DiskEncryptionSet al almacén de claves

Use DiskEncryptionSet y los grupos de recursos que creó en los pasos anteriores y conceda al recurso DiskEncryptionSet acceso a Azure Key Vault.

# Retrieve the DiskEncryptionSet value and set a variable
desIdentity=$(az disk-encryption-set show -n myDiskEncryptionSetName  -g myResourceGroup --query "[identity.principalId]" -o tsv)

# Update security policy settings
az keyvault set-policy -n myKeyVaultName -g myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get

Creación de un nuevo clúster de AKS y cifrado del disco del sistema operativo

Cree un nuevo grupo de recursos o seleccione un grupo de recursos existente que hospede otros clústeres de AKS y, a continuación, use la clave para cifrar los discos de SO conectados a la red o el disco de SO efímero. De manera predeterminada, un clúster usa el disco de SO efímero siempre que sea posible junto con el tamaño de la máquina virtual y el tamaño del disco de SO.

Ejecute el siguiente comando para recuperar el valor DiskEncryptionSet y establecer una variable:

diskEncryptionSetId=$(az disk-encryption-set show -n mydiskEncryptionSetName -g myResourceGroup --query "[id]" -o tsv)

Si desea crear un nuevo grupo de recursos para el clúster, ejecute el siguiente comando:

az group create -n myResourceGroup -l myAzureRegionName

Para crear un clúster normal con discos de SO conectados a la red cifrado con su clave, especifique el argumento --node-osdisk-type=Managed.

az aks create -n myAKSCluster -g myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Para crear un clúster con un disco de SO efímero cifrado con su clave, especifique el argumento --node-osdisk-type=Ephemeral. También debe especificar el argumento --node-vm-size porque el tamaño de máquina virtual predeterminado es demasiado pequeño y no admite el disco de SO efímero.

az aks create -n myAKSCluster -g myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Ephemeral --node-vm-size Standard_DS3_v2

Cuando se agregan nuevos grupos de nodos al clúster, la clave administrada por el cliente proporcionada durante el proceso de creación se usa para cifrar el disco de SO. El siguiente ejemplo muestra cómo implementar un nuevo grupo de nodos con un disco de SO efímero.

az aks nodepool add --cluster-name $CLUSTER_NAME -g $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral

Cifrado del disco de datos del clúster de AKS

Si ya ha proporcionado un conjunto de cifrado de disco durante la creación del clúster, el cifrado de discos de datos con el mismo conjunto de cifrado de disco será la opción predeterminada. Por tanto, este paso es opcional. Sin embargo, si desea cifrar discos de datos con otro conjunto de cifrado de disco, puede seguir estos pasos.

Importante

Asegúrese de que tiene las credenciales de AKS adecuadas. La identidad administrada debe tener acceso de colaborador al grupo de recursos donde se implementa diskencryptionset. De lo contrario, obtendrá un error que sugiere que la identidad administrada no tiene permisos.

Para asignar la identidad del clúster de AKS, el rol Colaborador para diskencryptionset, ejecute los siguientes comandos:

aksIdentity=$(az aks show -g $RG_NAME -n $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId

Cree un archivo llamado byok-azure-disk.yaml que contenga la siguiente información. Reemplace myAzureSubscriptionId, myResourceGroup y myDiskEncrptionSetName por sus valores y aplique YAML. Asegúrese de usar el grupo de recursos donde DiskEncryptionSet está implementado.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: byok
provisioner: disk.csi.azure.com # replace with "kubernetes.io/azure-disk" if aks version is less than 1.21
parameters:
  skuname: StandardSSD_LRS
  kind: managed
  diskEncryptionSetID: "/subscriptions/{myAzureSubscriptionId}/resourceGroups/{myResourceGroup}/providers/Microsoft.Compute/diskEncryptionSets/{myDiskEncryptionSetName}"

A continuación, ejecute los siguientes comandos para actualizar el clúster de AKS:

# Get credentials
az aks get-credentials --name myAksCluster --resource-group myResourceGroup --output table

# Update cluster
kubectl apply -f byok-azure-disk.yaml

Pasos siguientes

Revise los procedimientos recomendados para la seguridad de los clústeres de AKS.