Aller au contenu
Sécurité high

Sécurisez vos secrets avec HashiCorp Vault

12 min de lecture

logo ansible

Vault est un outil qui permet de stocker en toute sécurité vos secrets. Mais qu’est-ce qu’un secret ? Des secrets, ce sont toutes vos données dont vous souhaitez pouvoir contrôler étroitement leur accès en lecture, comme les clés d’API, les mots de passe, les certificats, etc.

Vault fournit une interface permettant d’accéder à n’importe quel secret, tout en assurant un contrôle d’accès strict et en enregistrant un journal d’audit détaillé.

Vault n’est pas qu’un simple stockage, il gère l’ensemble du cycle de vie de vos secrets :

Stockage sécurisé de secret : les secrets de clé/valeur peuvent être stockés dans Vault. Vault crypte ces secrets avant de les écrire dans le stockage persistant, donc accéder au stockage brut ne suffit pas pour accéder à vos secrets.

Secrets dynamiques : Vault peut générer des secrets à la demande pour certains systèmes, tels que les bases de données. Par exemple, Vault peut générer et révoquer également automatiquement vos certificats.

Chiffrement des données : Vault peut chiffrer et déchiffrer les données sans les stocker.

Location et renouvellement : tous les secrets de Vault sont associés à un bail. À la fin du bail, Vault révoquera automatiquement ces secrets.

Hashicorp présente le concept de son produit vault avec une image sous la forme d’un triangle. On retrouve au sommet de ce triangle les clients ayant besoin d’accéder aux secrets et à la base les composants clés de vault. Parmi ces composants Vault on retrouve : les moteurs de secrets, les méthodes d’authentification et les policies.

Vault triangle

Vault est livré avec un bon paquet de moteurs de secrets et de méthodes d’authentification.

Parmi les moteurs de secrets, on retrouve les secrets de type clés/valeurs, des PKI, des clés ssh, des bases de données, …

Si vous souhaitez tester Vault pas besoin de mettre en place tout une infra. Une simple machine Linux suffira. Il faut avant tout installer la dernièr versions de la cli Vault.

HashiCorp fournit des repos pour la plupart des distributions Linux. Pour installer la CLI il suffit d’ajouter le dépôt de package avec machine linux.

Ouvrez un terminal et tapez les commandes suivantes :

Fenêtre de terminal
sudo apt update && sudo apt install gpg
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt install vault

Pour Centos/RHEL/Fedora :

Fenêtre de terminal
wget -O- https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo | sudo tee /etc/yum.repos.d/hashicorp.repo
sudo yum install vault
Fenêtre de terminal
brew tap hashicorp/tap
brew tap-info hashicorp/tap --json | jq -r '.[]|(.formula_names[],.cask_tokens[])'
brew install hashicorp/tap/vault

Il suffit de taper la commannde suivante :

Fenêtre de terminal
vault --version
Vault v1.15.2 (cf1b5cafa047bc8e4a3f93444fcb4011593b92cb), built 2023-11-06T11:33:28Z

Dans une fenêtre terminal tapez la commande suivante :

Fenêtre de terminal
vault server -dev
==> Vault server configuration:
Administrative Namespace:
Api Address: http://127.0.0.1:8200
Cgo: disabled
Cluster Address: https://127.0.0.1:8201
...
You may need to set the following environment variables:
$ export VAULT_ADDR='http://127.0.0.1:8200'
The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.
Unseal Key: X8Y1YegGxATEiMji+Jydr9zNLg+Y5fNqK6nXZ0cK8XQ=
Root Token: hvs.T9hGPTSQ0uMxbi2Yt9onYPX3
Development mode should NOT be used in production installations!

Félicitations votre serveur Vault est opérationnel 👍

La version dev du serveur Vault permet de saisir tout de suite des clés Valeurs dans le coffre-fort. Il suffit dans une autre fenêtre de Terminal d’exporter la variable indiquant à la CLI Vault où se trouve le serveur et le token:

Fenêtre de terminal
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='hvs.T9hGPTSQ0uMxbi2Yt9onYPX3'

Pour vérifier que vous y avez accès :

