Skip to content

Gérer les variables d'environnement et les secrets sur nos projets🔗

Introduction🔗

Dans cet article, je vous expliquerai ce que sont les variables d'environnement et les secrets dans nos projets, comment les utiliser et renseigner sur nos environnements de développement, de staging et de production.

Qu'est-ce qu'une variable d'environnement dans un contexte de projet Symfony ?🔗

Les variables d'environnement peuvent être utilisées à tout endroits dans le code de votre projet Symfony. Elles sont accessibles via la variable globale $_ENV, $_SERVER ou via la fonction getenv().

Les valeurs par défaut sont habituellement définies dans les fichiers .env et .env.[local|dev|test|prod].

Tip

Voici les fichiers possibles, dans leur ordre de chargement, en sachant que les plus spécifiques écrasent les premiers ;

  • .env (chargé en premier)

  • .env.local

  • .env.[dev|test|prod]

  • .env.[dev|test|prod].local (chargé(s) en dernier)

Vous trouverez plus de détails sur la documentation officielle de Symfony.

En effet l'extension des fichiers .env permet de définir dans quel mode (APP_ENV Symfony) les variables seront accessibles.

Cela permet par exemple de définir des fichiers de configuration différents, rangés par dossier, comme ; config/packages/dev, config/packages/prod, config/packages/test, etc.

Tip

La notion d'environnement mentionnée au-dessus est celle de Symfony, et est uniquement valable dans le contexte d'un projet Symfony et son code exécuté par PHP.

Il ne faut pas confondre avec nos environnements de déploiement, définis avec la variable APP_RUNTIME_ENV

Le fichier .env.local a le rôle spécifique dans votre application d'overrider (surcharger) les variables du fichier .env pour celles de votre environnement local, si vous en avez le besoin.

Warning

Il ne faut jamais versionner le fichier .env.local, car il contient des variables d'environnement spécifiques à votre environnement local, ce qui vous permet de remplacer une valeur par une autre en fonction de vos contraintes de développement.

D'ailleurs, Symfony fournit déjà à son installation un fichier .gitignore qui contient cette ligne.

Qu'est-ce qu'un secret dans un contexte de projet Symfony ?🔗

Certaines variables d'environnement ne doivent pas être versionnées en clair dans le code source de votre projet. Cela peut concerner par exemple ; une clé d'API, un mot de passe, etc.

Symfony permet de gérer des secrets avec des commandes dédiées.

Tip

Si vous souhaitez plus d'informations concernant la gestion du vault Symfony et les commandes associées ; rendez-vous sur le site officiel de Symfony

Les secrets Symfony utilisent une paire de clés de chiffrement asymétriques (publique et privée) pour être stockés de manière sécurisée.

Gérer les clés de chiffrement🔗

La clé publique est versionnée dans nos projets et la clé privée est stockée dans un coffre-fort, notre 1password, et n'est donc pas versionnée.

Pour pouvoir générer des secrets et les déchiffrer en local, vous devez importer la clé privée dans votre 1password, et la placer dans le dossier concerné, par exemple : /panneau-pocket/back/config/secrets/local.

Elle porte un nom de type local.decrypt.private.php

Si les clés publiques / privées n'ont pas encore été générées sur votre projet, vous pouvez le faire à l'aide de la commande ;

1
symfony console secrets:generate-keys

Vous pouvez également rajouter cette ligne dans votre fichier .gitignore pour ne jamais versionner la clé privée :

1
/config/secrets/**/*.decrypt.private.php 
puis la rajouter dans votre 1password

Gérer les secrets🔗

Vous pouvez générer les fichiers cryptés de vos secrets avec la commande ;

1
symfony console secrets:set NOM_DU_SECRET

Note

La valeur du secret encryptée sera sauvegardée dans un fichier type local.NOM_DU_SECRET.{suite_de_chiffres_random}.php

Symfony CLI mettra aussi à jour le fichier local.list.php qui contiendra la liste des secrets de votre projet.

Pensez à versionner ces fichiers.

Vous pouvez dès à présent utiliser votre variable secrète cryptée, dans votre projet Symfony !!

Warning

