Une introduction à la chambre forte

1. Vue d’ensemble

Dans ce didacticiel, nous allons explorer Hashicorp’s Vault - , un outil populaire utilisé pour gérer en toute sécurité des informations sensibles dans les architectures d’applications modernes .

Les principaux sujets que nous aborderons comprennent:

  • Quel problème Vault essaie-t-il de résoudre?

  • Architecture et concepts principaux de Vault

  • Mise en place d’un environnement de test simple

  • Interaction avec Vault à l’aide de son outil de ligne de commande

2. Le problème des informations sensibles

Avant d’entrer dans Vault, essayons de comprendre le problème qu’il essaie de résoudre: la gestion des informations sensibles.

  • La plupart des applications ont besoin d’accéder à des données sensibles pour fonctionner correctement ** . Par exemple, une application de commerce électronique peut avoir un nom d’utilisateur/mot de passe configuré quelque part afin de se connecter à sa base de données. Des clés d’API peuvent également être nécessaires pour s’intégrer à d’autres fournisseurs de services, tels que des passerelles de paiement, des services logistiques et d’autres partenaires commerciaux.

Les informations d’identification de base de données et les clés d’API sont quelques exemples d’informations sensibles que nous devons stocker et mettre à la disposition de nos applications de manière sécurisée.

Une solution simple consiste à stocker ces informations d’identification dans un fichier de configuration et à les lire au moment du démarrage. Le problème avec cette approche est évident, cependant. Quiconque a accès à ce fichier partage les mêmes privilèges de base de données que notre application - généralement lui donnant un accès complet à toutes les données stockées.

Nous pouvons essayer de rendre les choses un peu plus difficiles en cryptant ces fichiers. Cette approche, cependant, n’apportera pas grand-chose en termes de sécurité globale.

Principalement, car notre application doit avoir accès à la clé principale.

Le cryptage, utilisé de cette manière, ne fera que créer un «faux» sentiment de sécurité.

Les applications modernes et les environnements cloud ont tendance à ajouter une complexité supplémentaire: services distribués, bases de données multiples, systèmes de messagerie, etc., tous ont des informations sensibles dispersées un peu partout, augmentant ainsi le risque de violation de la sécurité.

Alors, que pouvons-nous faire? Allons-y!

3. Qu’est-ce que Vault?

Hashicorp Vault aborde le problème de la gestion des informations sensibles - un secret dans le jargon de Vault. "Gérer" dans ce contexte signifie que Vault contrôle tous les aspects d’une information sensible : sa génération, son stockage, son utilisation et enfin sa révocation.

Hashicorp propose deux versions de Vault. La version open-source, utilisée dans cet article, est libre d’utilisation, même dans les environnements commerciaux. Une version payante est également disponible. Elle comprend le support technique pour différents SLA et des fonctionnalités supplémentaires, telles que le support HSM (Hardware Security Module).

3.1. Architecture

L’architecture de Vault est extrêmement simple. Ses composants principaux sont:

  • Un backend de persistance - stockage pour tous les secrets

  • Un serveur API qui gère les requêtes des clients et effectue des opérations sur

des secrets ** Un nombre de moteurs __secret, __one pour chaque type de secret pris en charge

type

En déléguant tous les traitements de secrets à Vault, nous pouvons atténuer certains problèmes de sécurité:

  • Nos applications ne doivent plus les stocker, il suffit de demander à Vault

au besoin et le jeter ** Nous pouvons utiliser des secrets de courte durée, limitant ainsi la «fenêtre de

opportunité "où un attaquant peut utiliser un secret volé

Vault chiffre toutes les données avec une clé de chiffrement avant de l’écrire dans le magasin. Cette clé de cryptage est cryptée par une autre clé encore - la clé principale, utilisée uniquement au démarrage.

Un point clé de la mise en œuvre de Vault est qu’elle ne stocke pas la clé principale dans le serveur. Cela signifie que même Vault ne peut pas accéder à ses données sauvegardées après le démarrage. À ce stade, une instance de Vault est considérée comme étant dans un état "scellé".

