Aller au contenu

Novops facilite l'accès aux secrets

Je ne vous apprendrai rien en vous disant que la gestion des secrets est importante, mais compliqué à mettre en œuvre. novops se présente comme un outil innovant qui va vous faciliter cette tâche. Il fonctionne aussi bien dans votre environnement de développement que dans les outils de pipeline CI/CD.

Cas d’usage

Vous avez un projet d’infrastructure as Code, tel que Terraform, Ansible ou Pulumi, gérant plusieurs environnements (dev, preprod…). Le code est exécuté soit localement ou, soit dans des pipelines CI/CD, comme GitLab CI CD, GitHub Actions ou Jenkins

Les secrets sont stockés dans un gestionnaire de secrets comme Hashicorp Vault, AWS Secret Manager, AWS STS, AWS SSM, Azure Keys Vault, GCLOUD Secret manager ou encore Bitwarden.

Fonctionnement de Novops

Novops Secrets Management

Novops charge les secrets en mémoire, principalement sous forme de variables d’environnement, mais également sous forme de fichiers. Novops peut générer des fichiers dans certaines situations - mais ils sont écrits sur un système de fichiers tmpfs (système de fichiers en mémoire) et donc pas sur le disque ! De plus, Novops utilise un répertoire sécurisé auquel seul l’utilisateur exécutant novops peut accéder ( XDG_RUNTIME_DIR ou un répertoire sécurisé dans /tmp ).

Installation de la CLI Novops

Dans une fenêtre de terminal, tapez les commandes suivantes :

Terminal window
export NOVOPS_VERSION=0.8.0
curl -L "https://github.com/PierreBeucher/novops/releases/download/v${NOVOPS_VERSION}/novops-X64-Linux.zip" -o novops.zip
unzip novops.zip
sudo mv novops /usr/local/bin/novops

Remplacez la version par celle de votre choix. La liste des releases.

Création du fichier de configuration novops

Il faut ensuite, dans le dossier où se trouve votre projet nécessitant d’accéder à des secrets, créer un fichier de configuration se nommant .novops.yml dont voici un exemple de contenu :

Terminal window
environments:
dev:
# Environment variables for dev environment
variables:
# Fetch Hashicorp Vault secrets
- name: DATABASE_PASSWORD
value:
hvault_kv2:
path: crafteo/app/dev
key: db_password
# Plain string are also supported
- name: DATABASE_USER
value: root

Chargement de secrets en variables d’environnement

Il suffit de lancer maintenant la commande de chargement :

Terminal window
source <(novops load -e dev)

Lancement de commandes

Pour lancer directement une commande :

Terminal window
novops run -e dev -- echo $DATABASE_USER
test

On peut imaginer lancer une commande terraform apply par exemple.

Utilisation dans des pipelines CI/CD

Je limiterai l’exemple avec GITLAB CI/CD. Ici par exemple, on installe la CLI novops dans une image terraform :

job-with-novops:
image: hashicorp/terraform:light
stage: test
script:
# Download novops
- |-
curl -L "https://github.com/PierreBeucher/novops/releases/latest/download/novops-X64-Linux.zip" -o novops.zip
unzip novops.zip
mv novops /usr/local/bin/novops
# Load config
# Specify environment to avoid input prompt
- source <(novops load -e dev)
# Environment is now loaded!
# Run others commands...
- terraform ...

Dans les variables d’environnement du projet gitlab, il faudra créer une variable masquée contenant le Token Vault (VAULT_TOKEN)

Utilisation avec Ansible

J’apprécie beaucoup cet outil pour le simple fait qu’il gère facilement plusieurs environnements et, donc plusieurs inventaires Ansible. Voici un exemple de fichier de configuration novops pour Ansible :

environments:
dev:
variables:
# Comma separated list of Ansible inventory sources
# Ansible will automatically use these inventories
- name: ANSIBLE_INVENTORY
value: inventories/dev
# Add more as needed
# - name: ANSIBLE_*
# value: ...
files:
# Ansible will use this key to connect via SSH on managed hosts
- variable: ANSIBLE_PRIVATE_KEY_FILE
content:
hvault_kv2:
path: myapp/dev
key: ssh_key
# Ansible use this file to decrypt local Ansible vault
- variable: ANSIBLE_VAULT_PASSWORD_FILE
content:
hvault_kv2:
path: myapp/dev
key: inventory_password
# Another environment
prod:
variables:
- name: ANSIBLE_INVENTORY
value: inventories/prod
files:
- variable: ANSIBLE_PRIVATE_KEY_FILE
content:
hvault_kv2:
path: myapp/prod
key: ssh_key
- variable: ANSIBLE_VAULT_PASSWORD_FILE
content:
hvault_kv2:
path: myapp/prod
key: inventory_password

Pour lancer un playbook, il suffit d’utiliser la commande suivante :

Terminal window
novops run -e dev -- ansible-playbook my-playbook.yml

Conclusion

En conclusion, Novops se révèle être un outil indispensable pour accéder à des secrets dans un contexte possédant de plusieurs environnements. En le stockant dans le projet, il me fait gagner beaucoup de temps, car je n’ai plus besoin de rechercher où se trouvent ces secrets. Autre gain au niveau de la sécurité ils ne sont plus stockés sur le disque. Il suffit juste de charger son token d’accès au gestionnaire de secrets, avec direnv par exemple et le tour est joué. Une pépite donc et en plus la documentation est complète !

Plus d’infos

Le site officiel : https://pierrebeucher.github.io/novops/