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 :
- 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.
- Vous configurez l’External Secrets Operator pour qu’il se connecte à votre instance Vault Dedicated à l’aide du fournisseur HashiCorp Vault.
- Le contrôleur External Secrets extrait les objets
ExternalSecretsdans le fichier de configuration que vous avez défini à l'aide de l'API Kubernetes. - 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
ExternalSecretsen 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 :
- Téléchargez et installez l'interface de ligne de commande IBM Cloud.
- Installez l'interface de ligne de commande(CLI)d' Kubernetes(
kubectl). - Installer Helm 3.x.
- Télécharger et installer
jq.
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.
- Une instance dédiée Vault provisionnée dans votre compte IBM Cloud. Pour plus d'informations, consultez la section Configuration de votre instance Vault Dedicated.
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.
-
A partir de la ligne de commande, connectez-vous à IBM Cloud via l'interface de ligne de commande IBM Cloud.
ibmcloud loginSi la connexion échoue, exécutez la commande
ibmcloud login --ssopour réessayer. Le paramètre--ssoest 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. -
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_GROUPRemplacez
REGIONpar votre région cible (par exemple,au-syd) etRESOURCE_GROUPpar le nom de votre groupe de ressources. -
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_IDRemplacez
ZONE,FLAVOR,VPC_ID, etSUBNET_IDpar vos valeurs. La mise en place de votre cluster Kubernetes prend entre 5 et 15 minutes. -
Avant de passer à l'étape suivante, vérifiez que votre cluster a bien été provisionné.
ibmcloud ks worker ls --cluster eso-test-clusterLorsque la mise à disposition de votre noeud worker est terminée, l'état passe à Prêt.
-
Définissez le contexte pour votre cluster Kubernetes dans l'interface de ligne de commande.
ibmcloud ks cluster config --cluster eso-test-cluster -
Vérifiez que les commandes
kubectls'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.
-
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). -
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>" -
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 -
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_passwordNotez que Vault Dedicated utilise
kv/comme chemin de montage pour le moteur de secrets KV. -
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.
-
Ajouter le référentiel External Secrets Helm.
helm repo add external-secrets https://charts.external-secrets.io helm repo update -
Installer l'opérateur External Secrets.
helm install external-secrets \ external-secrets/external-secrets \ --namespace external-secrets \ --create-namespace \ --set installCRDs=true -
Vérification de l'installation.
kubectl get pods -n external-secretsAttendez que tous les pods soient à l'état Running.
-
Vérifiez que les définitions de ressources personnalisées (CRD) sont installées.
kubectl get crd | grep external-secretsVous devriez voir des CRD tels que
secretstores,clustersecretstores, etexternalsecrets.
Configurer SecretStore pour Vault Dedicated
Créez une ressource SecretStore qui définit comment External Secrets Operator se connecte à votre instance Vault Dedicated.
-
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" -
Créez un fichier
secretstore.yaml.touch secretstore.yaml -
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 lepathest défini surkv, qui est le point de montage par défaut pour le moteur de secrets KV dans Vault Dedicated. -
Appliquez la configuration SecretStore.
kubectl apply -f secretstore.yaml -
Vérifiez que l' SecretStore est valide.
kubectl get secretstore vault-dedicated-secretstore -n default kubectl describe secretstore vault-dedicated-secretstore -n defaultLe 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.
-
Créer un fichier
externalsecret.yaml.touch externalsecret.yaml -
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: passwordLe paramètre détermine
refreshIntervalla 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. -
Appliquez la configuration ExternalSecret.
kubectl apply -f externalsecret.yaml -
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.
-
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 -
Vérifiez les journaux du pod pour vous assurer que le secret a bien été injecté.
kubectl logs test-app -n defaultSortie 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.
-
Supprimez votre cluster Kubernetes de test.
ibmcloud ks cluster rm --cluster eso-test-cluster -
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 :
-
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 des,m, ouh. -
Chemin de montage de Vault Dedicated: Vault Dedicated utilise
kv/comme chemin de montage par défaut pour le moteur de secrets KV, et nonsecret/. Veillez à indiquer le chemin d'accès correct dans la configuration de votre service SecretStore. -
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. -
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é.
-
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.
- Découvrez Vault Secrets Operator, l'opérateur officiel d' HashiCorp's pour l'intégration d' Kubernetes.
- Consultez la documentation du fournisseur External Secrets Operator Vault.
- Consultez la documentation dédiée à Vault pour découvrir des fonctionnalités et des configurations plus avancées.
- En savoir plus sur l’ HashiCorp Vault.