Besoin de support ?

Une urgence ? Téléchargement le logiciel de prise de contrôle à distance.

Téléchargement d’outil de prise de contrôle

Teamviewer

Email

support@adjan-it.com

Contact support

Téléphone : 07 87 23 75 34

Débuter avec Hashicorp Vault

  • By frederik
  • 7 juin 2022
  • 27 Views

A quoi ça sert ?

Il n’est malheureusement pas rare de voir que les credentials pour accéder à une base de données ou à tout autre service, soit stocké directement dans le code source ou dans des .env versionnés. Cela engendre bien entendu des problèmes au niveau de la sécurité. En effet tous les développeurs accèdent aux mot de passes, token etc. Il faudrait donc changer tous ces accès à chaque sortie d’un développeur de l’équipe. De plus stocker ces credentials sur les postes des développeurs peut engendrer des fuites de données car il n’est pas possible de maîtriser ce que fait le développeur avec son poste.

Bref dans tous les cas, la bonne pratique est d’utiliser un coffre-fort de mots de passe. Il existe plusieurs solutions, et nous allons voir dans ce billet une solution qui fait ses preuves : Hashicorp Vault

Hashicorp Vault est une solution qui permet de stocker tous nos credentials de manière sécurisée.

Qu’allons-nous stocker ?

Tout ce qui doit être tenu secret comme les clés d’API, les mots de passe voire les certificats.

Cette solution existe dans plusieurs offres : de gratuite à payante, de on-premise à SaaS. Vault répond à tous les besoins de stockage de credentials : expiration de clés, renouvellement, bref, tout le cycle de vie des accès nécessaires dans vos projets.

Installation et utilisation

Afin d’étudier cette solution et de voir comme elle fonctionne, nous allons l’installer sur notre poste via Docker./

Si vous avez Docker d’installé, vous pouvez créer un fichier docker-compose.yml et y placer le code suivant :

version: '2'
services:
  vault:
    image: vault
    container_name: vault
    ports:
      - "8200:8200"
    restart: always
    volumes:
      - ./volumes/logs:/vault/logs
      - ./volumes/file:/vault/file
      - ./volumes/config:/vault/config
    cap_add:
      - IPC_LOCK
    entrypoint: vault server -config=/vault/config/vault.json

Nous utilisons des volumes pour stocker la configuration de Vault.

Pour créer les trois volumes :

mkdir -p volumes/{config,file,logs}

Nous allons maintenant mettre la configuration dans le fichier de configuration au format JSON.

nano volumes/config/vault.json

A l’intérieur, placez la configuration suivante :

{
  "backend": {
    "file": {
      "path": "vault/file"
    }
  },
  "listener": {
    "tcp":{
      "address": "0.0.0.0:8200",
      "tls_disable": 1
    }
  },
  "ui": true
}

Sans rentrer dans les détails, cela permet de paramétrer le port d’écouter (8200) et indiquer d’écouter sur toutes les interfaces réseaux et avec le SSL d’activé.

Une interface graphique permettra de configurer et d’accéder au Vault.

Nous pouvons lancer la construction de notre image Docker :

docker-compose up -d

Vous pouvez ensuite vérifier que le container est bien up :

docker ps

Nous allons maintenant pouvoir configurer Vault :

docker logs -f vault

Vous allez voir un token d’authentification que nous allons utiliser bientôt.

Afin de tester Vault, il nous faut un client. Si vous êtes sur MacOS, vous pouvez utiliser brew pour l’installation :

brew tap hashicorp/tap

ou sur Linux :

sudo apt install vault

Dans votre fichier d’initialisation de Shell, comme .bashrc, ajoutez la ligne suivante :

export VAULT_ADDR='http://127.0.0.1:8200'

Une fois le client Vault installé, lancez la commande suivante pour afficher. des informations :

vault status

Vous allez voir les informations de Vault, mais à ce stade nous voyons un statut « sealed ».

vault operator init -key-shares=6 -key-threshold=3

Pour « unseal », vous pouvez soit le faire en ligne de commande, soit depuis l’interface graphique : http://127.0.0.1:8200

En ligne de commande :

vault operator unseal <key seal 1>
vault operator unseal <key seal 2>
vault operator unseal <key seal 3>

La dernière opération est maintenant de se connecter avec le token qui a été affiché dans les étapes précédentes.

Ce token peut être utilisé dans l’interface graphique mais également en ligne de commandes. Pour la suite de ce tutoriel, nous allons utiliser la ligne de commandes :

vault login <token-id>
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                  Value
---                  -----
token                <token-id>
token_accessor       ....
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

Nous pouvons maintenant définir le type de stockage. Dans notre exemple, nous allons stocker les données sous forme de clé/valeur :

vault secrets enable kv

Success! Enabled the kv secrets engine at: kv/

Il est maintenant possible d’injecter des valeurs dans le Vault, de les lire et de les versionner.

vault kv put kv/mongo login=root

Success! Data written to: kv/mongo

Pour effectuer une lecture dans le Vault :

vault kv get kv/mongo

=== Data ===
Key      Value
---      -----
login    root

Il est possible de versionner les données, pour cela il faut activer la fonctionnalité :

vault kv enable-versioning kv/

Success! Tuned the secrets engine at: kv/
vault kv put kv/foo login=root2

Key              Value
---              -----
created_time     2022-06-03T15:03:32.1254755Z
deletion_time    n/a
destroyed        false
version          2

Pour accéder à une version spécifique d’un élément, on utilise l’option -version :

vault kv get -version=2 kv/foo

====== Metadata ======
Key              Value
---              -----
created_time     2022-06-03T15:03:32.1254755Z
deletion_time    n/a
destroyed        false
version          2

=== Data ===
Key      Value
---      -----
login    root

Vault gère également les mécanismes de suppression et de restauration.

Pour supprimer un élément d’une version précise :

vault kv delete -versions=1 kv/mongo

Success! Data deleted (if it existed) at: kv/mongo

Pour restaurer un élément supprimé, on utilise la commande undelete :

vault kv undelete -versions=1 kv/mongo

Success! Data written to: kv/undelete/mongo

Enfin, nous pouvons utiliser la commande destroy pour supprimer définitivement un élément :

vault kv destroy -versions=1 kv/mongo

Success! Data written to: kv/destroy/mongo

Nous verrons dans un autre billet, comment utiliser Vault dans vos projets Node.JS.

L’API

Hashicorp Vault nous met à disposition une API pour se servir de ses fonctionnalités.

L’API s’appelle en HTTP/HTTPS et fonctionne de manière intuitive lorsque l’on a compris le mode de fonctionnement de Vault.

Pour appeler les API sur HTTP/HTTPS, nous allons utiliser l’outil Curl.

Tout d’abord, avant de faire votre requête, il est nécessaire de paramétrer la clé, tout comme nous l’avons fait pour l’utilisation du client lourd.

export VAULT_TOKEN=213d7dad-c2fd-de83-61bf-bcc9ab43d480
curl \
    -H "X-Vault-Token: $VAULT_TOKEN" \
    -X GET \
    http://127.0.0.1:8200/v1/kv/mongo

"data":{
  "mongo":{
    "login":"root"
  },
  "metadata":{
    "created_time":"2022-06-03T15:03:32.1254755Z",
    "deletion_time":"",
    "destroyed":false,
    "version":1
  }
}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.