Uso del proveedor de Azure Key Vault para el controlador CSI de almacén de secretos en un clúster de Azure Kubernetes Service (AKS)

El proveedor de Azure Key Vault para el controlador CSI (Container Storage Interface) de Secrets Store permite la integración de Azure Key Vault como un almacén de secretos con un clúster de Azure Kubernetes Service (AKS) mediante un volumen CSI.

Características

  • Monta secretos, claves y certificados en un pod mediante un volumen CSI.
  • Admite volúmenes CSI en línea.
  • Admite el montaje de varios objetos de almacenamiento de secretos como un solo volumen.
  • Admite la portabilidad de pods con la definición de recursos personalizados (CRD) SecretProviderClass.
  • Admite contenedores de Windows.
  • Se sincroniza con secretos de Kubernetes.
  • Admite la rotación automática de contenido montado y secretos de Kubernetes sincronizados.

Limitaciones

  • Un contenedor que usa un ConfigMap o un Secret como un montaje de volumen de tipo subPath no recibe actualizaciones automatizadas cuando se rota el secreto, lo cual es una limitación de Kubernetes. Para que los cambios surtan efecto, la aplicación debe volver a cargar el archivo modificado viendo los cambios en el sistema de archivos o reiniciando el pod. Para obtener más información, consulte Limitaciones conocidas del controlador CSI del almacén de secretos.
  • El complemento crea una identidad administrada denominada azurekeyvaultsecretsprovider-xxxxx en el grupo de recursos del nodo (MC_) y la asigna automáticamente al conjunto de escalado de máquinas virtuales. Puede usar esta identidad administrada o su propia identidad administrada para acceder al almacén de claves. No se admite para evitar la creación de la identidad.

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Compruebe que la versión de la CLI de Azure es 2.30.0 o posterior. Si es una versión anterior, instale la más reciente.
  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Terraform, versión 1.6 o posterior.

  • CLI de Azure instalado e iniciado sesión. instale la versión más reciente.

  • Permisos para crear recursos de AKS y Key Vault.

  • Establezca la suscripción de Azure en el CLI de Azure con el comando siguiente. Reemplace <subscriptionId> con el Id. de suscripción.

    az account set --subscription <subscriptionId>
    

Red

Funciones

Creación de un clúster de AKS

Cree un clúster de AKS con el proveedor de Azure Key Vault para la compatibilidad con el controlador CSI de Secrets Store.

  1. Cree variables que se usen en los comandos para crear un clúster de AKS y Key Vault.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    

    Los nombres de Azure Key Vault deben ser únicos a nivel global, alfanuméricos (incluidos los guiones), y tener entre 3 y 24 caracteres. El nombre del almacén de claves concatena el valor KEYVAULT_NAME de la variable myKeyVault con la cadena de 10 caracteres de la variable RANDOM_STRING.

  2. Cree un grupo de recursos de Azure con el comando az group create.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Cree un clúster de AKS con la funcionalidad del proveedor de Azure Key Vault para el controlador CSI del almacén de secretos mediante el comando az aks create con el parámetro --enable-addons azure-keyvault-secrets-provider.

    El parámetro --enable-addons crea una identidad administrada, denominada azurekeyvaultsecretsprovider-xxxx y asignada por el usuario, que permite autenticarse en el almacén de claves. La identidad administrada se almacena en el grupo de recursos del nodo (MC_) y se asigna automáticamente al conjunto de escalado de máquinas virtuales. Puede usar esta identidad administrada o su propia identidad administrada para acceder al almacén de claves. No se admite para evitar la creación de la identidad.

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-addons azure-keyvault-secrets-provider \
      --generate-ssh-keys
    

    Sugerencia

    Si desea usar la identificación de carga de trabajo de Microsoft Entra, el comando az aks create debe incluir los parámetros --enable-oidc-issuer y --enable-workload-identity.

Creación de un clúster de AKS

