Node.js: Gérer les secrets

Comment gérer les secrets avec Node.js

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Node.js cloud prête à l'emploi qui offre de nombreux avantages, notamment :

  • Déployez votre application en quelques secondes avec un simple git push.
  • Utilisez votre propre nom de domaine et bénéficiez de la configuration automatique des certificats HTTPS pour une sécurité renforcée.
  • Profitez de la tranquillité d'esprit avec des sauvegardes automatiques, des mises à jour en un clic, et une tarification simple, transparente et prévisible.
  • Obtenez des performances optimales et une sécurité robuste grâce à une VM privée et dédiée.

Gagnez du temps et simplifiez-vous la vie : il ne faut que 5 minutes pour essayer la solution d'hébergement cloud Node.js de Stackhero !

Lorsque votre projet Node.js interagit avec une base de données, un object storage ou une API externe, il est important de stocker les identifiants, comme les noms d'utilisateur, mots de passe ou tokens, de façon sécuritaire. Ces identifiants sont souvent appelés « secrets ». Garder vos secrets confidentiels est essentiel pour assurer la sécurité de votre application.

Au début, vous pourriez être tenté d’inscrire vos identifiants directement dans votre code, comme ceci :

// Connexion à une base de données PostgreSQL
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Cependant, cette méthode n’est pas sécuritaire. Vos secrets pourraient facilement se retrouver dans votre dépôt Git, les rendant visibles à toute personne ayant accès au dépôt. Même si vous pensez être le seul à y accéder, c’est un peu comme laisser un Post-it avec vos mots de passe sur votre écran en espérant que personne ne le remarque. Cela peut finir par causer de sérieux problèmes de sécurité.

De plus, coder vos secrets en dur complique la gestion de différents environnements, comme le développement et la production.

Une bonne pratique largement adoptée dans l’industrie consiste à stocker les secrets dans des variables d’environnement.

Les variables d’environnement sont définies à l’extérieur de votre code et sont positionnées avant le démarrage de Node.js. L’idée est de définir tous vos secrets via des variables d’environnement, afin qu’ils ne soient jamais codés en dur dans votre application.

Vous pouvez définir une variable d’environnement en la passant au lancement de votre commande Node.js, comme ceci :

MY_PASSWORD=myDevelopmentPassword node app.js

Cette commande crée une variable appelée MY_PASSWORD avec la valeur myDevelopmentPassword. Le format est simple : <KEY>=<valeur>.

Par convention, les variables d’environnement sont écrites en majuscules. À noter que les variables d’environnement ne peuvent contenir que des chaînes de caractères, pas de tableaux ni d’objets.

Dans votre fichier app.js, vous pouvez accéder à votre variable d’environnement via process.env, comme ceci :

console.log(process.env.MY_PASSWORD);

Cela affichera myDevelopmentPassword.

Votre mot de passe est maintenant défini à l’extérieur de votre code. Cela aide à éviter qu’il ne se retrouve accidentellement dans votre dépôt Git.

Si vous utilisez Stackhero en production, vous pouvez définir une nouvelle variable d’environnement nommée MY_PASSWORD avec la valeur myProductionPassword directement depuis le tableau de bord de votre service Node.js. Cela facilite la gestion fluide entre les environnements.

Exemple de configuration Node.js sur le tableau de bord StackheroExemple de configuration Node.js sur le tableau de bord Stackhero

Avec cette configuration, votre mot de passe n’est plus stocké dans votre code, et vous pouvez facilement utiliser des identifiants différents pour les environnements de développement et de production.

Dans des projets réels, il est fréquent de devoir gérer plusieurs secrets. Par exemple, se connecter à une base de données peut nécessiter un hostname, un nom d’utilisateur et un mot de passe.

Gérer un seul secret est simple, mais jongler avec plusieurs devient vite compliqué. Imaginez démarrer votre application avec une commande comme celle-ci :

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

Cela devient rapidement difficile à lire et à maintenir. En production, vous aurez probablement encore plus de variables, ce qui rend cette approche peu pratique.

C’est là que la bibliothèque dotenv devient utile.

Avec dotenv, vous pouvez stocker vos secrets dans un fichier séparé appelé .env.

Pour commencer, installez la bibliothèque dotenv en lançant :

npm install dotenv

Ensuite, créez un fichier .env pour y placer vos variables :

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

Pour garder vos secrets en sécurité, assurez-vous que votre fichier .env n’est pas ajouté à votre dépôt Git. Vous pouvez le faire en l’ajoutant à votre fichier .gitignore :

echo ".env" >> .gitignore

Enfin, chargez la bibliothèque dotenv en haut de votre fichier app.js :

require("dotenv").config();

Avec cette configuration, lorsque vous lancez votre application avec node app.js, dotenv lit automatiquement votre fichier .env sur votre machine de développement. En production, vous n’avez pas besoin du fichier .env. Les variables d’environnement sont directement récupérées depuis la configuration de votre service Node.js, que vous pouvez gérer via le tableau de bord Stackhero.

Maintenant que nous avons vu la théorie, voyons un exemple concret.

Vous pouvez consulter un exemple complet et fonctionnel ici : https://github.com/stackhero-io/dotenvWithNodejs

Avec ces techniques, vous pouvez gérer vos secrets de façon flexible et sécuritaire, tout en gardant le processus simple et efficace.