Aller au contenu principal

HashiCorp Vault

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.

Introduction

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é.

Qu'apporte Vault

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.

Le concept de Vault

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 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, ....

Tester Vault

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.

Installation 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.

Sur une Debian Family

Ouvrez un terminal et tapez les commandes suivantes :

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

Sur des Red Hat

Pour Centos/RHEL/Fedora :

wget -O- https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo | sudo tee /etc/yum.repos.d/hashicorp.repo
sudo yum install vault

Sur MacOS

brew tap hashicorp/tap
brew tap-info hashicorp/tap --json | jq -r '.[]|(.formula_names[],.cask_tokens[])'
brew install hashicorp/tap/vault

Vérification de l'installation de Vault

Il suffit de taper la commannde suivante :

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

Lancer votre premier serveur Vault

Dans une fenêtre terminal tapez la commande suivante :

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 👍

Gérer vos secrets avec Vault

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:

export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='hvs.T9hGPTSQ0uMxbi2Yt9onYPX3'

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

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 👍

La commande kv de la CLI Vault

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 :

vault kv <subcommand> [options] [args]

Pour obtenir de l'aide avec cette commande :

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

Stockage de clés/valeurs

Créons notre premier secret :

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 :

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

Lecture d'un secret

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

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

Effacer un secret

Pour supprimer une valeur, on utilise la commande delete :

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 :

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.

Restauration d'un secret

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

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

On contrôle :

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

Destruction

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

vault kv destroy -mount=secret -versions=1 hello                                                                                      10:21:16

Success! Data written to: secret/destroy/hello

On contrôle :

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 !

Conclusion

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.