Compartir a través de


Use el proveedor de Azure Key Vault con el controlador CSI de Secrets Store para Kubernetes

Se aplica a: AKS en Windows Server

El controlador se CSI de almacén de secretos de Kubernetes integra los almacenes de secretos en Kubernetes mediante un volumen de Container Storage Interface (CSI). Si integra el controlador CSI del almacén de secretos en AKS en Windows Server, puede montar secretos, claves y certificados como volumen. Los datos se montan en el sistema de archivos del contenedor.

Con el controlador CSI de Secrets Store, también puede integrar un almacén de claves en uno de los proveedores admitidos, como Azure Key Vault.

Antes de empezar

Asegúrese de que cumple los siguientes requisitos previos antes de empezar:

  • Una cuenta y una suscripción de Azure.
  • Una implementación existente de AKS en Windows Server con un clúster de cargas de trabajo existente. Si no tiene una implementación, siga este Inicio rápido para implementar un host de AKS y un clúster de cargas de trabajo.
  • Si ejecuta clústeres Linux, deben estar en la versión Linux 1.16.0 o posterior.
  • Si ejecuta clústeres Windows, deben estar en la versión Windows 1.18.0 o posterior.
  • Asegúrese de haber completado las siguientes instalaciones:

acceder a los clústeres mediante kubectl

Ejecute el siguiente comando para acceder a su clúster usando kubectl. En el comando, reemplace el valor de -name con el nombre de su clúster existente. El nombre de su clúster usa el archivo kubeconfig especificado del clúster como el archivo kubeconfig predeterminado para kubectl:

Get-AksHciCredential -name mycluster

Instalación del controlador CSI de Secrets Store

Para instalar el controlador CSI de Secrets Store, ejecute el siguiente comando de Helm:

helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts

El siguiente comando instala tanto el controlador CSI de Secrets Store como el proveedor de Azure Key Vault:

helm install csi csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system

Nota

Debe instalar el controlador CSI de Secrets Store y el proveedor de Azure Key Vault en el espacio de nombres kube-system. Esta guía usa el espacio de nombres kube-system para todas las instancias.

Compruebe que el controlador CSI de Secrets Store y el proveedor de Azure Key Vault se hayan instalado correctamente

Revise los pods en ejecución para confirmar que el controlador CSI de Secrets Store y el proveedor de Azure Key Vault se instalaron correctamente, mediante los siguientes comandos:

  • Para verificar que el controlador CSI de Secrets Store está instalado, ejecute este comando:

    kubectl get pods -l app=secrets-store-csi-driver -n kube-system
    

    Ejemplo:

    NAME                             READY   STATUS    RESTARTS   AGE
    secrets-store-csi-driver-spbfq   3/3     Running   0          3h52m
    
  • Para verificar que el proveedor de Azure Key Vault está instalado, ejecute este comando:

    kubectl get pods -l app=csi-secrets-store-provider-azure -n kube-system
    

    Ejemplo:

    NAME                                         READY   STATUS    RESTARTS   AGE
    csi-csi-secrets-store-provider-azure-tpb4j   1/1     Running   0          3h52m
    

Agregue secretos en un Azure Key Vault.

Necesita un recurso de Azure Key Vault que contenga los datos de los secretos. Puede usar un recurso de Azure Key Vault existente o crear uno nuevo.

Si necesita crear un recurso de Azure Key Vault, ejecute el siguiente comando. Asegúrese de haber iniciado sesión ejecutando az login con sus credenciales de Azure. Luego, cambie los siguientes valores según su entorno:

az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l eastus

Azure Key Vault puede almacenar claves, secretos y certificados. En el ejemplo siguiente, se configura un secreto de texto sin formato denominado ExampleSecret:

az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSHCIExampleSecret

Cree una identidad en Azure

Use una entidad de servicio para acceder a la instancia de Azure Key Vault creada en el paso anterior. Debe registrar la salida al ejecutar los comandos siguientes. Use tanto el secreto de cliente como el ID de cliente en los próximos pasos.