Ensuite, nous allons suivre les étapes nécessaires à la génération de la clé principale et au décachetage d’une instance de Vault.

Une fois non scellé, Vault sera prêt à accepter les demandes d’API. Bien entendu, ces demandes nécessitent une authentification, ce qui nous amène à la façon dont Vault authentifie les clients et décide ce qu’ils peuvent ou ne peuvent pas faire.

3.2. Authentification

  • Pour accéder aux secrets dans Vault, un client doit s’authentifier à l’aide de l’une des méthodes prises en charge ** . La méthode la plus simple utilise des jetons, qui ne sont que des chaînes envoyées à chaque demande d’API à l’aide d’un en-tête HTTP spécial.

Lors de l’installation initiale, Vault génère automatiquement un «jeton racine».

Ce jeton est l’équivalent du superutilisateur racine sur les systèmes Linux. Par conséquent, son utilisation devrait être limitée au minimum. Il est recommandé d’utiliser ce jeton racine uniquement pour créer d’autres jetons avec moins de privilèges, puis le révoquer. Ce n’est cependant pas un problème, car nous pourrons générer plus tard un autre jeton racine à l’aide des clés unseal.

Vault prend également en charge d’autres mécanismes d’authentification tels que LDAP, JWT, les certificats TLS, entre autres. Tous ces mécanismes reposent sur le mécanisme de jeton de base: une fois que Vault aura validé notre client, il fournira un jeton que nous pourrons utiliser pour accéder à d’autres API.

Les jetons sont associés à quelques propriétés. Les principales propriétés sont:

  • Un ensemble de Policies associés (voir section suivante)

  • Temps de vivre

  • Si cela peut être renouvelé

  • Nombre d’utilisation maximum

Sauf indication contraire, les jetons créés par Vault formeront une relation parent-enfant. Un jeton enfant peut avoir tout au plus le même niveau de privilèges que son parent.

L’inverse n’est pas vrai: nous pouvons, et faisons généralement, créer un jeton enfant avec des politiques restrictives.

  • Lorsque nous invalidons un jeton, tous les jetons enfants et leurs descendants sont également invalidés ** .

3.3. Politiques

  • Les politiques définissent exactement les secrets auxquels un client peut accéder et les opérations qu’il peut effectuer avec eux ** Voyons à quoi ressemble une politique simple:

path "secret/accounting" {
    capabilities =["read"]}

Ici, nous avons utilisé la syntaxe HCL (Configuration Language de Hashicorp) pour définir notre politique. Vault prend également en charge JSON à cette fin, mais nous nous en tiendrons à HCL dans nos exemples car il est plus facile à lire.

  • Les stratégies dans Vault sont “refuser par défaut” ** . Un jeton attaché à cet exemple de politique obtiendra l’accès aux secrets stockés sous secret/accounting et rien d’autre. Au moment de la création, un jeton peut être associé à plusieurs stratégies. Ceci est très utile car il nous permet de créer et de tester des stratégies plus petites, puis de les appliquer si nécessaire.

Un autre aspect important des politiques est qu’elles exploitent l’évaluation paresseuse. Cela signifie que nous pouvons mettre à jour une politique donnée et que tous les jetons seront affectés immédiatement.

Les stratégies décrites jusqu’à présent sont également appelées stratégies de liste de contrôle d’accès ou stratégies de liste de contrôle d’accès. Vault prend également en charge deux types de stratégies supplémentaires: les stratégies EGP et RGP. Ceux-ci ne sont disponibles que dans les versions payantes et étendent la syntaxe de politique de base avec le support Sentinel .

Lorsque cela est disponible, cela nous permet de prendre en compte dans nos stratégies des attributs supplémentaires tels que l’heure du jour, plusieurs facteurs d’authentification, l’origine du réseau du client, etc. Par exemple, nous pouvons définir une politique qui autorise l’accès à un secret donné uniquement pendant les heures ouvrables.

Vous trouverez plus de détails sur la syntaxe de la politique dans Vault’s documentation .

4. Types secrets