Fenêtre de terminal
vault status 09:55:36
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.15.2
Build Date 2023-11-06T11:33:28Z
Storage Type inmem
Cluster Name vault-cluster-24e4e195
Cluster ID b9a088a4-e194-cc50-5714-38774aad3963
HA Enabled false

Tout est prêt 👍

Lors de l’exécution de Vault en mode développement, le moteur de secrets Key/Value v2 est activé avec le path secret/. Le moteur de secrets est un magasin clé-valeur générique utilisé pour stocker des secrets arbitraires dans le stockage physique configuré pour Vault. Les secrets écrits dans Vault sont chiffrés, puis écrits dans le stockage principal. Par conséquent, le mécanisme de stockage back-end ne voit jamais la valeur non chiffrée et ne dispose pas des moyens nécessaires pour la déchiffrer sans Vault.

Pour gérer les secrets avec la CLI de Vault, il faut utiliser la commande suivante :

Fenêtre de terminal
vault kv <subcommand> [options] [args]

Pour obtenir de l’aide avec cette commande :

Fenêtre de terminal
kv enable-versioning --help 09:59:02
Usage: vault kv enable-versioning [options] KEY
This command turns on versioning for the backend at the provided path.
$ vault kv enable-versioning secret
Additional flags and more advanced use cases are detailed below.
...
Subcommands:
delete Deletes versions in the KV store
destroy Permanently removes one or more versions in the KV store
enable-versioning Turns on versioning for a KV store
get Retrieves data from the KV store
list List data or secrets
metadata Interact with Vault's Key-Value storage
patch Sets or updates data in the KV store without overwriting
put Sets or updates data in the KV store
rollback Rolls back to a previous version of data
undelete Undeletes versions in the KV store

Créons notre premier secret :

Fenêtre de terminal
vault kv put -mount=secret foo bar=baz
= Secret Path =
secret/data/foo
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T08:36:35.501700726Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

Il est possible de créer plusieurs secrets avec une seule commande put :

Fenêtre de terminal
vault kv put -mount=secret hello foo=world excited=yes 10:13:18
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T09:13:27.223229803Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

La commande get permet de récupérer un secret :

Fenêtre de terminal
vault kv get -mount=secret hello 10:13:27
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T09:13:27.223229803Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
===== Data =====
Key Value
--- -----
excited yes
foo world

Pour supprimer une valeur, on utilise la commande delete :

Fenêtre de terminal
vault kv delete -mount=secret hello 10:13:37
Success! Data deleted (if it existed) at: secret/data/hello

On contrôle que le secret a bien été détruit :

Fenêtre de terminal
vault kv get -mount=secret hello
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T09:13:27.223229803Z
custom_metadata <nil>
deletion_time 2023-11-16T09:14:44.217933975Z
destroyed false
version 1

La sortie affiche uniquement les métadonnées dont deletion_time. Il n’affiche pas les données elles-mêmes une fois supprimées.

Comme vous le voyez l’effacement est une opération réversible. On peut restaurer un secret :

Fenêtre de terminal
vault kv undelete -mount=secret -versions=1 hello 10:16:06
Success! Data written to: secret/undelete/hello

On contrôle :

Fenêtre de terminal
vault kv get -mount=secret hello 10:19:51
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T09:13:27.223229803Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
===== Data =====
Key Value
--- -----
excited yes

Si vous souhaitez supprimer définitivement les métadonnées sous-jacentes, vous devrez utiliser la commande destroy :

Fenêtre de terminal
vault kv destroy -mount=secret -versions=1 hello 10:21:16
Success! Data written to: secret/destroy/hello

On contrôle :

Fenêtre de terminal
vault kv get -mount=secret hello 10:21:37
== Secret Path ==
secret/data/hello
======= Metadata =======
Key Value
--- -----
created_time 2023-11-16T09:13:27.223229803Z
custom_metadata <nil>
deletion_time n/a
destroyed true
version 1

Cette fois le flag destroyed est bien à true !

J’espère qu’à travers cette petite introduction, vous aurez compris toute la puissance de Vault pour stocker des secrets en toute sécurité. La gestion des secrets n’est pas la seule fonctionnalité de Vault, nous verrons les autres dans les chapitres suivants en commençant par une installation complète.