Cree un archivo main.tf con la siguiente configuración para crear un clúster de AKS con el proveedor de Azure Key Vault para soportar el controlador CSI del almacén de secretos.

  1. Cree la configuración de Terraform.

    terraform {
     required_version = ">= 1.6.0"
     required_providers {
       azurerm = {
         source  = "hashicorp/azurerm"
         version = "~> 4.0"
       }
     }
    }
    provider "azurerm" {
     features {}
    }
    data "azurerm_client_config" "current" {}
    resource "azurerm_resource_group" "rg" {
     name     = "aks-rg"
     location = "East US"
    }
    
  2. Cree el clúster de AKS.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "aks-cluster"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     dns_prefix          = "akscsi"
     default_node_pool {
       name       = "system"
       node_count = 1
       vm_size    = "Standard_DS2_v2"
     }
     identity {
       type = "SystemAssigned"
     }
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  3. Implemente la configuración. Form a Bash session (Formar una sesión de Bash), ejecute los siguientes comandos para implementar los recursos:

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Actualización de un clúster de AKS ya existente

Actualice un clúster de AKS existente con el proveedor de Azure Key Vault para la compatibilidad con el controlador CSI de Secrets Store.

  1. Cree variables que se usen en los comandos. Reemplace los valores según sea necesario para actualizar el clúster de AKS existente o Key Vault.

    Por ejemplo, si usa un almacén de claves existente, reemplace el valor de la KEYVAULT_NAME variable sin usar la RANDOM_STRING variable .

    Si no tiene ningún almacén de claves, los nombres de Azure Key Vault deben ser únicos a nivel global, alfanuméricos (incluidos los guiones), y tener entre 3 y 24 caracteres. El nombre del almacén de claves concatena el valor KEYVAULT_NAME de la variable myKeyVault con la cadena de 10 caracteres de la variable RANDOM_STRING. Puede crear el almacén de claves más adelante en este artículo.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    
  2. Actualice un clúster de AKS existente con el proveedor de Azure Key Vault para la funcionalidad del Secret Store CSI Driver mediante el comando az aks enable-addons y habilite el complemento azure-keyvault-secrets-provider. El complemento crea una identidad administrada asignada por el usuario, que se puede usar para autenticarse en el almacén de claves.

    az aks enable-addons \
      --addons azure-keyvault-secrets-provider \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    

    Después de habilitar el proveedor de secretos de Azure Key Vault, AKS crea una identidad administrada denominada azurekeyvaultsecretsprovider-xxxx que puede usar para autenticarse en el almacén de claves. La identidad administrada se almacena en el grupo de recursos del nodo (MC_) y se asigna automáticamente al conjunto de escalado de máquinas virtuales. Puede usar esta identidad administrada o su propia identidad administrada para acceder al almacén de claves. No se admite para evitar la creación de la identidad.

Actualización de un clúster de AKS ya existente

Cree un archivo main.tf con la siguiente configuración para actualizar un clúster de AKS existente con el proveedor Azure Key Vault para compatibilidad con el controlador CSI del Almacén de Secretos.

  1. Actualice un clúster existente de AKS.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. Implemente la configuración. Form a Bash session (Formar una sesión de Bash), ejecute los siguientes comandos para implementar la configuración:

    Run the following commands to apply the updates:
    
    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Verifique la instalación de la identidad administrada y el proveedor de almacén de claves

Si usó Terraform para crear un nuevo clúster o actualizar un clúster existente, debe reemplazar las variables como $CLUSTER_NAME en los siguientes comandos por los valores que usó en la configuración de Terraform.

Comprobación de la identidad administrada

