Loading search data...

Introduction à hashicorp Vault

Publié le : 22 février 2021 | Mis à jour le : 27 juin 2023

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

Tester Vault

Si vous souhaitez tester Vault pas besoin de mettre en place tout une infra. Une simple machine Linux avec Docker installé suffira. On utilisera docker-compose et des volumes pour que les données soient persistantes :

Lancer votre premier vault

Créer un fichier docker-compose.yml et déposez-y ceci :

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

Créer maintenant les trois volumes :

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

Créer le fichier de config :

vi volumes/config/vault.json

Et y mettre ce contenu

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

Maintenant on peut lancer le container :

docker-compose up -d
docker ps
bdb39505d8da   vault     "vault server -confi…"   3 days ago   Up 3 days   0.0.0.0:8200->8200/tcp   vault

Ensuite activer le suivi des logs de notre container Vault, car des informations importantes vont apparaître :

docker logs -f vault
...
==> Vault server started! Log data will stream in below:

2021-02-22T10:08:50.746Z [INFO]  secrets.kv.kv_0ce84db1: collecting keys to upgrade
2021-02-22T10:08:50.746Z [INFO]  secrets.kv.kv_0ce84db1: done collecting keys: num_keys=1
2021-02-22T10:08:50.746Z [INFO]  secrets.kv.kv_0ce84db1: upgrading keys finished
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variable:

    $ export VAULT_ADDR='http://0.0.0.0:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: bVFrRv1RNhnc/7qSgblzx115fUjiUnZvRtBHfHPNF/o=
Root Token: s.ZoFvTfcI11lrfvEcM3liSK3L

Development mode should NOT be used in production installations!

Comme vous pouvez le lire Vault est démarré, mais est dans l’état unseal (scellé). En effet, quand un serveur Vault est démarré, il démarre dans un état scellé. Avant le descellement, presque aucune opération n’est possible avec Vault. Par exemple, l’authentification, le stockage, la consultation, etc. ne sont pas possibles. Les seules opérations possibles sont de desceller le coffre-fort et de vérifier son état.

Déverrouillage du vault

Vous avez trois moyens d’accéder au Vault :

  • la ligne de commande avec le binaire de Vault
  • des appels à l’api de Vault
  • ou encore l’interface utilisateur de Vault accessible à l’adresse http://localhost:8200

Les opérations d’administrations se font essentiellement avec la ligne de commande. Donc installons la :

sudo apt install vault

Dans votre fichier .bashrc ajouter cette ligne ou tapez-le :

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

vault status
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          true
Total Shares    1
Threshold       1
Version         1.6.2
Storage Type    inmem
Cluster Name    vault-cluster-b7fb9f6d
Cluster ID      1e1837c3-1879-ef45-b1a2-7b7d4380c4a0
HA Enabled      false

On voit bien qu’il est actif, mais sealed. Il faut demander à initialiser le vault :

vault operator init -key-shares=6 -key-threshold=3
Unseal Key 1: p9ySCyRaHXUhQQAw3PgkQhSvoe+mexRlZGILDi2ieLji
Unseal Key 2: a8IQbNnbUWLx5mK//nkG0NIO4XtYbeqOFnS7R1STJhQg
Unseal Key 3: 4Q+qgYNYTRqER5NdrzFwyYSmI6ZcQ4qYcvat0YKCGqJB
Unseal Key 4: AlXy7LO1Nyxxp5GAVYe2MEusk8chXJb/q0rnT5hxOsB6
Unseal Key 5: XHtoC4husOQCwXNEyT4Du6D9zF6T2UJgEWVRoCC/62kr

Initial Root Token: 213d7dad-c2fd-de83-61bf-bcc9ab43d480

Vault initialized with 6 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated master key. Without at least 3 key to
reconstruct the master key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.

Vous devez stocker quelque part ces données de manière sécurisé. Maintenant déverrouillons notre “Vault” :

vault operator unseal p9ySCyRaHXUhQQAw3PgkQhSvoe+mexRlZGILDi2ieLji
vault operator unseal a8IQbNnbUWLx5mK//nkG0NIO4XtYbeqOFnS7R1STJhQg
vault operator unseal 4Q+qgYNYTRqER5NdrzFwyYSmI6ZcQ4qYcvat0YKCGqJB

On peut enfin se connecter avec root token :

vault login 213d7dad-c2fd-de83-61bf-bcc9ab43d480
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                213d7dad-c2fd-de83-61bf-bcc9ab43d480
token_accessor       ....
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