Vault prend en charge différents types de secrets qui traitent différents cas d’utilisation:

  • Key-Value: simples paires clé-valeur statiques

  • Données d’identification générées : générées par Vault à la demande

par un client ** Cryptographic keys : utilisé pour exécuter des fonctions cryptographiques avec

données client

Chaque type de secret est défini par les attributs suivants:

  • Un mount point, qui définit son préfixe d’API REST

  • Un ensemble d’opérations exposées via l’API correspondante

  • Un ensemble de paramètres de configuration

Une instance secrète donnée est accessible via un path , un peu comme une arborescence de répertoires dans un système de fichiers. Le premier composant de ce chemin correspond au point de montage où sont situés tous les secrets de ce type .

Par exemple, la chaîne _secret/my-application correspond au chemin sous lequel nous pouvons trouver des paires clé-valeur pour my-application_ .

4.1. Secrets de valeur-clé

  • Les secrets clé-valeur sont, comme leur nom l’indique, de simples paires disponibles sous un chemin donné ** . Par exemple, nous pouvons stocker la paire foo = bar sous le chemin /secret/my-application.

Plus tard, nous utilisons le même chemin pour récupérer la même paire ou des paires - plusieurs paires peuvent être stockées sous le même chemin.

Vault supporte trois types de secrets Key-Value:

  • Paires paires non-versionnées , où les mises à jour remplacent les valeurs existantes

  • Versioned Key-Pairs, qui conservent un nombre configurable d’anciens

les versions ** Cubbyhole , un type spécial de paires de clés non versionnées dont les valeurs

sont étendus à un jeton d’accès donné (plus sur ceux plus tard).

Les secrets de valeur-clé sont statiques par nature, il n’existe donc pas de concept d’expiration associé. Le principal cas d’utilisation de ce type de secret est de stocker des informations d’identification pour accéder à des systèmes externes, tels que des clés d’API.

Dans de tels scénarios, les mises à jour des identifiants sont un processus semi-manuel, nécessitant généralement l’acquisition de nouveaux identifiants et utilisant la ligne de commande de Vault ou son interface utilisateur pour saisir les nouvelles valeurs.

4.2. Secrets générés dynamiquement

  • Les secrets dynamiques sont générés à la volée par Vault à la demande d’une application ** . Vault prend en charge plusieurs types de secrets dynamiques, notamment les suivants:

  • Identifiants de base de données

  • Paires de clés SSH

  • Certificats X.509

  • Informations d’identification AWS

  • Comptes de service Google Cloud

  • Comptes Active Directory

Tous ceux-ci suivent le même modèle d’utilisation. Tout d’abord, nous configurons le moteur secret avec les détails nécessaires pour se connecter au service associé.

Ensuite, nous définissons un ou plusieurs __roles, __qui décrivent la création secrète réelle

Prenons le moteur secret de la base de données comme exemple. Tout d’abord, nous devons configurer Vault avec toutes les informations de connexion à la base de données des utilisateurs, y compris les informations d’identification d’un utilisateur préexistant disposant des privilèges d’administrateur pour créer de nouveaux utilisateurs.

Ensuite, nous créons un ou plusieurs rôles (rôles Vault, pas de rôles base de données) contenant les instructions SQL réelles utilisées pour créer un nouvel utilisateur. Celles-ci incluent généralement non seulement l’instruction de création d’utilisateur, mais également toutes les instructions grant requises pour accéder aux objets de schéma (tables, vues, etc.).

  • Lorsqu’un client accède à l’API correspondante, Vault crée un nouvel utilisateur temporaire dans la base de données à l’aide des instructions fournies et renvoie ses informations d’identification ** . Le client peut ensuite utiliser ces informations d’identification pour accéder à la base de données au cours de la période définie par l’attribut de durée de vie du rôle demandé.

Une fois que les informations d’identification ont atteint leur délai d’expiration, Vault révoquera automatiquement tout privilège associé à cet utilisateur. Un client peut également demander à Vault de renouveler ces informations d’identification. Le processus de renouvellement n’aura lieu que s’il est pris en charge par le pilote de base de données spécifique et autorisé par la stratégie associée.

4.3. Clés cryptographiques