Siga estos pasos para comprobar que se creó la identidad administrada y se asignó al conjunto de escalado de máquinas virtuales del clúster.

  1. Compruebe que se creó la identidad administrada y se asignó al clúster mediante el az aks show comando .

    az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query addonProfiles
    
    {
      "azureKeyvaultSecretsProvider": {
        "config": {
          "enableSecretRotation": "false",
          "rotationPollInterval": "2m"
        },
        "enabled": true,
        "identity": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
          "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster"
        }
      }
    }
    

    La resourceId propiedad muestra el grupo de recursos y el nombre azurekeyvaultsecretsprovider-myaksclusterde la identidad .

  2. Compruebe que la identidad administrada está asignada al conjunto de escalado de máquinas virtuales del grupo de recursos del nodo.

    NODE_RG=$(az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query nodeResourceGroup --output tsv)
    
    VMSS_NAME=$(az vmss list \
      --resource-group $NODE_RG \
      --query [].name --output tsv)
    
    az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'
    

    La salida muestra el identificador de recurso de los conjuntos de escalado de máquinas virtuales Microsoft.Compute/virtualMachineScaleSets y la propiedad userAssignedIdentities con un identificador de recurso para azurekeyvaultsecretsprovider-myakscluster que confirma que la identidad se asigna al conjunto de escalado de máquinas virtuales.

Comprobación de la instalación del proveedor de Azure Key Vault para el controlador CSI de almacén de secretos

  1. Obtenga las credenciales del clúster de AKS mediante el comando az aks get-credentials.

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. Compruebe que la instalación ha finalizado con el comando kubectl get pods, que enumera todos los pods con las etiquetas secrets-store-csi-driver y secrets-store-provider-azure en el espacio de nombres kube-system.

    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide
    

    La marca -o wide incluye el nodo en el que se ejecuta cada pod en la salida.

    El resultado debería ser similar al ejemplo siguiente:

    NAME                                     READY   STATUS    RESTARTS   AGE    NODE
    aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s  aks-nodepool1-12345678-vmss000002
    aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s  aks-nodepool1-12345678-vmss000002
    

Creación de un almacén de claves

Ejecute el az keyvault create comando para crear un nuevo almacén de claves con RBAC de Azure habilitado.

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization

RBAC de Azure está habilitado de forma predeterminada al crear un nuevo almacén de claves aunque no incluya el --enable-rbac-authorization parámetro .

Para obtener más información sobre los modelos de permisos de Bóveda de claves y RBAC de Azure, consulte Proporcionar acceso a las claves, certificados y secretos de Bóveda de claves con un control de acceso basado en roles de Azure.

Actualizar la bóveda de claves existente

Ejecute el comando az keyvault update para actualizar un almacén de claves existente con Azure control de acceso basado en rol (Azure RBAC). El parámetro --enable-rbac-authorization es necesario para habilitar Azure RBAC al actualizar un almacén de claves existente que tenga deshabilitado Azure RBAC.

az keyvault update \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable-rbac-authorization

Para más información sobre los modelos de permisos del almacén de claves y RBAC de Azure, consulte Proporcionar acceso a claves, certificados y secretos de Key Vault con un control de acceso basado en rol de Azure.

Añada la asignación de roles y el secreto al almacén de claves

  1. Ejecute el comando az keyvault show para comprobar que el almacén de claves tiene habilitado Azure RBAC.

    az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.enableRbacAuthorization
    

    La salida debe ser true.

  2. Agregue una asignación de roles para la cuenta de usuario al ámbito del almacén de claves mediante el az role assignment create comando para poder agregar un secreto del almacén de claves en el paso siguiente.

    Se agrega el rol de Oficial de secretos de Key Vault con un identificador b86a8fe4-44ce-4948-aee5-eccb2c155cd7 único y puede usar el nombre o el identificador único. El uso del identificador único del rol es un procedimiento recomendado para evitar problemas si cambia el nombre de los roles.

    KEYVAULT_ID=$(az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id -o tsv)
    
    MYID=$(az ad signed-in-user show --query id --output tsv)
    
    az role assignment create \
      --assignee-object-id $MYID \
      --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \
      --scope $KEYVAULT_ID \
      --assignee-principal-type User
    

    La asignación de roles puede tardar varios minutos en surtir efecto. Puede comprobar que la asignación de roles se creó con el siguiente comando:

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. Cree un secreto de texto sin formato, denominado ExampleSecret, en el almacén de claves con el comando az keyvault secret set.

    El almacén de claves puede almacenar claves, secretos y certificados. El value parámetro usa la RANDOM_STRING variable para crear un valor único para el secreto.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. Compruebe que el secreto se haya añadido al almacén de claves mediante el comando [az keyvault secret show][az-keyvault-secret-show].

    az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
    

