Installation d'HashiCorp Vault sur un Noeud
Mise à jour :
Bienvenue dans ce guide détaillé sur l’installation d’HashiCorp Vault. Si vous avez déjà parcouru mon précédent guide sur l’introduction à Vault, vous savez déjà que Vault est un outil incontournable dans l’univers de la gestion des secrets et de la sécurité des données. Si ce n’est pas le cas, je vous invite à le consulter ici pour comprendre les bases et l’importance de Vault dans les environnements DevOps.
L’objectif de ce guide est de vous guider pas à pas à travers l’installation de Vault. Que vous soyez un administrateur système expérimenté ou que vous débutiez avec Vault, ce guide est conçu pour vous fournir toutes les informations nécessaires pour une installation réussie et sécurisée.
Prérequis Techniques
Avant de plonger dans l’installation proprement dite de Vault, il est indispensable de s’assurer que vous avez tout ce qu’il faut pour un déploiement réussi. Dans cette section, nous allons passer en revue les prérequis techniques et les compétences nécessaires pour installer Vault.
Configuration Système Requise
La première étape est de s’assurer que votre système répond aux exigences minimales pour exécuter Vault. Voici ce dont vous aurez besoin :
- *Système d’exploitation : Vault est compatible avec la plupart des systèmes d’exploitation modernes, y compris Linux, Windows et macOS. Assurez-vous d’utiliser une version prise en charge.
- *Mémoire et Processeur : Bien que les besoins exacts dépendent de votre utilisation prévue, je recommande au minimum 2 Go de RAM et 2 cœurs de processeur pour une expérience fluide.
- *Espace Disque : L’espace disque requis dépendra de la quantité de données que vous prévoyez de stocker dans Vault. Prévoyez suffisamment d’espace pour le stockage des secrets et des logs.
Dépendances Logicielles
Certains composants logiciels sont nécessaires pour exécuter Vault :
- Backend de Stockage : Vault nécessite un backend de stockage pour conserver les secrets. Les options populaires incluent Consul, Etcd et les solutions de stockage cloud, mais ici nous utiliserons le stockage sur filesystems.
Installation de Vault
L’utilisation d’Ansible pour installer Vault simplifie et automatise le processus, en garantissant la cohérence et la reproductibilité de l’installation sur différents environnements.
Préparation du Playbook Ansible
Commencez par créer un playbook Ansible de base. Assurez-vous que vous avez Ansible installé sur votre machine de contrôle et que vous pouvez vous connecter à votre serveur cible.
Dans votre playbook, définissez les hôtes sur lesquels Vault doit être installé, ainsi que des variables permettant de paramétrer son exécution. Par exemple :
- hosts: mon_serveur_vault vars: vault_version: "1.15.4" vault_directory: /opt/vault vault_user: vault vault_group: vault vault_ui: false vault_tls_disabled: true
Ajoutez des tâches pour télécharger pour créer le groupe et l’utilisateur vault :
tasks: - name: Create group vault become: true ansible.builtin.group: name: "{{ vault_group }}" state: present - name: Create user vault become: true ansible.builtin.user: name: "{{ vault_group }}" home: "{{ vault_directory }}" shell: /bin/nologin # shell: /bin/nologin create_home: false group: "{{ vault_group }}" state: present
On créé ensuite le répertoire qui recevra le binaire, la config et les données de vault :
- name: Create vault directories become: true ansible.builtin.file: path: "{{ vault_directory }}/{{ item }}" owner: vault group: vault mode: "0755" state: directory loop: - data - bin - config
Pour éviter de télécharger à chaque exécution du playbook le binaire mettons en place un test que le binaire présent est bien celui avec la version attendue :
- name: Check if vault bin exist become: true ansible.builtin.stat: path: "{{ vault_directory }}/bin/vault" register: vault_exist
On vérifie que la version de Vault installé est celle attendue dans un bloc. Si la version n’est pas celle attendue, on arrête le service.
- name: Vault exist when: vault_exist.stat.exists block: - name: Check vault version become: true ansible.builtin.shell: cmd: "./vault --version | egrep -o '([0-9]{1,}\\.)+[0-9]{1,}'" chdir: "{{ vault_directory }}/bin" register: vault_version_installed changed_when: false - name: Stop Service if not good version when: vault_version_installed.stdout != vault_version become: true ansible.builtin.service: name: vault state: stopped
Si la version du binaire n’est pas celle attendue ou n’est pas présente, on le télécharge depuis le site officiel. On le décompresse et on le déplace dans le répertoire attendu.
- name: Install Vault become: true ansible.builtin.unarchive: src: "https://releases.hashicorp.com/vault/{{ vault_version }}/vault_{{ vault_version }}_linux_amd64.zip" dest: "{{ vault_directory }}/bin" owner: vault group: vault mode: "0755" remote_src: true when: not vault_exist.stat.exists or vault_version_installed.stdout != vault_version
On crée le service avec un template :
- name: Systemd unit become: true ansible.builtin.template: src: vault.service.j2 dest: /etc/systemd/system/vault.service force: true owner: root group: root mode: "0644" notify: Reload vault
Le template du service :
# {{ ansible_managed }}
[Unit]Description="HashiCorp Vault - A tool for managing pki and secrets"Documentation=https://www.vaultproject.io/docs/Requires=network-online.targetAfter=network-online.targetConditionPathExists={{ vault_directory }}
[Service]User={{ vault_user }}Group={{ vault_group }}ExecStart=/bin/sh -c 'exec {{ vault_directory }}/bin/vault server -config={{ vault_directory }}/config/vault.hcl'ExecReload=/bin/kill --signal HUP $MAINPIDKillMode=processKillSignal=SIGINTRestart=on-failureRestartSec=5TimeoutStopSec=30StartLimitInterval=60StartLimitBurst=3LimitNOFILE=524288LimitNPROC=524288LimitCORE=0
[Install]WantedBy=multi-user.target
On fait de même avec la config :
- name: Install config become: true ansible.builtin.template: src: vault.hcl.j2 dest: "{{ vault_directory }}/config/vault.hcl" owner: vault group: vault mode: "0755" notify: Restart vault register: vault_config
Le template qui au format hcl :
storage "file" { path = "{{ vault_directory }}/data"}
listener "tcp" { address = "0.0.0.0:8200" tls_disable = "{{ vault_tls_disabled }}"}
ui = "{{ vault_ui }}"disable_mlock = truelog_level = "Debug"
Et on démarre le service :
- name: Start vault become: true ansible.builtin.service: name: vault state: started when: not vault_config.changed
Je vous livre mon astuce pour lancer plusieurs actions dans un handler ansible, en incluant plusieurs taches :
- name: Restart vault become: true ansible.builtin.service: name: vault state: restarted
- name: Reload vault ansible.builtin.include_tasks: reload.yml
Le contenu du fichier reload.yml
:
- name: Reload Systemd become: true ansible.builtin.systemd: daemon_reload: true
- name: Reload Service become: true ansible.builtin.service: name: vault state: reloaded
Je suis en train de reconstruire mon homelab et je vous livrerai bientôt le code source de celui-ci dans sa totalité !
Exécution du Playbook et Vérification
Exécutez le playbook pour installer Vault sur vos serveurs.
ansible-playbook playbook_vault.yml
Connectez-vous à votre serveur et vérifiez que Vault est installé correctement et que le service fonctionne.
systemctl status vault
● vault.service - "HashiCorp Vault - A tool for managing pki and secrets" Loaded: loaded (/etc/systemd/system/vault.service; enabled; preset: enabled) Active: active (running) since Thu 2024-02-01 07:30:21 CET; 13min ago Docs: https://www.vaultproject.io/docs/ Main PID: 99824 (vault) Tasks: 9 (limit: 4454) Memory: 31.2M CPU: 1.470s CGroup: /system.slice/vault.service └─99824 /data/vault/bin/vault server -config=/data/vault/config/vault.hcl
En utilisant Ansible pour l’installation de Vault, vous bénéficiez d’une méthode automatisée et standardisée, réduisant les erreurs humaines et accélérant le processus de déploiement.
Initialisation du Vault
Une fois que Vault est installé et configuré, l’étape suivante est son initialisation. Cette étape est importante car elle implique la création de clés de déverrouillage (unseal keys) et d’un jeton racine (root token), qui sont essentiels pour l’accès à Vault.
Pour initialiser Vault, utilisez la commande suivante :
export VAULT_ADDR=http://127.0.0.1:8200
vault operator init
Cette commande va configurer le stockage de clés de chiffrement et générer un ensemble de clés de déverrouillage et un jeton racine. Par défaut, Vault génère 5 clés de déverrouillage et nécessite au moins 3 pour déverrouiller le serveur.
Pour simplifier dans un environnement de lab, vous pouvez réduire le nombre de clés requises :
export VAULT_ADDR=http://127.0.0.1:8200
vault operator init -key-shares 1 -key-threshold 1
Unseal Key 1: lWF1ue8BgtW3/19Uf49GaAicvaebxtFWlDFvEIKvs3s=
Initial Root Token: hvs.FkLQnkIPosIar9SSeDfdsFEb
Vault initialized with 1 key shares and a key threshold of 1. Please securelydistribute the key shares printed above. When the Vault is re-sealed,restarted, or stopped, you must supply at least 1 of these keys to unseal itbefore it can start servicing requests.
Vault does not store the generated root key. Without at least 1 keys toreconstruct the root key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum ofexisting unseal keys shares. See "vault operator rekey" for more information.
Cette commande crée une seule clé de déverrouillage.
Les clés de déverrouillage et le jeton racine sont les éléments les plus sensibles de Vault. Elles doivent être stockées avec le plus haut niveau de sécurité. En cas de compromission, un attaquant pourrait avoir un accès complet à vos secrets.
Pour un environnement de production, ces clés devraient être réparties entre des personnes de confiance et stockées dans des endroits sécurisés. Des solutions comme les gestionnaires de mots de passe d’entreprise, les coffres-forts numériques, ou même le stockage physique sécurisé peuvent être utilisés.
Le jeton racine donne un accès complet et sans restriction à Vault. Il doit être utilisé avec prudence et seulement quand c’est absolument nécessaire. Après l’initialisation initiale et la configuration, il est conseillé de le stocker en sécurité et de l’utiliser rarement.
Déverrouillage de Vault
Après l’initialisation de Vault, il est nécessaire de déverrouiller l’instance pour qu’elle devienne opérationnelle. Cette étape, appelée “unsealing”, est essentielle pour la sécurité et l’accessibilité de Vault.
Chaque fois que Vault démarre, il se lance dans un état scellé (sealed). Dans cet état, Vault est incapable d’accéder à ses données stockées ou de répondre aux demandes. Le déverrouillage est donc nécessaire après chaque redémarrage du serveur ou de l’instance Vault.
Si Vault a été scellé manuellement en réponse à une situation de sécurité (par exemple, une suspicion de compromission), il doit être déverrouillé une fois la situation résolue et la sécurité rétablie.
Pour déverrouiller Vault, utilisez la commande vault operator unseal
. Vous
devrez entrer les clés de déverrouillage générées lors de l’initialisation. Si
vous avez configuré Vault avec une seule clé de déverrouillage pour le lab,
une seule clé sera nécessaire. Dans un environnement de production avec un
schéma de clés multiple (par exemple, 5 clés avec un seuil de 3), vous devrez
fournir suffisamment de clés distinctes pour atteindre le seuil.
export VAULT_TOKEN=<votre token>
vault operator unseal <Votre_Clé_Unseal>
Unseal Key (will be hidden):Key Value--- -----Seal Type shamirInitialized trueSealed falseTotal Shares 1Threshold 1Version 1.15.4Build Date 2023-12-04T17:45:28ZStorage Type fileCluster Name vault-cluster-58439b8aCluster ID b7ffb63a-49cc-36c0-63cb-e3e9fdb8879bHA Enabled false
Répétez cette commande avec chaque clé unique jusqu’à ce que Vault soit déverrouillé. Le statut de déverrouillage sera affiché après chaque commande.
Après le déverrouillage, vérifiez que Vault fonctionne correctement en utilisant :
vault status
Ce statut doit indiquer que Vault est en état déverrouillé (unsealed) et prêt à l’emploi.
Audit et Monitoring de Vault
Un aspect important de la gestion de Vault est la mise en place d’un système d’audit et de monitoring efficace. Cela permet de suivre les activités au sein de Vault, d’identifier les problèmes potentiels et de garantir la conformité aux politiques de sécurité.
Activation des Logs d’Audit
Vault supporte plusieurs backends d’audit tels que les fichiers, Syslog et les sockets. Chaque backend a ses propres caractéristiques et convient à différents scénarios d’usage.
Pour activer un backend d’audit, utilisez la commande suivante. Par exemple, pour un fichier de log :
sudo touch /var/log/vault_audit.logsudo chown vault:vault /var/log/vault_audit.logsudo chmod 600 /var/log/vault_audit.logvault audit enable file file_path=/var/log/vault_audit.log
Cette commande configure Vault pour écrire les logs d’audit dans un fichier spécifié.
Configuration du Monitoring
Vault expose un endpoint /sys/health
que vous pouvez interroger pour
surveiller l’état de santé du service. Cela peut être intégré à des outils de
monitoring comme Prometheus ou Nagios.
Vault fournit également des métriques via un endpoint /sys/metrics
qui
peut être utilisé pour collecter des données sur les performances et
l’utilisation. Ces métriques peuvent être surveillées via des systèmes comme
Prometheus.
Configurez des alertes basées sur les logs d’audit et les métriques pour être informé en cas de comportement anormal ou de problèmes de performance.
Conclusion et Perspectives
Avec les étapes couvertes dans ce guide, vous avez maintenant une installation de Vault, prête à être intégrée dans votre environnement de travail. Nous avons parcouru l’installation, la configuration initiale, la mise en place de l’audit et du monitoring. Ces composantes constituent le cœur d’un déploiement efficace de Vault, offrant une fondation solide pour la gestion sécurisée de vos secrets et données sensibles.
Cependant, notre voyage avec Vault ne s’arrête pas là. Dans un prochain guide, nous explorerons en détail comment utiliser Vault pour gérer les infrastructures à clés publiques (PKI). Cette gestion des PKI est un élément important pour renforcer davantage la sécurité de vos communications et de vos données.
En particulier, nous verrons comment configurer Vault pour émettre des certificats TLS/SSL, ce qui est essentiel pour activer HTTPS sur vos serveurs et applications dont notre Vault. Ce pas supplémentaire vous permettra de garantir une communication sécurisée et chiffrée, non seulement au sein de votre infrastructure, mais aussi avec vos utilisateurs finaux.