Aller au contenu principal

Novops facilite l'accès aux secrets

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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 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 :

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

astuce

Avant de tester Novops, si vous n'avez pas de Vault accessible, vous pouvez suivre cette documentation pour lancer une instance de test.

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 :

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 :

source <(novops load -e dev)

Lancement de commandes

Pour lancer directement une commande :

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 :

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/