Variables d'environnement et jetons : les bonnes pratiques
Un jeton de bot Discord, un mot de passe de base de données ou une clé d'API donnent accès à quelque chose. Quiconque les lit peut agir à votre place. Ils n'ont donc rien à faire dans le code ni dans un dépôt Git, même privé : un dépôt se partage, se clone et se publie plus facilement qu'on ne le pense.
La règle est simple : le code lit ses secrets dans des variables d'environnement, et ces variables sont définies là où le code tourne.
Lire une variable d'environnement
Node.js :
const token = process.env.DISCORD_TOKEN;Python :
import os
token = os.environ["DISCORD_TOKEN"] # erreur immédiate si absentePHP :
$dbPassword = getenv('DB_PASSWORD');Vérifiez la présence des variables au démarrage et arrêtez le programme avec un message clair si l'une manque : c'est plus facile à diagnostiquer qu'une erreur obscure dix minutes plus tard.
En local : le fichier .env
Pour développer, on regroupe les variables dans un fichier .env à la racine du projet :
DISCORD_TOKEN=votre_jeton
DATABASE_URL=mysql://utilisateur:motdepasse@localhost/mabase- Node.js 20.6 et plus le charge nativement :
node --env-file=.env index.js. Sinon, paquetdotenv. - Python : paquet
python-dotenv, puisload_dotenv().
Ce fichier ne doit jamais être validé dans Git. Ajoutez-le au .gitignore avant le premier commit :
.env
.env.*
!.env.exampleVersionnez en revanche un .env.example qui liste les noms attendus, sans valeur. La personne qui reprend le projet sait ainsi quoi renseigner.
Vérifiez que rien n'est suivi par erreur :
git ls-files | grep -i envSur le serveur
Hébergement applicatif
Les variables se renseignent dans votre espace client, pas dans le dépôt :
- à la création de l'application (« Nouvelle application »), dans le champ Variables d'environnement, une par ligne au format
NOM=valeur; - ensuite, avec le bouton « Variables » de l'application : modifiez les lignes, cliquez sur « Enregistrer », puis sur « Redéployer ». Les changements s'appliquent au prochain redéploiement, pas à chaud.
DISCORD_TOKEN=votre_jeton
DATABASE_URL=postgres://utilisateur:motdepasse@hote/mabaseVPS
Avec systemd, placez les variables dans un fichier lisible par root seulement, et référencez-le dans le service :
install -m 600 -o root -g root /dev/null /etc/mon-app.env
nano /etc/mon-app.env[Service]
EnvironmentFile=/etc/mon-app.envsystemd lit ce fichier en tant que root puis transmet les variables au service, même si celui-ci tourne sous un autre utilisateur. Évitez d'écrire les secrets directement dans le fichier .service (lisible par tous) ou dans ~/.bashrc.
Exemple complet dans Héberger un bot discord.js.
Hébergement web
Pour un site PHP, les identifiants de base de données vont dans un fichier de configuration placé hors du dossier public quand c'est possible, et jamais dans un dépôt public. WordPress, par exemple, les garde dans wp-config.php, qui ne doit pas être téléchargeable.
Les erreurs classiques
- Afficher les variables dans les journaux : un
console.log(process.env)de débogage finit tôt ou tard dans une capture d'écran ou un ticket. Sur l'hébergement applicatif, les journaux s'affichent dans votre espace client : ce que votre programme y écrit, vous le lisez en clair. - Supprimer le fichier dans un nouveau commit : le secret reste dans l'historique Git. Le supprimer de l'historique ne suffit pas non plus, des copies existent peut-être déjà.
- Partager un jeton pour obtenir de l'aide : personne n'en a besoin pour vous aider, le support HebergHub compris.
- Un seul jeton pour tout : un jeton par usage et par environnement (développement, production) limite les dégâts en cas de fuite.
Un secret a fuité : que faire
- Révoquer et régénérer le secret à la source, tout de suite : portail développeur Discord (Reset Token), console du fournisseur d'API, mot de passe de la base.
- Mettre la nouvelle valeur dans les variables du serveur (sur l'hébergement applicatif : bouton « Variables », « Enregistrer », puis « Redéployer » ; sur un VPS : le fichier d'environnement, puis redémarrage du service).
- Vérifier les journaux d'activité du service concerné à la recherche d'usages inconnus.
- Ensuite seulement, nettoyer le dépôt.
Régénérer passe avant tout le reste : tant que l'ancien jeton est valide, il peut servir.
Besoin d'aide ?
Ouvrez un ticket depuis votre espace client. Décrivez le problème et le nom des variables concernées, jamais leur valeur.