Sécurisez les secrets de vos applications avec Vault Dedicated et External Secrets Operator

Dans ce tutoriel, vous apprendrez à utiliser IBM Cloud Vault Enterprise pour gérer les secrets des applications exécutées dans votre cluster IBM Cloud Kubernetes Service à l'aide de l'outil open source External Secrets Operator.

Vous êtes développeur au sein d’une entreprise, et votre équipe utilise l’ Kubernetes Service pour déployer des applications et des services conteneurisés sur IBM Cloud. Vous souhaitez stocker les secrets de votre application dans Vault Dedicated, le service de gestion d' HashiCorp Vault s () d' IBM Cloud, où vous pouvez les chiffrer au repos, gérer leur cycle de vie et les renouveler facilement.

Grâce à Vault Dedicated et à External Secrets Operator, vous pouvez centraliser et sécuriser les secrets utilisés par les applications qui s'exécutent dans vos clusters Kubernetes. Plutôt que d'injecter vos secrets au moment du déploiement, vous pouvez configurer vos applications pour qu'elles récupèrent vos secrets en toute sécurité depuis Vault Dedicated au moment de l'exécution. Vous pouvez par exemple, envisager le scénario suivant :

Le schéma illustre le flux de base entre Secrets Manager et votre cluster Kubernetes.
Flux
des secrets externes

  1. En tant que développeur, vous utilisez Vault Dedicated pour stocker un secret destiné à une application que vous souhaitez déployer dans un cluster d' Kubernetes.
  2. Vous configurez l’External Secrets Operator pour qu’il se connecte à votre instance Vault Dedicated à l’aide du fournisseur HashiCorp Vault.
  3. Le contrôleur External Secrets extrait les objets ExternalSecrets dans le fichier de configuration que vous avez défini à l'aide de l'API Kubernetes.
  4. Au moment de l'exécution de l'application, le contrôleur récupère les données secrètes depuis Vault Dedicated et convertit les objets ExternalSecrets en secrets Kubernetes pour votre cluster.

Ce scénario présente un outil tiers qui peut avoir un impact sur la conformité des charges de travail exécutées dans votre cluster Kubernetes. Si vous ajoutez un outil communautaire ou tiers, n'oubliez pas que vous êtes responsable du maintien de la conformité de vos applications et que vous devez collaborer avec le fournisseur concerné pour résoudre tout problème éventuel. Pour plus d'informations, voir Vos responsabilités d'utilisation de IBM Cloud Kubernetes Service.

Avant de commencer

Avant de commencer, assurez-vous d'avoir accès à la plateforme Administrateur pour pouvoir créer des données d'identification de compte et des ressources de mise à disposition. Vous devez également satisfaire les prérequis suivants :

jqjq vous aide à scinder et filtrer les données JSON. Vous utilisez jq dans ce tutoriel pour choisir et utiliser des variables d'environnement stockées.

Configuration de votre environnement

Pour utiliser Vault Dedicated et l' Kubernetes Service, vous devez créer un cluster dans votre compte IBM Cloud et configurer l'accès à votre instance Vault Dedicated.

Création d'un cluster Kubernetes

