Gérer vos secrets avec Vault – Partie1/2

De plus en plus menacée, la sécurité informatique est devenue un enjeu majeur pour les entreprises désireuses de consolider leurs anciennes architectures et moderniser leurs nouvelles. Des méthodes et des outils existent pour renforcer la sécurité des données : Vault apporte une réponse technique pour le stockage, et l’accès à vos secrets. Découvrez comment l’installer et l’exploiter !

Outil utilisé : Vault/hashicorp v0.6.1
Site du projet : https://www.vaultproject.io/

Qu’est-ce que Vault?
Vault permet de stocker des secrets de manière sécurisée, tels que vos mots de passe, vos clés privées, vos identifiants de connexion… Il permet d’en contrôler l’accès, mais aussi de renforcer l’authentification à des ressources (génération de mots de base d’accès tournant pour vos bases de données, ssh avec OTP…). C’est un produit sous licence publique Mozilla écrit en Go qui offre ses services via un interfaçage RESTs. Mais Vault est-il sécurisé ? La gestion de la mémoire en Go et la libre consultation du code source sont des points positifs d’autant plus qu’il a été audité par le groupe iSEC/NCC (auditeur de TrueCrypt et OpenSSL)[ISEC].

1. Installation

L’objectif est de renforcer l’usage des secrets dans une architecture trois tiers existante (projetA), composée de trois machines : un apache avec SSL, une application et une base de données MySQL.

Actuellement, il n’existe aucun paquet officiel Vault. Vous pouvez donc faire votre propre paquet ou l’installer manuellement avec cette procédure.

1.1 Préparer le système à recevoir Vault

1. Créez un utilisateur « vault » dédié. Téléchargez et installez le binaire pour votre plateforme et créez les répertoires pour la configuration et les données.

2. Ajoutez au binaire la capacité de verrouiller une zone mémoire pour éviter que le système vide des pages mémoire dans la swap et expose vos secrets.

3. Facilitez la gestion de votre service avec systemd.

Avant de démarrer Vault, il faut créer les certificats serveurs pour bénéficier du TLS.

1.2 Créer votre infrastructure de certificats

Si vous ne pouvez pas acheter un certificat signé par une autorité de certification(AC) connue, il faudra suivre cette procédure.

Créons une AC qui permettra de signer notre certificat serveur et de la distribuer aux clients. Pour faciliter l’administration en local, l’ajout de l’extension (subjectAltName) avec l’IP 127.0.0.1 sera pratique.

1. Ajoutez à votre configuration openssl une extension (localisation variant suivant les distributions, sous Debian /etc/ssl/openssl.cnf) :

2. Lancez la création de l’AC et du certificat serveur. Choisissez un mot de passe robuste pour votre clé privée d’AC pour assurer la sécurité des certificats et garantir le transport des secrets !

Vault est intransigeant avec la conformité des certificats utilisés. Sans certificat serveur avec une AC associée et enregistrée sur votre système, vous devrez rajouter des paramètres supplémentaires aux clients (-tls-skip-verify) qui affaibliraient la sécurité. Utiliser Vault en production, sans chiffrer le transport est absurde.

3. Distribuez votre certificat d’autorité (ca_vault.crt) à vos clients et à votre serveur, puis mettez à jour la base des certificats de confiance.

1.3 Le fichier de configuration

1. Écrivez un fichier de configuration avec le module de stockage de secret « File ». Il existe d’autres modules notamment pour les bases de données et ainsi que ceux qui supportent la haute disponibilité, comme consul, zookeeper ou etcd.

Vault stocke ses secrets et son arborescence sous cette forme : les branches sont des répertoires et les feuilles sont des fichiers contenant les secrets. Donc aucun secret ne doit être stocké dans le chemin. De plus, avec le module « File », la lecture/écriture d’un secret passe par l’ouverture/fermeture systématique des fichiers. Il est donc mal adapté aux fortes charges.

2. Activez au redémarrage et démarrez Vault :

1.4 Initialisation de la clé de chiffrement

