Protege los secretos de las aplicaciones con Vault Dedicated y External Secrets Operator

En este tutorial, aprenderás a utilizar IBM Cloud Vault Enterprise para gestionar secretos de las aplicaciones que se ejecutan en tu clúster de IBM Cloud Kubernetes Service mediante la herramienta de código abierto External Secrets Operator.

Eres desarrollador en una organización y tu equipo utiliza Kubernetes Service para implementar aplicaciones y servicios en contenedores en IBM Cloud. Si desea almacenar los secretos de su aplicación en Vault Dedicated, el servicio gestionado de HashiCorp Vault de IBM Cloud, podrá cifrarlos en reposo, gestionar su ciclo de vida y rotarlos fácilmente.

Con Vault Dedicated y External Secrets Operator, puedes centralizar y proteger los secretos que utilizan las aplicaciones que se ejecutan en tus clústeres de Kubernetes. En lugar de introducir tus secretos en el momento de la implementación, puedes configurar tus aplicaciones para que recuperen de forma segura los secretos de Vault Dedicated en tiempo de ejecución. Por ejemplo, considere el siguiente escenario:

El diagrama muestra el flujo básico entre Secrets Manager y su clúster de Kubernetes. Flujo" caption-side="bottom"} de secretos{: caption="externos

  1. Como desarrollador, utilizas Vault Dedicated para almacenar un secreto de una aplicación que deseas implementar en un clúster de Kubernetes.
  2. Debes configurar el External Secrets Operator para que se conecte a tu instancia de Vault Dedicated utilizando el proveedor HashiCorp Vault.
  3. El controlador de secretos externos capta los objetos ExternalSecrets del archivo de configuración que ha definido utilizando la API de Kubernetes.
  4. En el momento de la ejecución de la aplicación, el controlador recupera los datos secretos de Vault Dedicated y convierte los objetos ExternalSecrets en secretos de Kubernetes s para su clúster.

Este caso de ejemplo presenta una herramienta de terceros que puede afectar a la capacidad de conformidad de las cargas de trabajo que se ejecutan en el clúster de Kubernetes. Si añades una herramienta de la comunidad o de terceros, ten en cuenta que eres responsable de garantizar el cumplimiento normativo de tus aplicaciones y de colaborar con el proveedor correspondiente para resolver cualquier problema. Para obtener más información, consulte Sus responsabilidades con el uso de IBM Cloud Kubernetes Service.

Antes de empezar

Antes de empezar, asegúrese de que tiene Acceso a la plataforma Administrador para poder crear credenciales de cuenta y recursos de suministro. También necesita los siguientes requisitos previos:

jq le ayuda a porcionar y filtrar datos JSON. Utilice jq en esta guía de aprendizaje para capturar y utilizar variables de entorno almacenadas.

Configurar el entorno

Para trabajar con Vault Dedicated y Kubernetes Service, debes crear un clúster en tu cuenta de IBM Cloud y configurar el acceso a tu instancia de Vault Dedicated.

Creación de un clúster de Kubernetes

Crea un clúster de Kubernetes en tu cuenta de IBM Cloud.

  1. Desde la línea de mandatos, inicie la sesión en IBM Cloud mediante la CLI de IBM Cloud.

    ibmcloud login
    

    Si el inicio de sesión falla, ejecute el mandato ibmcloud login --sso para volver a intentarlo. Se requiere el parámetro --sso para iniciar sesión con un ID federado. Si se utiliza esta opción, vaya al enlace que se muestra en la salida de la CLI para generar una contraseña de uso único.

  2. Selecciona la cuenta, la región y el grupo de recursos en los que deseas crear tu clúster.

    ibmcloud target -r REGION -g RESOURCE_GROUP
    

    Sustituye REGION por tu región de destino (por ejemplo, au-syd) y RESOURCE_GROUP por el nombre de tu grupo de recursos.

  3. Cree un clúster de Kubernetes.

    ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name eso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_ID
    

    Sustituye ZONE, FLAVOR, VPC_ID, y SUBNET_ID por tus valores. El aprovisionamiento de su clúster de Kubernetes tarda entre 5 y 15 minutos en completarse.

  4. Antes de continuar con el siguiente paso, comprueba que tu clúster se haya aprovisionado correctamente.

    ibmcloud ks worker ls --cluster eso-test-cluster
    

    Cuando el nodo de trabajador finaliza el suministro, el estado cambia a Listo.

  5. Establezca el contexto para el clúster de Kubernetes en la CLI.

    ibmcloud ks cluster config --cluster eso-test-cluster
    
  6. Verifique que los mandatos kubectl se ejecutan correctamente y que el contexto de Kubernetes establecido es su clúster.

    kubectl config current-context
    

Prepara tu instancia dedicada de Vault

Configura tu instancia dedicada de Vault para empezar a trabajar con secretos y configura la autenticación para External Secrets Operator.

  1. Exporta las variables de entorno junto con los datos de tu instancia de Vault Dedicated.

    export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud"
    export VAULT_DEDICATED_NAMESPACE="admin"
    

    Sustituye <your-vault_dedicated-instance-id> por el ID de tu instancia de Vault Dedicated y <region> por tu región de Vault Dedicated (por ejemplo, au-syd).

  2. Obtén un token de Vault desde tu instancia dedicada de Vault.

    Puedes generar un token desde la interfaz de usuario de Vault Dedicated o mediante la CLI de Vault. Para el desarrollo y las pruebas, puedes utilizar un token de root. Para el entorno de producción, crea un token con las políticas adecuadas.

    export VAULT_TOKEN="<your-vault-token>"
    
  3. Verifica el punto de montaje del motor de secretos KV en Vault Dedicated.

    Las instancias dedicadas de Vault tienen el motor de secretos KV v2 montado de forma kv/ predeterminada. Puede comprobarlo en la interfaz de usuario de Vault Dedicated o mostrando una lista de los puntos de montaje.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/sys/mounts | jq
    
  4. Crea un secreto de prueba en Vault Dedicated.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"data":{"username":"user123","password":"cloudy-rainy-coffee-book"}}' \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password
    

    Ten en cuenta que Vault Dedicated utiliza kv/ como ruta de montaje para el motor de secretos KV.

  5. Comprueba que se haya creado el secreto.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password | jq
    

Instalar el operador External Secrets

Instala External Secrets Operator mediante Helm.

  1. Añade el repositorio External Secrets Helm.

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    
  2. Instalar el operador External Secrets.

    helm install external-secrets \
      external-secrets/external-secrets \
      --namespace external-secrets \
      --create-namespace \
      --set installCRDs=true
    
  3. Verifique la instalación.

    kubectl get pods -n external-secrets
    

    Espera hasta que todos los pods estén en estado Running.

  4. Comprueba que las definiciones de recursos personalizados (CRD) estén instaladas.

    kubectl get crd | grep external-secrets
    

    Deberías ver CRD como secretstores, clustersecretstores, y externalsecrets.

Configurar SecretStore para Vault Dedicated

Crea un recurso SecretStore que defina cómo se conecta External Secrets Operator a tu instancia de Vault Dedicated.

  1. Crea un secreto de Kubernetes con tu token de Vault.

    kubectl create secret generic vault-token \
      --namespace external-secrets \
      --from-literal=token="$VAULT_TOKEN"
    
  2. Cree un archivo secretstore.yaml.

    touch secretstore.yaml
    
  3. Añade la siguiente configuración al archivo.

    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: vault-dedicated-secretstore
      namespace: default
    spec:
      provider:
        vault:
          server: "<VAULT_DEDICATED_ADDR>"
          path: "kv"
          version: "v2"
          namespace: "admin"
          auth:
            tokenSecretRef:
              name: "vault-token"
              key: "token"
              namespace: "external-secrets"
    

    Sustituye <VAULT_DEDICATED_ADDR> por la dirección de tu instancia de Vault Dedicated. Ten en cuenta que path está configurado en kv, que es el punto de montaje predeterminado para el motor de secretos KV en Vault Dedicated.

  4. Aplica la configuración SecretStore.

    kubectl apply -f secretstore.yaml
    
  5. Comprueba que el SecretStore sea válido.

    kubectl get secretstore vault-dedicated-secretstore -n default
    kubectl describe secretstore vault-dedicated-secretstore -n default
    

    El estado debería aparecer como Válido si la conexión a Vault Dedicated se ha establecido correctamente.

Crear un ExternalSecret

Crea un recurso ExternalSecret que defina qué secretos se deben recuperar de Vault Dedicated.

  1. Crea un archivo externalsecret.yaml.

    touch externalsecret.yaml
    
  2. Añade la siguiente configuración.

    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: vault-dedicated-app-secret
      namespace: default
    spec:
      refreshInterval: 1h
      secretStoreRef:
        name: vault-dedicated-secretstore
        kind: SecretStore
      target:
        name: my-k8s-secret
        creationPolicy: Owner
      data:
      - secretKey: username
        remoteRef:
          key: example_username_password
          property: username
      - secretKey: password
        remoteRef:
          key: example_username_password
          property: password
    

    El determina refreshInterval la frecuencia con la que External Secrets Operator consulta Vault Dedicated en busca de actualizaciones. El valor predeterminado y recomendado es de 1 hora.

  3. Aplica la configuración ExternalSecret.

    kubectl apply -f externalsecret.yaml
    
  4. Comprueba que el operador de secretos externos haya obtenido el secreto de Vault Dedicated.

    kubectl get secret my-k8s-secret -o json | jq '.data | map_values(@base64d)'
    

    Salida de ejemplo:

    {
        "password": "cloudy-rainy-coffee-book",
        "username": "user123"
    }
    

    Satisfactorio. Ahora puedes recuperar datos confidenciales de tu instancia de Vault Dedicated y utilizarlos en tu clúster de Kubernetes.

Despliegue una aplicación en el clúster

Por último, puede implementar en su clúster una aplicación que utilice el secreto de Vault Dedicated. En el momento de la ejecución de la aplicación, los datos secretos que se obtienen de Vault Dedicated se convierten en un secreto de Kubernetes que puede utilizar tu clúster.

  1. Crea una implementación de prueba sencilla que utilice el secreto.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-app
      namespace: default
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600']
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: password
    EOF
    
  2. Comprueba los registros del pod para verificar que se ha inyectado el secreto.

    kubectl logs test-app -n default
    

    Salida esperada:

    Username: user123
    Password: cloudy-rainy-coffee-book
    

¿Buscas más ejemplos sobre cómo implementar una aplicación? Consulta Implementación de aplicaciones nativas de Kubernetes en clústeres para obtener más información sobre la implementación de aplicaciones.

(Opcional) Limpiar los recursos

Si ya no necesita los recursos que ha creado en esta guía de aprendizaje, puede completar los pasos siguientes para eliminarlos de su cuenta.

  1. Suprima el clúster de Kubernetes de prueba.

    ibmcloud ks cluster rm --cluster eso-test-cluster
    
  2. Limpiar los secretos de prueba en Vault dedicado.

    curl -k -X DELETE \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
    

Notas de interés

Al crear tus documentos YAML, ten en cuenta las siguientes consideraciones:

  1. Intervalo de sondeo: Por defecto, el intervalo de sondeo está establecido en 1 hora (refreshInterval: 1h) y es el valor recomendado. Puedes modificar este valor en la plantilla ExternalSecret. El intervalo puede expresarse en unidades de s, m, o h.

  2. Ruta de montaje de Vault Dedicated: Vault Dedicated utiliza kv/ como ruta de montaje predeterminada para el motor de secretos KV, en lugar de secret/. Asegúrate de especificar la ruta correcta en la configuración de SecretStore.

  3. Espacios de nombres de Vault Dedicated: Vault Dedicated utiliza los espacios de nombres de Vault Enterprise. El espacio de nombres predeterminado es admin. Asegúrese de especificar el espacio de nombres correcto en la configuración de SecretStore.

  4. Métodos de autenticación: En este tutorial se utiliza la autenticación mediante token para mayor simplicidad. En entornos de producción, se recomienda utilizar los métodos de autenticación AppRole o Kubernetes para garantizar una mayor seguridad.

  5. TLS Consideraciones: Vault Dedicated requiere conexiones de tipo TLS. En entornos de producción, asegúrese de que se haya configurado correctamente la validación de certificados en lugar de utilizar skipTLSVerify.

Próximos pasos

¡Buen trabajo! En este tutorial has aprendido a configurar Vault Dedicated para introducir de forma segura los secretos de la aplicación en tu clúster de Kubernetes mediante External Secrets Operator. Echa un vistazo a más recursos que te ayudarán a dar tus primeros pasos con Vault Dedicated.