Node.js: Geheimen beheren

Hoe geheimen te beheren met Node.js

👋 Welkom bij de documentatie van Stackhero!

Stackhero biedt een kant-en-klare Node.js cloud oplossing die tal van voordelen biedt, waaronder:

  • Implementeer uw applicatie in seconden met een eenvoudige git push.
  • Gebruik uw eigen domeinnaam en profiteer van de automatische configuratie van HTTPS-certificaten voor verbeterde beveiliging.
  • Geniet van gemoedsrust met automatische back-ups, updates met één klik, en eenvoudige, transparante en voorspelbare prijzen.
  • Krijg optimale prestaties en robuuste beveiliging dankzij een privé en dedicated VM.

Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Node.js cloud hosting oplossing van Stackhero te proberen!

Wanneer uw Node.js-project interactie heeft met een database, objectopslag of een externe API, is het cruciaal om inloggegevens zoals gebruikersnamen, wachtwoorden of tokens, vaak "geheimen" genoemd, veilig op te slaan. Het vertrouwelijk houden van deze geheimen is essentieel voor het handhaven van de beveiliging.

U zou aanvankelijk iets als dit kunnen overwegen:

// Verbinding maken met een PostgreSQL-database
const pg = new Client({
  host: 'xxxxx.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Helaas is deze methode niet veilig. Waarom? Omdat uw geheimen in uw Git-repository terecht kunnen komen, waardoor ze worden blootgesteld aan iedereen met toegang. Zelfs als u denkt dat alleen u toegang heeft, is het vergelijkbaar met het achterlaten van een Post-it met uw wachtwoorden op uw monitor en aannemen dat niemand anders het zal zien. Dit kan uiteindelijk leiden tot beveiligingsproblemen.

Bovendien ondersteunt deze aanpak geen naadloze beheer van verschillende omgevingen, zoals ontwikkeling en productie.

Een veelgebruikte praktijk in de industrie is om geheimen op te slaan in omgevingsvariabelen.

Omgevingsvariabelen worden buiten uw code gedefinieerd en ingesteld voordat Node.js start. Het concept is om al uw geheimen te definiëren met behulp van omgevingsvariabelen, zodat ze niet hard gecodeerd worden in uw applicatie.

Om een omgevingsvariabele te definiëren, kunt u deze instellen bij de start van uw Node.js-aanroep zoals dit: MY_PASSWORD=myDevelopmentPassword node app.js

Deze opdracht stelt een variabele in met de naam "MY_PASSWORD" met de waarde "myDevelopmentPassword". Het formaat is eenvoudig <KEY>=<value>.

Volgens conventie worden omgevingsvariabelen in hoofdletters geschreven. Merk op dat alleen strings kunnen worden gebruikt, geen arrays of objecten.

In uw app.js-bestand kunt u uw nieuwe omgevingsvariabele lezen met process.env zoals dit: console.log(process.env.MY_PASSWORD);. Dit zal myDevelopmentPassword weergeven.

Nu is het wachtwoord buiten de code gedefinieerd, waardoor het niet in de Git-repository wordt gepubliceerd.

Op Stackhero, in een productieomgeving, heeft u de mogelijkheid om een nieuwe omgevingsvariabele genaamd "MY_PASSWORD" te definiëren met "myProductionPassword" direct in uw Node.js-service dashboard, wat een soepele werking garandeert.

Voorbeeld van Node.js-configuratie op het Stackhero-dashboardVoorbeeld van Node.js-configuratie op het Stackhero-dashboard

Kortom, uw wachtwoord wordt niet langer in uw code opgeslagen en u heeft aparte wachtwoorden voor ontwikkelings- en productieomgevingen.

In realistische scenario's moeten vaak meerdere geheimen worden beheerd. Bijvoorbeeld, verbinding maken met een database vereist het opslaan van een hostnaam, een gebruiker en een wachtwoord.

Het beheren van een enkel geheim is eenvoudig, maar het beheren van meerdere kan omslachtig worden. Stel u voor dat u uw applicatie start met deze opdrachtregel:

POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

Deze regel is onhandig en moeilijk te onderhouden. Een productieapplicatie kan meerdere variabelen vereisen, waardoor deze aanpak onpraktisch is.

Daar komt de dotenv-bibliotheek van pas.

Met dotenv kunnen geheimen worden opgeslagen in een apart bestand genaamd .env.

Eerst kunt u de dotenv-bibliotheek installeren met:

npm install dotenv

Maak vervolgens een .env-bestand aan met de variabelen:

POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

Zorg ervoor dat dit .env-bestand niet naar de Git-repository wordt gepusht door het toe te voegen aan de lijst met genegeerde bestanden:

echo ".env" >> .gitignore

Laad ten slotte de dotenv-bibliotheek bovenaan uw app.js-bestand zoals dit:

require("dotenv").config();

Met deze configuratie, wanneer u uw applicatie start met node app.js, zal dotenv automatisch de inhoud van het .env-bestand lezen op uw ontwikkelplatform. In productie bestaat dit bestand niet en worden omgevingsvariabelen rechtstreeks gehaald uit uw Node.js-serviceconfiguratie (beschikbaar op het Stackhero-dashboard).

Dit was allemaal theorie. Laten we duiken in een echt werkend voorbeeld.

U kunt een compleet voorbeeld hier vinden: https://github.com/stackhero-io/dotenvWithNodejs

Nu weet u hoe u uw geheimen op een flexibele en veilige manier kunt beheren, allemaal heel eenvoudig.