Creación de un almacén de claves

Actualice el archivo main.tf para crear un nuevo almacén de claves con Azure control de acceso basado en rol (Azure RBAC) habilitado.

  1. Cree un nuevo almacén de claves con Azure RBAC habilitado.

    data "azurerm_client_config" "current" {}
    resource "random_string" "suffix" {
     length  = 5
     special = false
     upper   = false
    }
    resource "azurerm_key_vault" "kv" {
     name                = "akskv${random_string.suffix.result}"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     tenant_id           = data.azurerm_client_config.current.tenant_id
     sku_name            = "standard"
     enable_rbac_authorization = true
    }
    
  2. Asigne el rol de Oficial de Secretos de Key Vault.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    
  3. Cree ExampleSecret en el almacén de claves.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. Implemente la configuración. Form a Bash session (Formar una sesión de Bash), ejecute los siguientes comandos para implementar la configuración actualizada:

    terraform plan
    terraform apply
    
  5. Compruebe que ExampleSecret se agregó al almacén de claves mediante el comando [az keyvault secret show][az-keyvault-secret-show]. Sustituya <keyvault-name> por el nombre del almacén de claves que ha creado en su configuración de Terraform.

    az keyvault secret show \
     --vault-name <keyvault-name> \
     --name ExampleSecret
    

Actualizar la bóveda de claves existente

Actualice el archivo main.tf para modificar un almacén de claves existente con el control de acceso basado en roles de Azure (Azure RBAC) habilitado.

  1. Actualice el almacén de claves existente para habilitar Azure RBAC.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. Asignar un rol y añadir un secreto.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  3. Implemente la configuración. Form a Bash session (Formar una sesión de Bash), ejecute los siguientes comandos para implementar la configuración actualizada:

    terraform plan
    terraform apply
    

Limpieza de recursos

Si va al siguiente artículo y necesita estos recursos, omita los pasos siguientes. De lo contrario, si ha terminado y no tiene previsto continuar con el siguiente artículo, debe eliminar los recursos creados en este artículo para evitar costos innecesarios.

  1. Quite las credenciales del clúster del archivo .kube/config local.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Elimine el grupo de recursos y todos los recursos que contiene, incluidos los recursos del grupo de recursos del nodo (MC_) mediante el az group delete comando .

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

El terraform destroy comando quita todos los recursos definidos en el archivo de estado y configuración de Terraform actual. Ejecute este comando solo desde el directorio de trabajo usado para este artículo.

Advertencia

Si está trabajando con recursos existentes o de producción, revise el plan de ejecución cuidadosamente antes de ejecutar:

terraform plan -destroy

Evite ejecutar terraform destroy en la infraestructura compartida o importada, a menos que esté seguro de que es seguro eliminarla. Para obtener más información, consulte la documentación de Terraform para el comando terraform destroy .

  1. Quite las credenciales del clúster del archivo .kube/config local.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Ejecute el siguiente comando para quitar los recursos creados en este artículo:

    terraform destroy
    

Pasos siguientes

En este artículo, ha aprendido a usar el proveedor de Azure Key Vault para el controlador CSI de almacén de secretos con un clúster de AKS. Ahora debe proporcionar una identidad para acceder a Azure Key Vault. Para saber cómo, avance al siguiente artículo.