Et voilà, Vault est disponible pour stocker vos secrets.

Stockage de clés/valeurs

Dans un premier temps nous allons activer le moteur de secrets clés/valeurs (kv) :

vault secrets enable kv

Success! Enabled the kv secrets engine at: kv/

Créons notre premier secret :

vault kv put kv/foo bar=toto

Success! Data written to: kv/foo

Lecture d’un secret :

vault kv get kv/foo

=== Data ===
Key    Value
---    -----
bar    toto

Pour travailler avec différentes versions d’une clé spécifique, nous devons activer le versionning :

vault kv enable-versioning kv/

Success! Tuned the secrets engine at: kv/

Ajoutez la version 2 en mettant à jour la valeur :

vault kv put kv/foo bar=titi

Key              Value
---              -----
created_time     2021-02-22T13:59:41.4928751Z
deletion_time    n/a
destroyed        false
version          2

Lire la version 1 :

vault kv get -version=1 kv/foo

vault kv get -version=1 kv/foo

====== Metadata ======
Key              Value
---              -----
created_time     2021-02-22T13:59:31.3575991Z
deletion_time    n/a
destroyed        false
version          1

=== Data ===
Key    Value
---    -----
bar    toto

Lire la version 2 :

vault kv get -version=2 kv/foo

====== Metadata ======
Key              Value
---              -----
created_time     2021-02-22T13:59:41.4928751Z
deletion_time    n/a
destroyed        false
version          2

=== Data ===
Key    Value
---    -----
bar    titi

Supprimez la dernière version (par exemple, la version 2) :

vault kv delete kv/foo

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

Supprimer la version 1:

vault kv delete -versions=1 kv/foo

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

Il est également possible d’annuler la suppression :

vault kv undelete -versions=1 kv/foo

Success! Data written to: kv/undelete/foo

Comme vous le voyez la suppression est une opération réversible. Si vous souhaitez supprimer définitivement les métadonnées sous-jacentes, vous devrez utiliser la commande destroy :

vault kv destroy -versions=1 kv/foo

Success! Data written to: kv/destroy/foo

Accès via l’API

Il est possible d’accéder aux données stockées dans le vault via des appels à l’API Vault:

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/foo/bar

"data":{
  "foo":{
    "bar":"toto"
  },
  "metadata":{
    "created_time":"2021-02-22T14:05:59.8426681Z",
    "deletion_time":"",
    "destroyed":false,
    "version":1
  }
}

Utilisation avec Ansible

Il est tout à fait possible de récupérer des secrets avec Ansible. Pour cela il faut installer la collection communauty general, et le module python hvac.

ansible-galaxy collection install community.general
sudo pip install hvac --user

Ensuite pour récupérer des secrets il faut comme avec CURL définir VAULT_ADDR et VAULT_TOKEN (ca vous permettera de les utiliser dans gitlab) :

export VAULT_ADRR=http://127.0.0.1:8200
export VAULT_TOKEN=213d7dad-c2fd-de83-61bf-bcc9ab43d480

Voici un exemple de playbook :

---
- name: test hashicorp vault
  hosts: all

  vars:
    VAULT_TOKEN: "{{ lookup('env', 'VAULT_TOKEN') }}"
    VAULT_ADDR: "{{ lookup('env', 'VAULT_ADDR') }}"
    foo: "{{ lookup('hashi_vault', 'secret=kv/foo:bar token={{VAULT_TOKEN}} url={{ VAULT_ADDR }} ')}}"

  tasks:
    - name: get
      debug:
        msg: "{{ foo }}"

Pour le lancer :

ansible-playbook -i localhost, -c local test.yml

PLAY [test hashicorp vault] ********

TASK [Gathering Facts] ********
ok: [localhost]

TASK [get] **************
ok: [localhost] => {
    "msg": "toto"
}

PLAY RECAP ********
localhost                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Voilà, c’est fini pour aujourd’hui. À la prochaine.

Si vous voulez voir à quoi peut servir Vault je vous renvoie sur cette video

Source

Mots clés :

devops tutorials infra as code vault

Si vous avez apprécié cet article de blog, vous pouvez m'encourager à produire plus de contenu en m'offrant un café sur  Ko-Fi. Vous pouvez aussi passer votre prochaine commande sur amazon, sans que cela ne vous coûte plus cher, via  ce lien . Vous pouvez aussi partager le lien sur twitter ou Linkedin via les boutons ci-dessous. Je vous remercie pour votre soutien.

Autres Articles


Commentaires: