HashiCorp Vault - AppRole Authentication | Drupal.org

Présentation

Installation

Utilisation

Récupérer un mot de passe avec l'API

Les commandes

Il va nous falloir plusieurs données pour récupérer un mot de passe :

Récupération du VAULT_TOKEN pour accéder aux secrets :

VAULT_TOKEN=$(curl -sSf --data "{\"role_id\":\"<ROLE_ID>\",\"secret_id\":\"$VAULT_SECRET_ID\"}" $VAULT_URL/v1/auth/approle/login | jq -r '.["auth"]["client_token"]')

Récupération des secrets dans le dossier en Json ;

curl -sSf -X GET -H "Accept: */*" -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_URL/v1/$VAULT_ENGINE/data/approle/$VAULT_ROLE"

Récupération du secret recherché avec jq :

 | jq -r '.["data"]["data"]["$VAULT_SECRET_NAME"]'

 

Récupération des secrets dans un script :

Variable d'environnement à configurer

Afin de ne pas dévoiler les informations ou les tokens utilisés, on les met en variable d'environnement :

export VAULT_URL='' # Vault URL with "https://"
export VAULT_ENGINE='' # Wallet name (ex : VPS)
export VAULT_ROLE='' # Role name (folder)
export VAULT_SECRET_ID='' # To be retrieved in Vault CLI with 'vault write -force auth/approle/role/<VAULT_ROLE>/secret-id'
export VAULT_SECRET_NAME='' # Secret name

 

Fonction Bash

#!/bin/bash

function Get-Secret {
    VAULT_TOKEN=$(curl -sSf --data "{\"role_id\":\"$VAULT_ROLE\",\"secret_id\":\"$VAULT_SECRET_ID\"}" $VAULT_URL/v1/auth/approle/login | jq -r '.["auth"]["client_token"]')
    SECRET=$(curl -sSf -X GET -H "Accept: */*" -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_URL/v1/$VAULT_ENGINE/data/approle/$VAULT_ROLE" | jq -r --arg VAULT_SECRET_NAME "$VAULT_SECRET_NAME" '.["data"]["data"][$VAULT_SECRET_NAME]')
    echo "$SECRET"
}

VAULT_SECRET_NAME='kaypair'
PASSWORD=$(Get-Secret)
echo $PASSWORD

 

Fonction Python

#!/usr/bin/env python
import requests
import os
import json

# Variables declaration
VAULT_URL = os.getenv('VAULT_URL')
VAULT_ENGINE = os.getenv('VAULT_ENGINE')
VAULT_ROLE = os.getenv('VAULT_ROLE')
VAULT_SECRET_ID = os.getenv('VAULT_SECRET_ID')

def GetSecret():
    # Get token access
    data = {"role_id":VAULT_ROLE,"secret_id":VAULT_SECRET_ID}
    response = requests.post(VAULT_URL + '/v1/auth/approle/login', data=data)
    JSON = json.loads(response.text)
    TOKEN = JSON["auth"]["client_token"]
    # Get secret
    headers = {
        'Accept': '*/*',
        'X-Vault-Token': TOKEN
    }
    response = requests.get(VAULT_URL + '/v1/' + VAULT_ENGINE + '/data/approle/' + VAULT_ROLE, headers=headers)
    JSON = json.loads(response.text)
    SECRET = JSON["data"]["data"][VAULT_SECRET_NAME]
    return SECRET

VAULT_SECRET_NAME='kaypair'
SECRET = GetSecret()
print (SECRET)