Proporcione el secreto de cliente ejecutando el siguiente comando:

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription-id> --name http://secrets-store-test --query 'password' -otsv

Proporcione el ID de cliente ejecutando el siguiente comando:

az ad sp show --id http://secrets-store-test --query 'appId' -otsv

Proporcione la identidad para acceder a Azure Key Vault

Use los valores del paso anterior para establecer permisos como se muestra en el siguiente comando:

az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <client-id>

Cree el secreto de Kubernetes con credenciales

Para crear el secreto de Kubernetes con las credenciales de la entidad de servicio, ejecute el siguiente comando. Reemplace los siguientes valores por el ID de cliente y el secreto de cliente adecuados del paso anterior:

kubectl create secret generic secrets-store-creds --from-literal clientid=<client-id> --from-literal clientsecret=<client-secret>

De forma predeterminada, el proveedor del Secret Store ha filtrado los secretos con inspección habilitada. Puede permitir que el comando encuentre el secreto en la configuración predeterminada agregando la etiqueta secrets-store.csi.k8s.io/used=true al secreto:

kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true

Creación y aplicación de un objeto SecretProviderClass personalizado

Para usar y configurar el controlador CSI de Secrets Store en su clúster de Kubernetes, cree un recurso personalizado SecretProviderClass. Asegúrese de que la objects matriz coincide con los objetos almacenados en la instancia de Azure Key Vault:

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <keyvault-name>                  # The name of the Azure key vault
  namespace: kube-system
spec:
  provider: azure
  parameters:
    keyvaultName: "<keyvault-name>"       # The name of the Azure key vault
    useVMManagedIdentity: "false"         
    userAssignedIdentityID: "false" 
    cloudName: ""                         # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud 
    objects:  |
      array:
        - |
          objectName: <secret-name>       # In this example, 'ExampleSecret'   
          objectType: secret              # Object types: secret, key or cert
          objectVersion: ""               # [OPTIONAL] object versions, default to latest if empty
    tenantId: "<tenant-id>"               # The tenant ID containing the Azure Key Vault instance

Aplicación de SecretProviderClass al clúster

Para implementar el SecretProviderClass que creó en el paso anterior, use el siguiente comando:

kubectl apply -f ./new-secretproviderclass.yaml

Actualización y aplicación del archivo YAML de implementación del clúster

Para asegurarse de que el clúster use el nuevo recurso personalizado, actualice el archivo YAML de implementación. Por ejemplo:

kind: Pod
apiVersion: v1
metadata:
  name: busybox-secrets-store-inline
spec:
  containers:
  - name: busybox
    image: k8s.gcr.io/e2e-test-images/busybox:1.29
    command:
      - "/bin/sleep"
      - "10000"
    volumeMounts:
    - name: secrets-store-inline
      mountPath: "/mnt/secrets-store"
      readOnly: true
  volumes:
    - name: secrets-store-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "<keyvault-name>"
        nodePublishSecretRef:                       # Only required when using service principal mode
          name: secrets-store-creds                 # Only required when using service principal mode

A continuación, aplique el archivo YAML de implementación actualizado al clúster:

kubectl apply -f ./my-deployment.yaml 

Validación de la implementación del almacén de secretos

Para mostrar los secretos que se mantienen en secrets-store, ejecute el siguiente comando:

kubectl exec busybox-secrets-store-inline --namespace kube-system -- ls /mnt/secrets-store/

La salida debe mostrar el nombre del secreto. En este ejemplo, se muestra la siguiente salida:

ExampleSecret

Para mostrar el secreto de prueba que se mantiene en secrets-store, ejecute el siguiente comando:

kubectl exec busybox-secrets-store-inline --namespace kube-system -- cat /mnt/secrets-store/ExampleSecret 

La salida debe mostrar el valor del secreto. En este ejemplo, se muestra la siguiente salida:

MyAKSHCIExampleSecret

Pasos siguientes