Les moteurs secrets de type gèrent des fonctions cryptographiques telles que le cryptage, le décryptage, la signature, etc. Toutes ces opérations utilisent des clés cryptographiques générées et stockées en interne par Vault . Sauf indication explicite, Vault n’exposera jamais une clé cryptographique donnée.

L’API associée permet aux clients d’envoyer des données en texte brut Vault et de recevoir une version chiffrée de celles-ci. Le contraire est également possible: nous pouvons envoyer des données cryptées et récupérer le texte original.

Actuellement, il n’y a qu’un seul moteur de ce type: le moteur Transit .

Ce moteur prend en charge les types de clés courants, tels que RSA et ECDSA, ainsi que Convergent Encryption. Lorsque ce mode est utilisé, une valeur de texte en clair donnée donne toujours le même résultat Cyphertext, propriété très utile dans certaines applications.

Par exemple, nous pouvons utiliser ce mode pour chiffrer les numéros de carte de crédit dans un tableau du journal des transactions. Avec le cryptage convergent, chaque fois que nous insérons une nouvelle transaction, la valeur cryptée de la carte de crédit serait la même, permettant ainsi l’utilisation de requêtes SQL classiques pour la création de rapports, la recherche, etc.

5. Configuration du coffre-fort

Dans cette section, nous allons créer un environnement de test local afin de tester les capacités de Vault.

Le déploiement de Vault est simple: il suffit de download le package qui correspond à notre système d’exploitation et extrait son exécutable ( _vault ou vault.exe _ sous Windows) dans un répertoire de notre chemin PATH.

  • Cet exécutable contient le serveur et est également le client standard ** .

Il y a aussi une image officielle de Docker disponible , mais nous ne la couvrirons pas ici.

Vault prend en charge un mode development , ce qui convient très bien pour des tests rapides et pour s’habituer à son outil de ligne de commande, mais il est beaucoup trop simpliste pour les cas d’utilisation réels: toutes les données sont perdues au redémarrage et l’accès à l’API utilise HTTP pur.

Au lieu de cela, nous utiliserons un stockage persistant basé sur fichier et une configuration HTTPS afin d’explorer certains détails de la configuration réelle qui peuvent être une source de problèmes.

5.1. Démarrage de Vault Server

Vault utilise un fichier de configuration utilisant le format HCL ou JSON. Le fichier suivant définit toute la configuration nécessaire au démarrage de notre serveur à l’aide d’un stockage de fichiers et d’un certificat auto-signé:

storage "file" {
  path = "./vault-data"
}
listener "tcp" {
  address = "127.0.0.1:8200"
  tls__cert__file = "./src/test/vault-config/localhost.cert"
  tls__key__file = "./src/test/vault-config/localhost.key"
}

Lançons maintenant Vault. Ouvrez un shell de commande, accédez au répertoire contenant notre fichier de configuration et exécutez cette commande:

$ vault server -config ./vault-test.hcl

Vault va démarrer et afficher quelques messages d’initialisation. Ils incluront sa version, quelques détails de configuration et l’adresse où l’API est disponible. C’est tout - notre serveur Vault est opérationnel.

5.2. Initialisation du coffre

Notre serveur Vault est en cours d’exécution, mais comme il s’agit de sa première exécution, nous devons l’initialiser.

Ouvrons un nouveau shell et exécutons les commandes suivantes pour y parvenir:

$ export VAULT__ADDR=https://localhost:8200
$ export VAULT__CACERT=./src/test/vault-config/localhost.cert
$ vault operator init

Ici, nous avons défini quelques variables d’environnement, nous n’avons donc pas besoin de les transmettre à Vault à chaque fois en tant que paramètres:

  • VAULT ADDR__: URI de base où notre serveur d’API servira les requêtes

  • VAULT CACERT__: chemin d’accès à la clé publique du certificat de notre serveur

Dans notre cas, nous utilisons VAULT CACERT__ pour pouvoir utiliser HTTPS pour accéder à l’API de Vault. Nous en avons besoin parce que nous utilisons des certificats auto-signés.