Créez un cluster Kubernetes dans votre compte IBM Cloud.

  1. A partir de la ligne de commande, connectez-vous à IBM Cloud via l'interface de ligne de commande IBM Cloud.

    ibmcloud login
    

    Si la connexion échoue, exécutez la commande ibmcloud login --sso pour réessayer. Le paramètre --sso est requis lorsque vous vous connectez avec un ID fédéré. Si cette option est utilisée, allez sur le lien répertorié dans la sortie d'interface de ligne de commande pour générer un code d'accès unique.

  2. Sélectionnez le compte, la région et le groupe de ressources dans lesquels vous souhaitez créer votre cluster.

    ibmcloud target -r REGION -g RESOURCE_GROUP
    

    Remplacez REGION par votre région cible (par exemple, au-syd) et RESOURCE_GROUP par le nom de votre groupe de ressources.

  3. Créez un cluster 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
    

    Remplacez ZONE, FLAVOR, VPC_ID, et SUBNET_ID par vos valeurs. La mise en place de votre cluster Kubernetes prend entre 5 et 15 minutes.

  4. Avant de passer à l'étape suivante, vérifiez que votre cluster a bien été provisionné.

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

    Lorsque la mise à disposition de votre noeud worker est terminée, l'état passe à Prêt.

  5. Définissez le contexte pour votre cluster Kubernetes dans l'interface de ligne de commande.

    ibmcloud ks cluster config --cluster eso-test-cluster
    
  6. Vérifiez que les commandes kubectl s'exécutent correctement et que le contexte Kubernetes est défini sur votre cluster.

    kubectl config current-context
    

Préparez votre instance Vault Dedicated

Configurez votre instance Vault Dedicated pour commencer à utiliser des secrets et configurez l'authentification pour External Secrets Operator.

  1. Exportez les variables d'environnement avec les informations relatives à votre instance Vault Dedicated.

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

    Remplacez <your-vault_dedicated-instance-id> par l'ID de votre instance Vault Dedicated et <region> par votre région Vault Dedicated (par exemple, au-syd).

  2. Récupérez un jeton Vault à partir de votre instance Vault Dedicated.

    Vous pouvez générer un jeton à partir de l'interface utilisateur dédiée à Vault ou à l'aide de la ligne de commande Vault (CLI). Pour le développement et les tests, vous pouvez utiliser un jeton root. Pour la mise en production, créez un jeton avec les politiques appropriées.

    export VAULT_TOKEN="<your-vault-token>"
    
  3. Vérifiez le point de montage du moteur de secrets KV dans Vault Dedicated.

    Les instances dédiées Vault intègrent par kv/ défaut le moteur de secrets KV v2. Vous pouvez vérifier cela dans l'interface utilisateur de Vault Dedicated ou en répertoriant les montages.

    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. Créer un secret de test dans 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
    

    Notez que Vault Dedicated utilise kv/ comme chemin de montage pour le moteur de secrets KV.

  5. Vérifiez que la clé secrète a bien été créée.

    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
    

Installer l'opérateur External Secrets

Installez l'opérateur External Secrets à l'aide de Helm.

  1. Ajouter le référentiel External Secrets Helm.

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    
  2. Installer l'opérateur External Secrets.

    helm install external-secrets \
      external-secrets/external-secrets \
      --namespace external-secrets \
      --create-namespace \
      --set installCRDs=true
    
  3. Vérification de l'installation.

    kubectl get pods -n external-secrets
    

    Attendez que tous les pods soient à l'état Running.

  4. Vérifiez que les définitions de ressources personnalisées (CRD) sont installées.

    kubectl get crd | grep external-secrets
    

    Vous devriez voir des CRD tels que secretstores, clustersecretstores, et externalsecrets.

Configurer SecretStore pour Vault Dedicated

Créez une ressource SecretStore qui définit comment External Secrets Operator se connecte à votre instance Vault Dedicated.

  1. Créez un secret Kubernetes à l'aide de votre jeton Vault.

    kubectl create secret generic vault-token \
      --namespace external-secrets \
      --from-literal=token="$VAULT_TOKEN"
    
  2. Créez un fichier secretstore.yaml.

    touch secretstore.yaml
    
  3. Ajoutez la configuration suivante au fichier.

    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"
    

    Remplacez <VAULT_DEDICATED_ADDR> par l'adresse de votre instance Vault Dedicated. Notez que le path est défini sur kv, qui est le point de montage par défaut pour le moteur de secrets KV dans Vault Dedicated.

  4. Appliquez la configuration SecretStore.

    kubectl apply -f secretstore.yaml
    
  5. Vérifiez que l' SecretStore est valide.

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

    Le statut doit indiquer Valide si la connexion à Vault Dedicated a abouti.

