Compartir a través de


Uso del proveedor de Azure Key Vault para el controlador CSI del almacén de secretos en Red Hat OpenShift en Azure

El proveedor de Azure Key Vault para el controlador CSI del Almacén de secretos le permite que el contenido de los secretos se almacene en una instancia de Azure Key Vault y usar el controlador CSI del Almacén de secretos para montarlos en pods de Kubernetes. En este artículo se explica cómo usar el proveedor de Azure Key Vault para el controlador CSI del almacén de secretos en Red Hat OpenShift en Azure.

Nota:

Como alternativa a la solución de código abierto que se presenta en este artículo, puede usar Azure Arc para administrar los clústeres de ARO junto con su proveedor de Azure Key Vault para la extensión del controlador CSI del almacén de secretos. Microsoft admite completamente este método y se recomienda en lugar de la solución de código abierto siguiente.

Requisitos previos

Se necesitan los siguientes requisitos previos:

Establecimiento de variables de entorno

Establezca las siguientes variables que se usarán en este procedimiento:

export KEYVAULT_RESOURCE_GROUP=${AZR_RESOURCE_GROUP:-"openshift"}
export KEYVAULT_LOCATION=${AZR_RESOURCE_LOCATION:-"eastus"}
export KEYVAULT_NAME=secret-store-$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
export AZ_TENANT_ID=$(az account show -o tsv --query tenantId)

Instalación del controlador CSI del Almacén de secretos de Kubernetes

  1. Crear un proyecto de ARO; implementará el controlador CSI en este proyecto:

    oc new-project k8s-secrets-store-csi
    
  2. Establezca SecurityContextConstraints para permitir que el controlador CSI se ejecute (de lo contrario, el controlador CSI no podrá crear pods):

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Agregue el controlador CSI del almacén de secretos a los repositorios de Helm:

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Actualice los repositorios de Helm:

    helm repo update
    
  5. Instale el controlador CSI del almacén de secretos:

    helm install -n k8s-secrets-store-csi csi-secrets-store \
       secrets-store-csi-driver/secrets-store-csi-driver \
       --version v1.3.1 \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers"
    

    Opcionalmente, puede habilitar la rotación automática de secretos si agrega los parámetros siguientes al comando anterior:

    --set "syncSecret.enabled=true" --set "enableSecretRotation=true"

  6. Compruebe que se están ejecutando los DaemonSet del controlador CSI:

    kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
    

    Después de ejecutar el comando anterior, debería ver lo siguiente:

    NAME                                               READY   STATUS    RESTARTS   AGE
     csi-secrets-store-secrets-store-csi-driver-cl7dv   3/3     Running   0          57s
     csi-secrets-store-secrets-store-csi-driver-gbz27   3/3     Running   0          57s
    

Implementación del proveedor de Azure Key Vault para el controlador de CSI del almacén de secretos

  1. Agregue el repositorio de Azure Helm:

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. Actualice los repositorios de Helm locales:

    helm repo update
    
  3. Instale el proveedor CSI de Azure Key Vault:

    helm install -n k8s-secrets-store-csi azure-csi-provider \
       csi-secrets-store-provider-azure/csi-secrets-store-provider-azure \
       --set linux.privileged=true --set secrets-store-csi-driver.install=false \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers" \
       --version=v1.4.1
    
  4. Establezca SecurityContextConstraints para permitir que el controlador CSI se ejecute:

    oc adm policy add-scc-to-user privileged \
       system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
    

Creación del almacén de claves y un secreto

  1. Cree un espacio de nombres para la aplicación.

    oc new-project my-application
    
  2. Cree un almacén de claves de Azure en el grupo de recursos que contiene ARO.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. Cree un secreto en el almacén de claves.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. Cree una entidad de servicio para el almacén de claves.

    Nota:

    Si se produce un error al crear la entidad de servicio, es posible que tenga que actualizar la CLI de Azure a la versión más reciente.

    export SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --skip-assignment --name http://$KEYVAULT_NAME --query 'password' -otsv)"
    export SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name http://$KEYVAULT_NAME --query '[0].appId' -otsv)"
    
  5. Establezca una directiva de acceso para la entidad de servicio.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. Cree y etiquete un secreto para que Kubernetes lo use a fin de acceder al almacén de claves.

    kubectl create secret generic secrets-store-creds \
       -n my-application \
       --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} \
       --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
    kubectl -n my-application label secret \
       secrets-store-creds secrets-store.csi.k8s.io/used=true
    

Implementación de una aplicación que usa el controlador CSI

  1. Cree una instancia de SecretProviderClass para conceder acceso a este secreto:

    cat <<EOF | kubectl apply -f -
     apiVersion: secrets-store.csi.x-k8s.io/v1
     kind: SecretProviderClass
     metadata:
       name: azure-kvname
       namespace: my-application
     spec:
       provider: azure
       parameters:
         usePodIdentity: "false"
         useVMManagedIdentity: "false"
         userAssignedIdentityID: ""
         keyvaultName: "${KEYVAULT_NAME}"
         objects: |
           array:
             - |
               objectName: secret1
               objectType: secret
               objectVersion: ""
         tenantId: "${AZ_TENANT_ID}"
    EOF
    
  2. Cree un pod que use la instancia de SecretProviderClass creada en el paso anterior:

    cat <<EOF | kubectl apply -f -
     kind: Pod
     apiVersion: v1
     metadata:
       name: busybox-secrets-store-inline
       namespace: my-application
     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: "azure-kvname"
             nodePublishSecretRef:
               name: secrets-store-creds
    EOF
    
  3. Compruebe que el secreto se ha montado:

    kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
    

    La salida debería coincidir con lo siguiente:

    secret1
    
  4. Imprima el secreto:

    kubectl exec busybox-secrets-store-inline \
       -- cat /mnt/secrets-store/secret1
    

    La salida debería coincidir con lo siguiente:

    Hello
    

Limpieza

Desinstale el proveedor de Key Vault y el controlador CSI.

Desinstalación del proveedor de Key Vault

  1. Desinstale el gráfico de Helm:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Elimine la aplicación:

    oc delete project my-application
    
  3. Elimine el almacén de claves de Azure:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Elimine la entidad de servicio:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Desinstalación del controlador CSI del almacén de secretos de Kubernetes

  1. Elimine el controlador CSI del almacén de secretos:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Elimine SecurityContextConstraints:

    oc adm policy remove-scc-from-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver