Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
ConfigMapo unSecretcomo un montaje de volumen de tiposubPathno 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-xxxxxen 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
- Si usa clústeres aislados de red, la recomendación es configurar el punto de conexión privado para acceder a Azure Key Vault.
- Si el clúster tiene un tipo
userDefinedRoutingde salida y usa un dispositivo de firewall que puede controlar el tráfico saliente en función de los nombres de dominio, como Azure Firewall, asegúrese de que se permiten las reglas de red de salida y los FQDN necesarios. - Si restringe la entrada al clúster, asegúrese de que los puertos 9808 y 8095 estén abiertos.
Funciones
- En este artículo se usa el rol Oficial de secretos de Key Vault para conceder permiso a su cuenta para crear un secreto en el almacén de claves.
- En el artículo para proporcionar acceso a Azure Key Vault, la identidad utilizada con
SecretProviderClassnecesita tener el rol de Usuario de Certificados de Key Vault para acceder a loskeycertificateo , y el rol de Usuario de Secretos de Key Vault para acceder a lossecret.
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.
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=eastus2Los 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_NAMEde la variablemyKeyVaultcon la cadena de 10 caracteres de la variableRANDOM_STRING.Cree un grupo de recursos de Azure con el comando
az group create.az group create --name $RESOURCE_GROUP --location $LOCATIONCree 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 createcon el parámetro--enable-addons azure-keyvault-secrets-provider.El parámetro
--enable-addonscrea una identidad administrada, denominadaazurekeyvaultsecretsprovider-xxxxy 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-keysSugerencia
Si desea usar la identificación de carga de trabajo de Microsoft Entra, el comando
az aks createdebe incluir los parámetros--enable-oidc-issuery--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.
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" }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 } }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.
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_NAMEvariable sin usar laRANDOM_STRINGvariable .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_NAMEde la variablemyKeyVaultcon la cadena de 10 caracteres de la variableRANDOM_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=eastus2Actualice 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-addonsy habilite el complementoazure-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_GROUPDespués de habilitar el proveedor de secretos de Azure Key Vault, AKS crea una identidad administrada denominada
azurekeyvaultsecretsprovider-xxxxque 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.
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 } }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.
Compruebe que se creó la identidad administrada y se asignó al clúster mediante el
az aks showcomando .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
resourceIdpropiedad muestra el grupo de recursos y el nombreazurekeyvaultsecretsprovider-myaksclusterde la identidad .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/virtualMachineScaleSetsy la propiedaduserAssignedIdentitiescon un identificador de recurso paraazurekeyvaultsecretsprovider-myaksclusterque 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
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_GROUPCompruebe que la instalación ha finalizado con el comando
kubectl get pods, que enumera todos los pods con las etiquetassecrets-store-csi-driverysecrets-store-provider-azureen el espacio de nombreskube-system.kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wideLa marca
-o wideincluye 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
Ejecute el comando
az keyvault showpara comprobar que el almacén de claves tiene habilitado Azure RBAC.az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.enableRbacAuthorizationLa salida debe ser
true.Agregue una asignación de roles para la cuenta de usuario al ámbito del almacén de claves mediante el
az role assignment createcomando 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 UserLa 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 tableCree un secreto de texto sin formato, denominado
ExampleSecret, en el almacén de claves con el comandoaz keyvault secret set.El almacén de claves puede almacenar claves, secretos y certificados. El
valueparámetro usa laRANDOM_STRINGvariable para crear un valor único para el secreto.az keyvault secret set \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret \ --value MyAKSExampleSecret${RANDOM_STRING}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.
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 }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 }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 }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 applyCompruebe 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.
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 }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 }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.
Quite las credenciales del clúster del archivo .kube/config local.
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTElimine el grupo de recursos y todos los recursos que contiene, incluidos los recursos del grupo de recursos del nodo (
MC_) mediante elaz group deletecomando .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 .
Quite las credenciales del clúster del archivo .kube/config local.
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTEjecute 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.