Node.js: Geheimen beheren

Hoe u geheimen beheert 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 verbinding maakt met een database, object storage of een externe API, is het belangrijk om inloggegevens, zoals gebruikersnamen, wachtwoorden of tokens, veilig op te slaan. Deze inloggegevens worden vaak "geheimen" genoemd. Het vertrouwelijk houden van uw geheimen is essentieel voor de beveiliging van uw applicatie.

In het begin overweegt u wellicht om uw inloggegevens direct in uw code te schrijven, zoals hieronder:

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

Deze aanpak is echter niet veilig. Uw geheimen kunnen eenvoudig in uw Git-repository terechtkomen, waardoor ze zichtbaar zijn voor 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 in de hoop dat niemand het ziet. Dit kan uiteindelijk tot serieuze beveiligingsproblemen leiden.

Bovendien maakt het hard-coden van geheimen het lastig om soepel te schakelen tussen verschillende omgevingen, zoals development en production.

Een gangbare best practice in de industrie is om geheimen op te slaan in omgevingsvariabelen.

Omgevingsvariabelen worden buiten uw code gedefinieerd en ingesteld voordat Node.js start. Het idee is om al uw geheimen via omgevingsvariabelen te definiëren, zodat ze nooit hard-coded in uw applicatie staan.

U kunt een omgevingsvariabele instellen door deze aan het begin van uw Node.js-commando te plaatsen, bijvoorbeeld:

MY_PASSWORD=myDevelopmentPassword node app.js

Met dit commando maakt u een variabele genaamd MY_PASSWORD aan met de waarde myDevelopmentPassword. Het formaat is eenvoudig: <KEY>=<waarde>.

Volgens conventie worden omgevingsvariabelen in hoofdletters geschreven. Let op: omgevingsvariabelen kunnen alleen strings bevatten, geen arrays of objecten.

Binnen uw app.js-bestand kunt u uw omgevingsvariabele benaderen via process.env, bijvoorbeeld:

console.log(process.env.MY_PASSWORD);

Dit zal myDevelopmentPassword tonen.

Uw wachtwoord staat nu buiten uw code. Dit helpt voorkomen dat het per ongeluk in uw Git-repository terechtkomt.

Als u Stackhero in een productieomgeving gebruikt, kunt u eenvoudig een nieuwe omgevingsvariabele genaamd MY_PASSWORD met de waarde myProductionPassword instellen via het dashboard van uw Node.js-service. Zo houdt u eenvoudig controle over verschillende omgevingen.

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

Met deze aanpak wordt uw wachtwoord niet langer in uw code opgeslagen en kunt u eenvoudig verschillende inloggegevens gebruiken voor development- en production-omgevingen.

In praktijkprojecten moet u vaak meerdere geheimen beheren. Bijvoorbeeld: voor een databaseverbinding heeft u meestal een hostname, gebruikersnaam en wachtwoord nodig.

Eén geheim beheren is eenvoudig, maar meerdere tegelijk wordt al snel onoverzichtelijk. Stel u voor dat u uw applicatie start met een commando als dit:

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

Dit wordt snel onleesbaar en lastig te onderhouden. In productie zijn er vaak nog meer variabelen nodig, waardoor deze aanpak niet praktisch is.

Daar komt de dotenv-library van pas.

Met dotenv kunt u geheimen opslaan in een apart bestand genaamd .env.

Om te beginnen installeert u de dotenv-library met:

npm install dotenv

Maak vervolgens een .env-bestand aan om uw variabelen in op te slaan:

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

Om uw geheimen te beschermen, zorgt u ervoor dat uw .env-bestand niet aan uw Git-repository wordt toegevoegd. Dit doet u door het bestand toe te voegen aan uw .gitignore:

echo ".env" >> .gitignore

Laad tot slot de dotenv-library bovenaan uw app.js-bestand:

require("dotenv").config();

Met deze setup leest dotenv automatisch uw .env-bestand uit wanneer u uw applicatie start met node app.js op uw ontwikkelmachine. In productie heeft u het .env-bestand niet nodig. De omgevingsvariabelen worden direct opgehaald uit de configuratie van uw Node.js-service, die u beheert via het Stackhero-dashboard.

Nu we de theorie hebben behandeld, volgt hier een praktisch voorbeeld.

U vindt een volledig werkend voorbeeld hier: https://github.com/stackhero-io/dotenvWithNodejs

Met deze technieken beheert u uw geheimen op een flexibele en veilige manier, waardoor het proces overzichtelijk en efficiënt blijft.