Dans la plupart de nos contextes projets (çàd lorsque l'hébergement est géré par Rix), les secrets sont gérés en staging et production par un Vault Hashicorp mis à disposition par Rix. Il ne faut alors renseigner dans le vault Symfony uniquement les valeurs de secrets pour votre environnement local.

Comment déployer une release qui introduit des variables d'environnement et des secrets ?🔗

Se connecter à un Vault Rix🔗

Les variables d'environnement et les secrets sont gérés avec les Vaults Rix, sur nos environnements de staging et de production. Il existe généralement un vault par projet et par environnement, les accès à chacun de ces vaults sont disponibles dans notre 1password, et portent des noms explicites ; comme Vault_MJC_PROD ou Vault_MJC_STAGING.

L'URL est renseignée dans 1password, c'est secrets.rix.fr/ui/vault

Si vous ne vous êtes jamais connecté à un Vault Rix, vous serez redirigé sur la page d'authentification, où vous devez renseigner (avec la method Username) un couple Username + Password liés au projet et à son environnement concerné, que vous trouverez dans 1password.

Warning

Dès que vous vous êtes connecté une fois sur un Vault Rix, vous serez redirigé sur sa page lors que vous accèderez à l'URL secrets.rix.fr/ui/vault

Pour modifier ou obtenir des variables d'environnement d'un autre projet ou contexte, il faut bien penser à se déconnecter du Vault courant en cliquant sur l'icône avatar en haut à droite du volet latéral gauche, puis sur le bouton Log out.

Renseigner les variables d'environnement🔗

Lors qu'une release introduit une nouvelle variable d'environnement ou un nouveau secret, ils doivent être renseignés manuellement dans ces Vaults Rix.

Tip

Certaines Pull Requests ont un label qui permet de repérer celles qui introduisent des variables d'environnement ; Pull Request avec un label warning 'NEW ENV VARS' (ici sur citopia-jvs/panneau-pocket)

Il est appréciable dans ce cas pour l'auteur·ice de la PR concernée de renseigner le nom de la ou des variable(s) d'environnement introduite(s) dans le corps de la PR, pour faciliter la tâche de la personne qui va créer la release et/ou la déploie.

Si jamais la variable est un secret et que vous ne souhaitez pas le renseigner dans le corps de la PR, vous pouvez donner des indications pour permettre d'en retrouver le contenu en clair.

Par exemple ; Comment récupérer la clé private sur 1password et où la placer dans le projet, et lancer la commande

1
symfony console secrets:list --reveal

Vous pouvez le faire vous-même en suivant ces étapes ;

  1. Se connecter au Vault Rix du projet et de l'environnement concerné
  2. Dans l'arborescence de fichiers affichée, cliquer sur le fichier {NOM_DU_PROJET+_ENVIRONNEMENT} Interface Vault Rix pour modifier une var d'env 1ère étape
  3. Sélectionner le fichier d'environnement adéquat
    • en général .env, mais si votre projet a plusieurs instances de staging par exemple, il y aura plusieurs fichiers d'environnement (comme .env, .env1, etc.)
  4. Cliquer sur le bouton Create new version en haut à droite de l'interface Interface Vault Rix pour modifier une var d'env 2ème étape
  5. Vous pouvez alors, soit modifier le nom d'une variable d'environnement, sa valeur, ou rajouter un couple clé/valeur Interface Vault Rix pour modifier une var d'env 3ème étape
  6. Sauvegarder vos modifications
  7. Attention ! Les modifications de vos variables ne seront prises en compte sur l'environnement concerné que lors du prochain deploy

Warning

Il faut toujours redéployer l'application pour que les variables d'environnement soient prises en compte. via les commandes Make de votre projet local comme :

1
make trigger-deploy@staging

Il est cependant possible de regenérer le fichier .env de votre projet (lorsque vous êtes sur un serveur distant) avec une commande Make comme ;

1
make secrets@staging

Cela implique par contre ensuite d'effectuer plusieurs tâches qui seront faîtes lors d'un déploiement, comme vider le cache, dumper le fichier .env.local.php, restart les services et process consommant l'app PHP (ex: FPM), etc.

Tip

Vous pouvez consulter l'article dans nos Cookbooks sur nos processus de release et deploy si vous souhaitez plus d'informations sur le sujet.


Last update: December 20, 2024