Cela ne serait pas nécessaire pour les environnements de production, où nous avons généralement accès aux certificats signés par CA.

Après avoir lancé la commande ci-dessus, nous devrions voir un message comme celui-ci:

Unseal Key 1: <key share 1 value>
Unseal Key 2: <key share 2 value>
Unseal Key 3: <key share 3 value>
Unseal Key 4: <key share 4 value>
Unseal Key 5: <key share 5 value>

Initial Root Token: <root token value>

... more messages omitted

Les cinq premières lignes sont les partages de clé principale que nous utiliserons ultérieurement pour libérer le stockage de Vault. Veuillez noter que Vault affiche uniquement les partages de clé principale lors de l’initialisation - et jamais plus. ** Prenez note et stockez-les en toute sécurité sinon nous perdrons l’accès à nos secrets au redémarrage du serveur!

Prenez également note du jeton de racine, car nous en aurons besoin plus tard.

Contrairement aux clés d’annulation de scellement, les jetons racine peuvent facilement être générés ultérieurement ; il est donc prudent de les détruire une fois toutes les tâches de configuration terminées. Etant donné que nous émettrons plus tard des commandes nécessitant un jeton d’authentification, sauvegardons le jeton racine pour le moment dans une variable d’environnement:

$ export VAULT__TOKEN=<root token value> (Unix/Linux)

Voyons l’état de notre serveur maintenant que nous l’avons initialisé, avec la commande suivante:

$ vault status
Key                Value
---                -----
Seal Type          shamir
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3
Unseal Nonce       n/a
Version            0.10.4
HA Enabled         false

Nous pouvons voir que Vault est encore scellé. Nous pouvons également suivre les progrès de décachetage: «0/3» signifie que Vault a besoin de trois actions, mais n’en a pas eu jusqu’à présent. Allons de l’avant et fournissons-lui nos actions.

5.3. Voûte unseal

Nous déverrouillons maintenant Vault afin de pouvoir commencer à utiliser ses services secrets. Nous devons fournir trois des cinq actions principales pour compléter le processus d’annulation du scellement:

$ vault operator unseal <key share 1 value>
$ vault operator unseal <key share 2 value>
$ vault operator unseal <key share 3 value>

Après avoir émis chaque commande, le coffre-fort imprimera la progression de descellement, y compris le nombre de partages dont elle a besoin. Lors de l’envoi du dernier partage de clé, nous verrons un message comme celui-ci:

Key             Value
---             -----
Seal Type       shamir
Sealed          false
... other properties omitted

La propriété «Sealed» est dans ce cas «false», ce qui signifie que Vault est prêt à accepter les commandes.

6. Test du coffre

Dans cette section, nous allons tester notre configuration Vault en utilisant deux des types de secrets pris en charge: clé/valeur et base de données. Nous montrerons également comment créer de nouveaux jetons auxquels sont attachées des stratégies spécifiques.

6.1. Utilisation de secrets clé/valeur

Commençons par stocker les paires clé-valeur secrètes et les relire. En supposant que le shell de commande utilisé pour initialiser Vault soit toujours ouvert, nous utilisons la commande suivante pour stocker ces paires sous le chemin secret/fakebank :

$ vault kv put secret/fakebank api__key=abc1234 api__secret=1a2b3c4d

Nous pouvons maintenant récupérer ces paires à tout moment avec la commande suivante:

$ vault kv get secret/fakebank
======= Data =======
Key           Value
---           -----
api__key       abc1234
api__secret    1a2b3c4d

Ce simple test nous montre que Vault fonctionne comme il se doit. Nous pouvons maintenant tester certaines fonctionnalités supplémentaires.

6.2. Créer de nouveaux jetons

Jusqu’à présent, nous avons utilisé le jeton racine afin d’authentifier nos demandes. Étant donné qu’un jeton racine est way trop puissant, il est considéré comme une pratique recommandée d’utiliser des jetons avec moins de privilèges et une durée de vie plus courte.

Créons un nouveau jeton que nous pouvons utiliser comme le jeton racine, mais qui expire au bout d’une minute:

$ vault token create -ttl 1m
Key                  Value
---                  -----
token                <token value>
token__accessor       <token accessor value>
token__duration       1m
token__renewable      true
token__policies      ["root"]identity__policies   []policies            ["root"]----

Testons ce jeton en l’utilisant pour lire les paires clé/valeur que nous avons créées précédemment

[source,bash,gutter:,true]

$ export VAULT TOKEN=<token value> $ vault kv get secret/fakebank ======= Data ======= Key Value --- ----- api key abc1234 api__secret 1a2b3c4d

Si nous attendons une minute et essayons de rééditer cette commande, nous obtiendrons un message d'erreur:

[source,bash,gutter:,true]

$ vault kv get secret/fakebank Error making API request.

  • permission denied

Le message indique que notre jeton n’est plus valide, ce à quoi nous nous attendions.

[[testing__policies]]

====  6.3. Politiques de test

L’exemple de jeton que nous avons créé dans la section précédente a été écourté, mais reste très puissant. Utilisons maintenant les politiques pour créer des jetons plus restreints.

Par exemple, définissons une politique qui permet uniquement un accès en lecture au chemin __secret/fakebank__ que nous utilisions auparavant:

[source,bash,gutter:,true]

$ cat > sample-policy.hcl <<EOF path "secret/fakebank" { capabilities =["read"]} EOF $ export VAULT__TOKEN=<root token> $ vault policy write fakebank-ro ./sample-policy.hcl Success! Uploaded policy: fakebank-ro

Maintenant, nous créons un jeton avec cette politique avec la commande suivante:

[source,bash,gutter:,true]

$ export VAULT TOKEN=<root token> $ vault token create -policy=fakebank-ro Key Value --- ----- token <token value> token accessor <token accessor value> token duration 768h token renewable true token policies ["default" "fakebank-ro"]identity policies []policies ["default" "fakebank-ro"]----

Comme nous l’avons déjà fait, lisons nos valeurs secrètes à l’aide de ce jeton:

$ export VAULT__TOKEN=<token value>
$ vault kv get secret/fakebank
======= Data =======
Key           Value
---           -----
api__key       abc1234
api__secret    1a2b3c4d

Jusqu’ici tout va bien. Nous pouvons lire les données, comme prévu. Voyons ce qui se passe lorsque nous essayons de mettre à jour ce secret:

$ vault kv put secret/fakebank api__key=foo api__secret=bar
Error writing data to secret/fakebank: Error making API request.

URL: PUT https://127.0.0.1:8200/v1/secret/fakebank
Code: 403. Errors:

**  permission denied

Comme notre stratégie n’autorise pas explicitement les écritures, Vault renvoie un code d’état 403 - Accès refusé.

6.4. Utilisation des informations d’identification de base de données dynamiques

Comme dernier exemple de cet article, utilisons le moteur de secret de la base de données de Vault afin de créer des informations d’identification dynamiques. Nous supposons ici que nous avons un serveur MySQL disponible localement et que nous pouvons y accéder avec les privilèges «root». Nous allons également utiliser un schéma très simple consistant en une seule table - account .

Le script SQL utilisé pour créer ce schéma et l’utilisateur privilégié est disponible ici.

Maintenant, configurons Vault pour utiliser cette base de données. Le moteur secret de la base de données n’est pas activé par défaut. Nous devons donc résoudre ce problème avant de pouvoir continuer:

$ vault secrets enable database
Success! Enabled the database secrets engine at: database/----

Nous créons maintenant une ressource de configuration de base de données:

[source,bash,gutter:,true]

$ vault write database/config/mysql-fakebank \ plugin name=mysql-legacy-database-plugin \ connection url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/fakebank" \ allowed__roles="** " \ username="fakebank-admin" \ password="Sup&rSecre7!"

Le préfixe de chemin __database/config__ est l'emplacement où toutes les configurations de base de données doivent être stockées. Nous avons choisi le nom __mysql-fakebank__ afin de déterminer facilement à quelle base de données cette configuration fait référence. En ce qui concerne les clés de configuration:

**  __plugin__name: __ Définit quel plugin de base de données sera utilisé. le

Les noms de plugins disponibles sont décrits dans
https://www.vaultproject.io/docs/secrets/databases/index.html[Vault’s
docs]**  __connection__url__: Ceci est un template utilisé par le plugin quand

connexion à la base de données. Notez le \ {\ {nom d'utilisateur}} et le \ {\ {mot de passe}}
espaces réservés de modèle. Lors de la connexion à la base de données, Vault
remplacer ces espaces réservés par des valeurs réelles
**  __allowed__roles__: Définit les rôles de coffre-fort pouvant être utilisés

cette configuration. Dans notre cas, nous utilisons “** ”, donc disponible pour tous
rôles
**  __Nom d'utilisateur

effectuer des opérations de base de données, telles que créer un nouvel utilisateur et révoquer ses privilèges

La dernière tâche de configuration consiste à créer une ressource de rôle de base de données Vault contenant les commandes SQL requises pour créer un utilisateur. Nous pouvons créer autant de rôles que nécessaire, en fonction de nos exigences de sécurité.

Ici, nous créons un rôle qui accorde un accès en lecture seule à toutes les tables du schéma __fakebank__:

[source,actionscript3,gutter:,true]

$ vault write database/roles/fakebank-accounts-ro \ db name=mysql-fakebank \ creation statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON fakebank.** TO '{{name}}'@'%';"

Le moteur de base de données définit le préfixe de chemin ____database/roles ____ en tant qu'emplacement pour le stockage des rôles. __fakebank-accounts-ro__ est le nom du rôle que nous utiliserons ultérieurement lors de la création d'informations d'identification dynamiques. Nous fournissons également les clés suivantes:

**  __db__name__: Nom d'une configuration de base de données existante. Correspond à

la dernière partie du chemin que nous avons utilisée lors de la création de la configuration
Ressource
**  __creation__statements: __ Une liste de modèles d'instructions SQL que Vault

va utiliser pour créer un nouvel utilisateur

Une fois que le rôle de base de données et la configuration correspondante sont prêts, nous générons de nouvelles informations d'identification dynamiques à l'aide de la commande suivante:

[source,bash,gutter:,true]

$ vault read database/creds/fakebank-accounts-ro Key Value --- ----- lease id database/creds/fakebank-accounts-ro/0c0a8bef-761a-2ef2-2fed-4ee4a4a076e4 lease duration 1h lease__renewable true password <password> username <username>

Le préfixe __database/creds__ est utilisé pour générer les informations d'identification des rôles disponibles. Puisque nous avons utilisé le rôle ____fakebank-accounts-ro ____, le nom d'utilisateur/mot de passe renvoyé sera limité à __select__.

Nous pouvons le vérifier en nous connectant à la base de données à l'aide des informations d'identification fournies, puis en exécutant certaines commandes SQL:

[source,bash,gutter:,true]

$ mysql -h 127.0.0.1 -u <username> -p fakebank Enter password: MySQL[fakebank]> select ** from account; …​ omitted for brevity 2 rows in set (0.00 sec) MySQL[fakebank]> delete from account; ERROR 1142 (42000): DELETE command denied to user 'v-fake-9xoSKPkj1'@'localhost' for table 'account'

**  Nous pouvons voir que le premier __select__ s'est terminé avec succès, mais nous n'avons pas pu exécuter l'instruction __delete__ ** . Enfin, si nous attendons une heure et essayons de nous connecter en utilisant ces mêmes identifiants, nous ne pourrons plus nous connecter à la base de données. Vault a automatiquement révoqué tous les privilèges de cet utilisateur

===  7. Conclusion

Dans cet article, nous avons exploré les bases de Vault de Hashicorp, notamment des informations générales sur le problème qu’elle tente de résoudre, son architecture et son utilisation de base.

En cours de route, nous avons créé un environnement de test simple mais fonctionnel que nous utiliserons dans les articles suivants.

Le prochain article couvrira un cas d'utilisation très spécifique de Vault: **  Son utilisation dans le contexte de l'application Spring Boot ** . Restez à l'écoute!