Lors du 1er démarrage, Vault va créer une clé de chiffrement qui permettra de chiffrer les secrets. Elle est protégée par le mécanisme du partage de clé de Shamir, qui permet de diviser le secret en plusieurs parties nécessitant un minimum de participants pour la révéler (cérémonie des clés).

1. Initialisez-le (ici avec 5 clés dont 3 suffisent pour le desceller) :

2. Distribuez judicieusement les « Unseal key » aux différentes personnes de votre organisation pour garantir une bonne ségrégation des droits.

Le « root token » donnera les pleins pouvoirs pour configurer les futurs droits d’accès.

3. Descellez la clé de chiffrement. Trois participants minimums devront entrer leur clé (hex ou base64) :

Vault a maintenant déchiffré et chargé en mémoire la clé de chiffrement. Désormais, vous pouvez vous authentifier et créer vos premiers secrets !

2. Stocker des secrets

1. Authentifiez-vous avec le root token.

Pour l’organisation, la génération et la classification de secrets (« stockage logique »), Vault utilise un système d’arborescence, comme un système de fichiers, où les chemins racines se montent et se démontent.

Le chemin détermine l’URL REST d’accès à l’information et sa classification. Chaque type de module possède les propriétés présentées dans la partie description avec leur durée de vie respective.

Vous pouvez ajouter des points de montage personnalisés, par exemple avec le module « generic » :

Contrairement à un système de fichiers Linux, le démontage d’un chemin entraîne la destruction de tous ses secrets.

2.1 Stockage de la clé de déchiffrement SSL de notre certificat apache

1. Stockez votre mot de passe de déchiffrement de votre clé privée SSL relatif au projetA et lisez-le :

Le refresh_interval informe le client de la durée de rafraîchissement du secret, grâce au module « generic », c’est indicatif. Il a un grand intérêt lorsque l’on utilise un système de rotation des secrets (MySQL, OTP…), pour la récupération du nouveau mot de passe valide.

2. Modifiez votre configuration apache pour lire le mot de passe de chiffrement de clé privée SSL à partir d’un script (paramètre SSLPassPhraseDialog) :

3. Écrivez le script correspondant :

Ne mettez pas votre « root-token » dans le script, car il a accès à tous les secrets. Nous verrons par la suite comment créer des tokens avec des accès restreints.

2.2 Générer des comptes MySQL tournants

2.2.1 Configuration du module

L’objectif du module est de fournir à Vault un utilisateur MySQL avec les droits nécessaires pour générer/détruire à la volée des identifiants/mots de passe pour un type de profil donné (lecture, écriture…), souhaité pour notre application.

1. Créez un utilisateur « vault_gen » sur votre MySQL avec les droits nécessaires pour ajouter/supprimer des utilisateurs et leur attribuer des droits sur la base de données «projetA» :

2. Montez le module MySQL sur le point de montage « mysql.projetA ». Il sera dédié à notre instance MySQL, et les identifiants seront à renouveler toutes les 10 minutes :

3. Configurez le module avec votre utilisateur MySQL « vault_gen ».

4. Créez les profils de compte désirés comme « lecture, écriture et dba ». Observez ci-dessous un exemple pour la lecture seule à adapter pour vos autres comptes (droit après le « GRANT »).

La création des rôles est entièrement personnalisable grâce aux modèles et aux variables « {{name}} »/« {{password}} », ainsi que les requêtes SQL. Il est tout à fait possible de rajouter d’autres instructions SQL dans la chaîne.

Pour supprimer un rôle, il suffit de détruire la branche correspondante :

La suppression d’un rôle et le démontage du module ne coupent pas les connexions MySQL existantes (pas de « kill »).

Denis Mortreux

La seconde partie de cet article sera publiée prochainement sur le blog, restez connectés 😉

Retrouvez cet article (et bien d’autres) dans Linux Pratique n°100, disponible sur la boutique et sur la plateforme de lecture en ligne Connect !

Laisser un commentaire