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 crucial de stocker en toute sécurité les identifiants tels que les noms d'utilisateur, mots de passe ou tokens, souvent appelés "secrets". Garder ces secrets confidentiels est essentiel pour maintenir la sécurité.
Ce que vous pourriez être tenté de faire
Vous pourriez initialement envisager quelque chose comme ceci :
// Connexion à une base de données PostgreSQL
const pg = new Client({
host: 'xxxxx.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Malheureusement, cette méthode n'est pas sécurisée. Pourquoi ? Parce que vos secrets pourraient se retrouver dans votre dépôt Git, les exposant à toute personne ayant accès. Même si vous pensez être le seul à y avoir accès, c'est comme laisser un Post-it avec vos mots de passe sur votre écran en supposant que personne d'autre ne le verra. Cela peut éventuellement entraîner des problèmes de sécurité.
De plus, cette approche ne permet pas une gestion fluide des différents environnements, tels que le développement et la production.
Les variables d'environnement
Une pratique largement adoptée dans l'industrie consiste à stocker les secrets dans des variables d'environnement.
Les variables d'environnement sont définies en dehors de votre code et configurées avant le démarrage de Node.js. Le concept est de définir tous vos secrets à l'aide de variables d'environnement, évitant ainsi de les coder en dur dans votre application.
Définir vos premières variables d'environnement
Pour définir une variable d'environnement, vous pouvez la configurer au démarrage de votre application Node.js comme ceci : MY_PASSWORD=myDevelopmentPassword node app.js
Cette commande définit une variable nommée "MY_PASSWORD" avec la valeur "myDevelopmentPassword". Le format est simplement <KEY>=<value>.
Par convention, les variables d'environnement sont écrites en lettres majuscules. Notez que seules des chaînes de caractères peuvent être utilisées, pas des tableaux ou des objets.
Lire les variables d'environnement
Dans votre fichier app.js, vous pouvez lire votre nouvelle variable d'environnement avec process.env comme ceci : console.log(process.env.MY_PASSWORD);. Cela affichera myDevelopmentPassword.
Désormais, le mot de passe est défini en dehors du code, empêchant sa publication dans le dépôt Git.
Sur Stackhero, en environnement de production, vous avez la possibilité de définir une nouvelle variable d'environnement nommée "MY_PASSWORD" contenant "myProductionPassword" directement dans le tableau de bord de votre service Node.js, assurant un fonctionnement fluide.
Exemple de configuration Node.js sur le tableau de bord Stackhero
En conclusion, votre mot de passe n'est plus stocké dans votre code, et vous disposez de mots de passe distincts pour les environnements de développement et de production.
Utiliser la bibliothèque dotenv
Dans des scénarios réels, plusieurs secrets doivent souvent être gérés. Par exemple, se connecter à une base de données nécessite de stocker un nom d'hôte, un utilisateur et un mot de passe.
Gérer un seul secret est simple, mais en gérer plusieurs peut devenir fastidieux. Imaginez démarrer votre application avec cette ligne de commande :
POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Cette ligne est peu pratique et difficile à maintenir. Une application en production pourrait nécessiter de nombreuses variables, rendant cette approche impraticable.
C'est là que la bibliothèque dotenv devient précieuse.
Avec dotenv, les secrets peuvent être stockés dans un fichier séparé appelé .env.
Tout d'abord, vous pouvez installer la bibliothèque dotenv avec :
npm install dotenv
Ensuite, créez un fichier .env contenant les variables :
POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Assurez-vous que ce fichier .env n'est pas poussé dans le dépôt Git en l'ajoutant à la liste des fichiers ignorés :
echo ".env" >> .gitignore
Enfin, chargez la bibliothèque dotenv en haut de votre fichier app.js comme ceci :
require("dotenv").config();
Avec cette configuration, lors du démarrage de votre application avec node app.js, dotenv lira automatiquement le contenu du fichier .env sur votre plateforme de développement. En production, ce fichier n'existe pas, et les variables d'environnement sont directement issues de la configuration de votre service Node.js (disponible sur le tableau de bord Stackhero).
Exemple fonctionnel
Tout cela était théorique. Passons à un exemple concret.
Vous pouvez trouver un exemple complet disponible ici : https://github.com/stackhero-io/dotenvWithNodejs
Vous savez maintenant comment gérer vos secrets de manière flexible et sécurisée, tout cela très facilement.