Aujourd'hui je commence une série d'articles articulés autour d'un outil d'Hashicorp : Vault.
Cette série nous emmènera de la simple découverte de Vault, en passant par son utilisation basique avec d'autres outils ( Ansible
, Gitlab
ou même Rundeck
) jusqu'à son installation en mode HA pour être au plus près d'un cas concret de mise en production !
Et sans dévoiler les futurs articles ( faudrait déjà les écrire pour ça 🤣 ), on aura même l'occasion de parler pki
et Traefik
!
Mais avant tout, Vault c'est quoi ?
Vault : Keep your secrets
Vault est - comme son nom l'indique - un coffre-fort pour vos données. Il va vous permettre d'accéder en toute sécurité à vos secrets... Pour rappel, les secrets, sont des informations sensibles : comme par exemple un nom d'utilisateur et son mot de passe ou même encore des fichiers, par exemple des clés SSH.
Globalement un secret est une information dont vous souhaitez contrôler l'accès.
Vault est donc un outil qui fournit une interface unifiée pour toutes vos informations sensibles et donc centralise l'information :
Plus besoin de chercher votre mot de passe root
de base de données pendant des heures ! 🤬
Et d'en arriver à prier pour qu'il se trouve dans le fichier configuration.php
... ( de toute façon vous ne mettez jamais l'accès root
pour vos applications?non?! )
De plus avec Vault, on va garantir un contrôle d'accès strict aux données sensibles avec en autre une gestion des droits et accès utilisateurs, mais aussi la tenue d'un d'un journal d'audit détaillé.
Il s'agit vraiment d'un outil très complet, qui permet encore plus de choses ( extrait traduit de la documentation officielle ) :
- Stockage secret sécurisé: Vault crypte les 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 AWS ou SQL. Après avoir créé ces secrets dynamiques, Vault les révoquera également automatiquement une fois le bail terminé.
- Chiffrement des données: Vault peut chiffrer et déchiffrer les données sans les stocker. Cela permet aux équipes de sécurité de définir des paramètres de chiffrement et aux développeurs de stocker des données chiffrées dans un emplacement tel que SQL sans avoir à concevoir leurs propres méthodes de chiffrement.
- Location et renouvellement: tous les secrets de Vault sont associés à un bail. À la fin du bail, Vault révoquera automatiquement ce secret. Les clients peuvent renouveler les baux via des API de renouvellement intégrées.
- Révocation: Vault prend en charge la révocation des secrets. L'outil peut révoquer non seulement des secrets uniques, mais aussi un arbre entier de secrets. Par exemple tous les secrets lus par un utilisateur spécifique, ou tous les secrets d'un type particulier.
À noter que Vault propose plusieurs solutions de stockage des secrets: sur le disque, en mémoire ou bien dans une base key value (KV) comme Consul
.
Comme tous les outils complets, la première prise en main et sa découverte peut s'avérer parfois complexe.
C'est pourquoi nous allons commencer aujourd'hui avec une installation et une utilisation simple de celui-ci. L'objectif du jour :
- Faire tourner notre serveur Vault avec
Docker
, - Écrire et lire nos premiers secrets ( de simple login/mot de passe ! ).
Go 🚀
Il existe deux méthodes possibles pour lancer une instance Vault
serveur :
- L'instance en mode "développement" : Vault va être lancé entièrement en mémoire. Même si cette méthode n'est pas à utiliser en environnement de production, elle est très simple à utiliser et permet comme son nom l'indique de réaliser des tests sans trop se soucier de la configuration.
- L'instance en mode "Server" : C'est le mode à utiliser une fois qu'on a pris la main sur le logiciel. On va pouvoir configurer son backend, et quelques options de démarrage. On utilisera ce mode lorsque nous serons prêts à passer en production.
Aujourd'hui nous allons utiliser le mode développement afin de ne pas rentrer dans le détail de certaines configurations et juste prendre en main l'outil.
On va donc pouvoir lancer le tout avec une seule ligne de commande :
$ docker run --cap-add=IPC_LOCK -d --name=my-vault vault
Il est nécessaire d'ajouter la capacities IPC_LOCK
car le container va verrouiller la mémoire afin d'empêcher les informations sensibles de redescendre dans la "swap".
L'exécutable vault
étant lancé au travers d'un compte non-root, setcap est utilisé pour donner au binaire la possibilité de verrouiller la mémoire.
🚩 Attention, dans de rare cas cela peut poser des problèmes. Il est possible de ne pas verrouiller la mémoire avec la variable d'environnement SKIP_SETCAP
. 🚩
On peut également déjà s'apercevoir que le verrouillage de la mémoire peut-être un problème pour une utilisation avecSwarm
. Jusque maintenantSwarm
ne permettait pas l'ajout de capacities. Un commit très récent ajoute cette possibilité mais je n'ai pas encore eu l'occasion de l'essayer :
https://github.com/docker/cli/pull/2687
Une fois votre container démarré, il va falloir récupérer le token d'identification du compte root
:
$ docker logs my-vault
==> Vault server configuration:
Api Address: http://0.0.0.0:8200
Cgo: disabled
Cluster Address: https://0.0.0.0:8201
Go Version: go1.14.7
Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
Log Level: info
Mlock: supported: true, enabled: false
Recovery Mode: false
Storage: inmem
Version: Vault v1.5.3
Version Sha: 9fcd81405feb320390b9d71e15a691c3bc1daeef
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: H47Vi4lWrv0TJzztP9LT1rOSV3jmawmS2sTupfZWi8A=
Root Token: s.yN6dB9zN2IzBUI2pUGTF0MqB
Notre instance est lancée et nous allons ensuite vérifier que notre coffre-fort est opérationnel.
Pour cela, connectez-vous sur le container :
$ docker exec -it my-vault sh
Ensuite exportez la variable VAULT_ADDR
avec l'adresse du serveur :
$ export VAULT_ADDR='http://127.0.0.1:8200'
Et vérifions que le coffre est opérationnel :
$ vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.5.3
Cluster Name vault-cluster-a6dd6af0
Cluster ID 44f2e279-abdb-0bed-506f-70f0dc6389ad
HA Enabled false
En mode développement le coffre-fort est automatiquement déverrouillé.
Nous reviendrons plus en détail sur ce mécanisme dans le prochain article.
Commençons plutôt par créer notre premier secret !
Tout d'abord, il faut se connecter avec le token root
qui est le seul à notre disposition pour l'instant :
$ vault login
Saisissez le token obtenu plus haut.
Réalisez les opérations avec le compte root
n'est clairement pas conseillé, il sera nécessaire par la suite de créer de nouveaux accès.
Créons notre premier secret :
$ vault kv put secret/login user=alice
Key Value
--- -----
created_time 2020-09-23T09:44:43.359142968Z
deletion_time n/a
destroyed false
version 1
On peut également le récupérer avec la commande :
$ vault kv get secret/login
====== Metadata ======
Key Value
--- -----
created_time 2020-09-23T09:44:43.359142968Z
deletion_time n/a
destroyed false
version 1
==== Data ====
Key Value
--- -----
user alice
Ou même l'effacer :
$ vault kv delete secret/login
Success! Data deleted (if it existed) at: secret/login
Alors oui ce premier article ne rentre pas dans les détails et toutes les fonctionnalités qu'offrent Vault. Et nos premières interactions sont pour le moins minimalistes !
Il est nécessaire de poser les bases de l'outil avant d'aller plus loin, quitte à faire un peu de redondance avec la documentation officielle ( qui est très bien réalisée en passant, c'est toujours un point important lors de la découverte d'un logiciel ).
Vous savez maintenant comment installer et utiliser Vault
avec Docker. Si vous envisagez déjà d'utiliser Vault, voici une réflexion très intéressante sur l'installation de votre serveur ( et pourquoi vous ne devriez pas le conteneuriser par exemple ! ) :
La documentation est même très claire sur le sujet :
Single Tenancy. Vault should be the only main process running on a machine. This reduces the risk that another process running on the same machine is compromised and can interact with Vault. Similarly, running on bare metal should be preferred to a VM, and a VM preferred to a container. This reduces the surface area introduced by additional layers of abstraction and other tenants of the hardware. Both VM and container based deployments work, but should be avoided when possible to minimize risk.
J'opte de mon côté pour les mises en production, une installation sur machine virtuelle : le compromis... 😀
N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