Créer une page ExternalSecret

Créez une ressource ExternalSecret qui définit les secrets à récupérer depuis Vault Dedicated.

  1. Créer un fichier externalsecret.yaml.

    touch externalsecret.yaml
    
  2. Ajoutez la configuration suivante.

    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
    

    Le paramètre détermine refreshInterval la fréquence à laquelle External Secrets Operator interroge Vault Dedicated pour vérifier la présence de mises à jour. La valeur par défaut et recommandée est de 1 heure.

  3. Appliquez la configuration ExternalSecret.

    kubectl apply -f externalsecret.yaml
    
  4. Vérifiez que l’opérateur External Secrets a récupéré le secret depuis Vault Dedicated.

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

    Exemple de sortie :

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

    Réussite ! Vous pouvez désormais récupérer des données confidentielles depuis votre instance Vault Dedicated et les utiliser dans votre cluster d' Kubernetes.

Déployer une application dans le cluster

Enfin, vous pouvez déployer dans votre cluster une application qui utilise le secret Vault Dedicated. Au moment de l'exécution de l'application, les données confidentielles récupérées depuis Vault Dedicated sont converties en un secret Kubernetes pouvant être utilisé par votre cluster.

  1. Créez un déploiement de test simple utilisant le secret.

    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. Vérifiez les journaux du pod pour vous assurer que le secret a bien été injecté.

    kubectl logs test-app -n default
    

    Sortie attendue :

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

Vous cherchez d'autres exemples sur la manière de déployer une application? Consultez la documentation Déploiement d'applications natives d' Kubernetes dans des clusters pour en savoir plus sur le déploiement d'applications.

(Facultatif) Nettoyer les ressources

Si vous n'avez plus besoin des ressources créées durant ce tutoriel, vous pouvez exécuter la procédure suivante pour les retirer de votre compte.

  1. Supprimez votre cluster Kubernetes de test.

    ibmcloud ks cluster rm --cluster eso-test-cluster
    
  2. Nettoyer les secrets de test dans Vault dédié.

    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
    

Remarques d'intérêt

Lorsque vous créez vos documents YAML, gardez à l'esprit les points suivants :

  1. Intervalle d'interrogation: par défaut, l'intervalle d'interrogation est défini sur 1 heure (refreshInterval: 1h) et constitue la valeur recommandée. Vous pouvez modifier cette valeur dans le modèle ExternalSecret. L'intervalle peut être exprimé en unités de s, m, ou h.

  2. Chemin de montage de Vault Dedicated: Vault Dedicated utilise kv/ comme chemin de montage par défaut pour le moteur de secrets KV, et non secret/. Veillez à indiquer le chemin d'accès correct dans la configuration de votre service SecretStore.

  3. Espaces de noms Vault Dedicated: Vault Dedicated utilise les espaces de noms de Vault Enterprise. L'espace de noms par défaut est admin. Veillez à spécifier l'espace de noms correct dans la configuration de votre SecretStore.

  4. Méthodes d'authentification: par souci de simplicité, ce tutoriel utilise l'authentification par jeton. Pour les environnements de production, envisagez d'utiliser les méthodes d'authentification AppRole ou Kubernetes afin de renforcer la sécurité.

  5. TLS Points à prendre en compte: Vault Dedicated nécessite des connexions de type TLS. Dans les environnements de production, veillez à ce que la validation correcte des certificats soit configurée au lieu d'utiliser skipTLSVerify.

Etapes suivantes

Bon travail ! Dans ce tutoriel, vous avez appris à configurer Vault Dedicated pour fournir en toute sécurité des secrets d'application à votre cluster Kubernetes à l'aide de l'opérateur External Secrets. Découvrez d'autres ressources pour vous aider à vous lancer avec Vault Dedicated.