La conservation de secrets avec Hashicorp Vault #devops
Allez, aujourd’hui, un petit article qui va faire plaisir aux devops et aux développeurs. De quoi apprendre pour renforcer vos connaissances et être au taquet lorsque vous commencerez à chercher votre prochain job. Car oui, changer de job, surtout dans nos métiers techniques, c’est parfois un peu stressant donc autant mettre toutes les chances de son côté en se démarquant.
Si vous souhaitez un travail qui vous correspond mieux, qui soit par exemple plus proche de chez vous, mieux payé, en télétravail ou tout simplement avec une meilleure ambiance, je vous invite à vous créer un compte sur la plateforme talent.io. Ça se fait en quelques clics et vous recevrez ensuite des offres de la part d’entreprises qui correspondent à vos critères et qui affichent le salaire d’entrée de jeu ! talent.io c’est LE moyen le plus simple et le plus rapide de trouver votre prochain job tech. Les inscrits trouvent leur emploi en 20 jours en moyenne.
En tant que codeur ou DevOps, vous connaissez probablement les principes Zerotrust concernant la sécurisation de vos applications. Cette approche offre un cadre de sécurité plutôt exigeant à l’ensemble des utilisateurs et des machines, les obligeant à être authentifiés / autorisés et validés en permanence afin d’accéder aux applications et aux données.
Ici on sort totalement du cadre de réseau traditionnel pour plonger dans un réseau aux bords flous, fait de cloud, de réseaux hybrides et traditionnels.
Pour répondre à ce besoin de gestion des secrets nécessaire au fonctionnement des procédures ZeroTrust, la société Hashicorp a développé Vault. Il s’agit d’un système de gestion des secrets chargé de protéger les informations sensibles.
Ce que j’appelle “Secret” ici, c’est un élément auquel on ne veut pas que le public ait accès, mais auquel on doit néanmoins pouvoir accéder de manière opérationnelle via le code ou l’infrastructure. Les secrets les plus courants sont des identifiants de bases de données, des clés de chiffrements, des clés d’API…etc.
Vault qui existe en version libre et open source, peut être utilisé à la fois pour stocker des informations d’identification, accorder l’accès à des données spécifiques ou encore authentifier les utilisateurs accédant à leurs secrets respectifs.
Vault se compose d’un backend utilisé pour le stockage des secrets, d’un serveur API utilisé pour traiter les demandes des clients et effectuer les différentes opérations sur les secrets et de différents “secret engines” pour chaque type de secret pris en charge.
Ainsi, plus besoin pour vos applications de stocker des secrets, il suffit d’interroger Vault ou de lui transmettre des données. Pour résumer, Vault fonctionne avec des jetons (tokens) et chaque jeton est lié à une “policy”, c’est-à-dire un jeu de règles limitant les actions et les accès de chaque client. Ainsi, les secrets restent bien au chaud dans une base de données et tout ce qui est communiqué aux applications tierces, sont des autorisations sous la forme de jetons.
Concernant la sécurité, Vault chiffre toutes les données avec une clé avant de placer les secrets dans son coffre. Cette clé est chiffrée par la clé maître qui est demandée au démarrage pour déverrouiller Vault. Vault lui-même ne conserve pas cette clé maître et elle n’est pas présente sur le serveur (sauf si vous l’avez copié dessus par mégarde).
Vault est sans doute la référence en la matière et il serait dommage de s’en priver. Lorsque vous aurez trouvé l’entreprise de vos rêves grâce à talent.io, je compte sur vous pour mettre ça en place afin de renforcer la sécurité de leurs données et de leurs accès.
Je vous propose donc un petit tutoriel pour vous y mettre et le déployer rapidement sur un serveur, à l’aide de Docker et Docker-Compose que j’affectionne tout particulièrement.
Vault + Consul sur Docker
Utiliser Vault pour gérer vos secrets est évidemment une solution beaucoup plus sécurisée que de les laisser en clair dans l’ensemble de vos fichiers de config.
Je vous recommande donc fortement d’adopter cette solution, que vous soyez DevOps ou développeur.
Vous pouvez installer Vault sur ordinateur Windows ou macOS, mais pour ce tutoriel, ce sera sous Linux. Je vais partir du principe que vous utilisez une distribution Debian ou dérivée (Ubuntu…etc.) et nous allons utiliser Docker et Docker-Compose pour faire une installation propre et rapidement de Vault.
Je vais partir du principe que votre serveur est équipé de Docker-Compose, mais si ce n’est pas le cas, veuillez l’installer comme ceci.
Mettez à jour votre serveur :
sudo apt update
sudo apt upgrade
Ensuite, on va installer Docker compose comme ceci :
sudo apt-get install docker-compose
L’étape suivante consiste à créer un fichier docker-compose.yml qui va contenir votre config Vault. On peut le faire évidemment à la main, mais il existe un dépôt sur Github qui regroupe tout ce qu’il faut pour déployer Vault + Consul.
Consul est un autre outil de Hashicorp. Il s’agit d’une solution de gestion d’applications distribuées permettant de gérer leur configuration, leur disponibilité, mais également de les monitorer…etc. Mais surtout, intégré avec Vault, Consul peut également stocker vos secrets.
C’est plus souple que de stocker tout dans un répertoire sur le serveur principal et cela vous permettra de fonctionner en haute disponibilité sur un système distribué.
Pour initialiser le projet, nous allons donc faire un
git clone https://github.com/testdrivenio/vault-consul-docker
Le fichier docker-compose.yml se décompose en 3 services :
- Vault lui-même
- Le serveur Consul
- Un worker Consul (un client quoi…)
version: '3.8'
services:
<strong>vault</strong>:
build:
context: ./vault
dockerfile: Dockerfile
ports:
- 8200:8200
volumes:
- ./vault/config:/vault/config
- ./vault/policies:/vault/policies
- ./vault/data:/vault/data
- ./vault/logs:/vault/logs
environment:
- VAULT_ADDR=http://127.0.0.1:8200
- VAULT_API_ADDR=http://127.0.0.1:8200
command: server -config=/vault/config/vault-config.json
cap_add:
- IPC_LOCK
depends_on:
- consul
<strong>consul</strong>:
build:
context: ./consul
dockerfile: Dockerfile
ports:
- 8500:8500
command: agent -server -bind 0.0.0.0 -client 0.0.0.0 -bootstrap-expect 1 -config-file=/consul/config/config.json
volumes:
- ./consul/config/consul-config.json:/consul/config/config.json
- ./consul/data:/consul/data
<strong> consul-worker</strong>:
build:
context: ./consul
dockerfile: Dockerfile
command: agent -server -join consul -config-file=/consul/config/config.json
volumes:
- ./consul/config/consul-config.json:/consul/config/config.json
depends_on:
- consul
Grâce au paramètre IPC_LOCK, le conteneur docker essayera de verrouiller la mémoire pour éviter que vos secrets ne soient swappés sur le disque dur. C’est donc important de le laisser.
Ce fichier est bien sûr accompagné des fichiers de config nécessaire à Consul et Vault, mais également de différents Dockerfile nécessaires au déploiement. Je vous invite fortement à aller regarder la structure de ces fichiers pour comprendre leur fonctionnement.
Faites ensuite un :
cd vault-consul-docker
Puis lancez le docker comme ceci :
docker-compose up -d --build
Vous pourrez ensuite accéder aux services via les URLs suivantes :
- Vault : http://localhost:8200/
- Consul : http://localhost:8500/
Initialiser Vault
L’initialisation de Vault peut se faire via l’interface graphique http://IP:8200 ou directement en ligne de commande. Je vais choisir l’option ligne de commande pour plus de fun.
Nous allons donc lancer une interface en ligne de commande sur la machine docker vault :
docker-compose exec vault bash
Pour le moment, Vault n’est pas initialisé. Lors de l’initialisation, toute une procédure de création de clés sécurisées sera enclenchée. Ces clés sont les clés “master” de votre Vault. Mieux vaut donc ne pas les perdre. La clé principale est découpée en plusieurs clés que vous pouvez conserver à différents endroits ou répartir entre différentes personnes. Cela permet d’éviter qu’une seule personne ne puisse accéder à l’ensemble du coffre.
Évidemment, si vous êtes seul aux commandes, vous aurez toutes les clés. Nous allons donc entrer la commande suivante :
vault operator init
5 clés seront générées. Pensez bien à les conserver. Ainsi que le Token Root qui vous sera demandé pour vous logger.
C’est une étape que vous pouvez également effectuer via l’interface graphique :
Bravo, vous avez bien avancé ! Pensez bien lorsque vous renseignerez votre profil talent.io à vous démarquer en faisant ressortir vos points forts et vos éléments différenciant pour que les entreprises qui recrutent s’arrêtent sur votre profil. Pourquoi ne pas évoquer vos compétences en matière de sécurisation de projets ?
Déverrouiller Vault
Ensuite, pour déverrouiller Vault, vous aurez besoin de 3 clés sur les 5 clés (c’est ce qu’on a décidé lors de l’initialisation).
Via l’UI ce sera facile. Via la ligne de commande, vous devrez entrer 3 fois de suite la commande suivante :
vault operator unseal
À chaque fois, Vault nous réclamera un bout de la clé. Ensuite avec la commande login, on s’identifiera à l’aide du token root :
vault login
Félicitations, votre instance de Vault est déverrouillée et vous y êtes connecté.
Activer les logs
Ensuite, nous activerons les logs :
vault audit enable file file_path=/vault/logs/audit.log
Pour visualiser si tout est OK et que le point de stockage des logs a bien été pris en compte, entrez la commande :
vault audit list
Création d’un premier coffre
Dans vault, vous pouvez créer autant de coffres (vault) que vous voulez. On va en créer un premier dont le nom très original sera “secret” à l’aide de la commande suivante :
vault secrets enable -path=secret/ kv
Dans ce coffre, vous allez pouvoir stocker au choix des secrets statiques qui n’expirent pas sauf si vous les révoquez. C’est présenté sous un format clé / valeur traditionnel. Ou grâce à Consul des secrets dynamiques qui sont générés à la demande et expirent après un certain temps.
Pour créer une première paire clé / valeur dans notre coffre secret, vous pouvez le faire via l’interface graphique ou comme ceci en ligne de commande.
C’est également faisable via l’API de Vault si vous le souhaitez, mais pensez bien à utiliser une “root policy” sur votre coffre pour fixer des droits en lecture seule ou lecture écriture aux applications qui feront appel à cette API. Je vous invite à vous référer à la documentation à ce sujet.
Ajouter un secret statique
vault kv put secret/wordpress korben=MonMotDePasse
Et pour le lire :
vault kv get secret/wordpress
Sachez que vous pouvez activer du suivi de version sur votre coffre comme ceci :
vault kv enable-versioning secret/
Vous pourrez comme ça enregistrer plusieurs valeurs :
Et récupérer la valeur qui vous intéresse à l’aide du paramètre -version :
vault kv get <strong>-version=1</strong> secret/wordpress
vault kv get <strong>-version=2</strong> secret/wordpress
Pour supprimer une de ces valeurs :
vault kv <strong>delete</strong> -versions=1 secret/wordpress
Et pour restaurer la valeur (pratique le versioning !) :
vault kv <strong>undelete</strong> -versions=1 secret/wordpress
Après si vous voulez vraiment le supprimer sans possibilité de restauration, il faudra utiliser le paramètre destroy :
vault kv destroy -versions=1 secret/wordpress
Ajouter un secret dynamique
Comme je vous le disais, les secrets dynamiques sont générés à la demande et peuvent être limités par un rôle, mais également par une durée de vie.
Vous pouvez au choix utiliser un prestataire comme AWS ou d’autres comme Google…etc. Ou gérez vous-même la génération de secrets dynamique en activant les ACL sur Consul, tout en suivant ce tutoriel.
Pour AWS. Vous allez devoir vous connecter à votre compte AWS chez Amazon, et vous rendre dans l’outil de gestion des accès (IAM) pour ajouter un nouvel utilisateur et ainsi obtenir une clé d’accès et une clé secrète.
Je vous invite aussi à suivre cette procédure de Hashicorp qui vous expliquera comment créer une policy pour votre utilisateur et ainsi générer à la demande des secrets dynamiques liés à cet utilisateur.
Le chiffrement avec Vault
Vault permet également de chiffrer et de déchiffrer des données à la volée sans avoir à les stocker. Pour cela, on va activer le service “transit” comme ceci :
vault secrets enable transit
Puis créer une clé de chiffrement pour chacune de vos applications
vault write -f transit/keys/mykey
On peut la voir apparaître côté interface :
Ensuite pour chiffrer un contenu vous pourrez appeler la commande suivante, même si le plus fréquent sera de passer par l’API de Vault pour faire exactement la même chose :
vault write transit/encrypt/mykey plaintext=$(base64 <<< "Ceci est un secret chuuut.")
Et pour le décoder et récupérer la donnée en base64 :
vault write transit/decrypt/mykey ciphertext=vault:v1:tN17ipGea3rv2tXzfHfNpvQbCkDSky5l/iFHN+I2/DJNSNqUh44w/1100vq4OqTXwxH3PZsltA==
Ensuite, reste plus qu’à décoder le base64 comme ceci :
base64 -d <<< "Q2VjaSBlc3QgdW4gc2VjcmV0IGNodXV1dC4K"
Conclusion
Comme je vous le disais au début, Vault est un outil qui peut s’utiliser en ligne de commande, au travers d’une interface graphique, mais surtout via son API. C’est cet élément qui est le plus utilisé pour lier les applications ayant besoin de secrets avec Vault.
J’espère qu’ainsi, le fonctionnement de Vault sera plus clair pour vous et vous aura donné envie de l’utiliser dans le cadre de vos opérations DevOps. En tout cas, la sécurité est une compétence très recherchée en ce moment, et disposer de cette compétence permettra de faire la différence lorsque vous commencerez à passer vos premiers entretiens trouvés via talent.io.
Pensez bien à vous créer un profil gratuitement sur leur plateforme, que ce soit pour trouver votre nouvel emploi ou simplement rester à l’écoute du marché. Déjà plus 6 000 développeurs, devops et autres profils tech ont été recrutés grâce à talent.io, alors pour quoi ne pas tenter ?
Il ne faut pas lésiner sur la sécurité et Vault est un bon moyen de mettre hors d’atteinte vos secrets. N’oubliez pas non plus Consul qui facilitera la mise à l’échelle et la distribution de de vos applications (et de vos secrets).