Si vous découvrez Vault, HashiCorp nous fournit une superbe documentation. En témoigne la prolifique section Learn du site, tenue à jour au fil des versions : https://learn.hashicorp.com/vault/. Je vous invite à vous y plonger sans retenue !
Je vous propose ici des ressources complémentaires et des zooms sur des éléments de la doc qui devraient vous être utiles dans votre aventure avec Vault, notamment sur le chemin de la production.
Rien de plus simple, reportez-vous à cet arbre de décision.
Veuillez noter qu’il n’est pas encore question de l’intégration du stockage à Vault annoncé avec la version v1.2.0 : ce n’est pas encore supporté par HashiCorp et l’architecture de référence reste donc celle basée sur Consul. Les choses devraient changer courant 2020, et ce sera l’occasion de faire un nouvel article à ce sujet.
Deux patterns d'intégration sont présentés par Hashicorp dans le chapitre “Secure Introduction of Vault Clients” et ils couvrent tous les cas d’usage que j’ai pu rencontrer jusqu’ici. Ils offrent une résolution efficace au problème de la distribution du secret initial, permettant d’authentifier l’application cliente auprès de Vault.
Les voici résumés rapidement :
http://169.254.169.254/latest/dynamic/instance-identity/document
depuis une VM EC2 permet d’obtenir son identité signée, et Vault peut la vérifier auprès de l’API AWS pour authentifier la VM appelante.Service Account
afin d’authentifier un Workload auprès de Vault.En complément de ces deux patterns, l’utilisation de Vault Agent permet de réduire l’adhérence de l’application à Vault en lui évitant de faire elle-même les différents appels au service. Vault Agent est un daemon qui s’exécute en tâche de fond. Il récupère et rafraîchit les secrets nécessaires à l’application et les lui dépose sur le système de fichier.
Il existe plusieurs alternatives à Vault Agent, dont :
initContainer
, mais se limite à certains types de secrets.De mon point de vue, l’implémentation actuelle de Vault Agent est supérieure à celles de Daytona et Vault Control Tool (plus complète, mieux documentée, mieux sécurisée). Ceci dit, vu la jeunesse de Daytona et de Vault Control Tool, on peut s’attendre à ce qu’ils s’améliorent rapidement et évoluent en répondant à des cas d’usage complémentaires.
Long story short : Vault s’intègre très bien à Kubernetes. Et étant donné la popularité actuelle de K8s, la documentation et les articles ne manquent pas sur le sujet ! J’ai sélectionné ici une paire de liens vers des outils à priori moins connus mais qui pourraient vous être bien utiles.
Le premier concerne le tout récent chart Helm fourni et maintenu par HashiCorp, qui vous permet donc de déployer Vault dans K8s aux petits oignons.
Le second lien vous emmène sur le repo de Bank Vaults, un projet de Banzai Cloud qui nous met à disposition sa boîte à outils pour Vault. Elle est composée d’un set d’outils qu’ils utilisent en interne et le projet est activement maintenu. Concrètement, ce set contient un opérateur K8s pour Vault, un binaire pour injecter des secrets de Vault dans l’ENV
d’un conteneur, un wrapper du CLI Vault pour faciliter les opérations, un unsealer de Vault etc. L’ensemble est très complet et couvre une variété d’usages tous complémentaires.
La doc étant peu lisible, la meilleure source d’info que j’ai trouvé jusqu’ici sont les articles publiés sur le blog de Banzai Cloud. Je n'ai pas encore testé Bank Vaults et n’ai donc pas d’avis à vous partager dans l'immédiat. Je vous en reparlerai dès que c’est le cas !
HashiCorp nous donne une liste de recommandations à appliquer pour sécuriser au mieux nos instances Vault en production. C’est un doc bien connu mais je trouve important de le garder en tête. Et je vous encourage bien évidemment à appliquer toutes les recommandations données, puisqu’elles répondent parfaitement aux modèles de sécurité et de menace élaborés par HashiCorp pour Vault.
Autre documentation utile et à laquelle on pense généralement moins souvent : celle de Consul. Elle présente le modèle de sécurité utilisé par la solution et les recommandations associées. Bien évident, ça ne concerne que les déploiements de Vault qui s'appuient sur Consul.
Hashicorp nous a fourni à tous un guide complet du monitoring pour Vault et pour son backend Consul. Ce guide a été réalisé pour Telegraf + InfluxDB + Grafana, mais il vous sera utile avec n’importe quelle autre solution de monitoring. En effet, chacune des métriques y est définie de manière intelligible, avec la signification de ses valeurs, son impact sur le comportement du système ainsi que les seuils d’alerte associés.
Un petit exemple :
L’activation de l’audit log dans Vault est indispensable d’un point de vue de la sécurité et de la gestion des incidents associée. Trois options sont disponibles pour l’écriture des logs d’audit : fichier local, socket Unix ou Syslog (local uniquement).
Mes recommandations :
syslog
, sachez qu’elle ne permet que d’envoyer à un agent local à la machine. C’est un parti pris d’implémentation de la part d’HashiCorp. De plus, Syslog est au départ un protocole basé sur UDP. Syslog over TCP n’est arrivé qu’avec la RFC 6587 en 2012. Autant dire que l’option est indisponible ou inactive sur beaucoup de serveurs. Vérifiez donc bien que vos audit logs
sont envoyés sur un Syslog en TCP. En effet, UDP ne vous garantit pas le transport des paquets, et la taille des messages d’audit de Vault dépasse facilement la taille maximum d’un paquet UDP.audit devices
, dont au moins un de type file
. Vault arrête de servir les requêtes s’il ne peut pas écrire son audit log. Activer syslog
et file
, par exemple, permet donc de palier à un système de fichier plein ou à un service Syslog indisponible. Et donc si vous choisissez d’activer deux audit devices
de type file
, faites-les pointer sur deux filesystems distincts !socket
que si vous n’avez pas d'autre option. Il permet au choix de déverser les logs dans un socket de type TCP, UDP ou UNIX. Ceci dit, la documentation précise que l’implémentation actuelle permet la perte de message (dans un cas précis et identifié, mais tout de même).La procédure de mise à jour est assez simple (merci Golang) : il suffit de faire un backup des données, puis remplacer le binaire Vault et de redémarrer le service. L’opération reste similaire en HA, avec une attention à porter en plus sur l’ordonnancement des opérations.
Mais pour bien faire, scrutez attentivement les changements apportés par la nouvelle version de Vault. HashiCorp publie un guide de mise à jour pour chaque version, et vous y trouverez des notes sur les changements de comportement de Vault, ainsi qu’une liste des problèmes connus avec cette nouvelle version.
À titre d’exemple pour la version 1.2.0 :
AppRole
et d’attendre un fix en 1.2.1AppRole
, ou encore la gestion des CN
dans les groupes LDAP.Autant dire que dès que Vault est intégré à plusieurs autres systèmes, vous aurez probablement des actions à intégrer dans votre procédure de mise jour pour traiter les impacts sur les systèmes tiers.
Ne partez pas d’une feuille blanche pour définir les règles de contrôle d’accès aux APIs de Vault ! Hashicorp fournit dans son guide “Adopting Hashicorp Vault” un prototype de configuration basique et efficient à partir duquel itérer.
Quatre rôles y sont définis :
namespace
(version entreprise).namespace
aussi, et pouvant gérer les consumers, les secret engines, les policies et les moyens d’authentification.À l’exception des Consumers, ces rôles sont nécessaires à la bonne administration d’une instance Vault de production. Le document les décrit précisément et en donne la version déjà écrite en HCL. Exemple pour les Auditers :
Reste ensuite à faire correspondre ces rôles à des profils de votre organisation. Si ce niveau de granularité n’est pas suffisant, Vault permet d’ajouter dans sa version enterprise des control groups. L’idée est de créer une forme de workflow d’approbation sur certaines tâches. Je vous renvoie encore une fois à la doc pour les détails d’implémentation.
L’idée est de compléter le CLI Vault pour la gestion des tokens d’accès à l’API. Dans le fonctionnement par défaut, Vault va stocker le token obtenu après authentification dans le fichier ~/.vault-token
. Ce fonctionnement est rapidement limité lorsque l’on travaille sur plusieurs environnements. Deux exemples de token helpers
qui pourront vous servir :
~/.vault-token
mais en les associant à la variable $VAULT_ADDR.Le Vault Provider de Terraform est le meilleur moyen - à ma connaissance - de gérer les ressources Vault et de les déployer dans vos différents environnements jusqu’à la production. Cela vous permet de créer et de versionner vos configs Vault dans un repo Git et de bénéficier de la bonne intégration des deux outils.
L’équipe de Green Reed Technology nous fournit gracieusement un petit script permettant d’obtenir plus d’informations opérationnelles sur nos instances Vault.
En substance, ce script récupère par API les méthodes d’authentification actives (de type userpass
et AppRole
seulement pour l’instant) et renvoie un JSON avec la liste des policies
associées à chaque utilisateur / application. Je trouve ces informations très utiles pour auditer dans le temps les permissions données aux utilisateurs et aux applications. Quelques explications dans ce post.
Le projet vaultbot s’est inspiré du fonctionnement de certbot
(LetsEncrypt). Programmé pour s’exécuter régulièrement, il va mettre à disposition un certificat et le renouveler dans le temps. Là encore, un outil bien pratique pour ne pas avoir à intégrer une application directement à Vault et qui vient en complément des envconsul
et consul-template
.
Voici pour mon petit tour des outils et recommandations pour votre aventure avec Vault. Comme vous pouvez le voir, l’écosystème est déjà riche pour un produit qui n’est arrivé à maturité qu’en décembre 2018 (date de la release v1.0), et cela devrait encore croître dans les mois à venir. Un repo GitHub à mettre dans vos favoris est d’ailleurs awesome-vault-tools.
Si besoin d’accompagnement et de conseil pour votre projet Vault, venez nous en parler !