Node.js: Geheimnisse verwalten

Wie Sie Geheimnisse mit Node.js verwalten

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet Ihnen eine einsatzbereite Node.js Cloud Umgebung, die darauf ausgelegt ist, Ihre Entwicklung zu beschleunigen:

  • Deployment in die Produktion in Sekunden mit einem einfachen git push. Keine zusätzlichen Tools oder manuelle Konfiguration erforderlich.
  • Nutzen Sie Ihre eigene Domain und profitieren Sie von automatischen HTTPS-Zertifikaten, damit Ihre Anwendung ohne zusätzlichen Aufwand sicher bleibt.
  • Automatische Backups, One-Click-Updates und planbare Preise ermöglichen es Ihnen, sich auf die Entwicklung neuer Features zu konzentrieren – Stackhero übernimmt das Infrastrukturmanagement für Sie.
  • Basierend auf privater, dedizierter Infrastruktur für konstante Performance und hohe Sicherheit.

Sparen Sie Zeit und reduzieren Sie Ihren Betriebsaufwand: Ihre Anwendung läuft auf dem Node.js Cloud Hosting von Stackhero in nur wenigen Minuten.

Wenn Ihr Node.js-Projekt mit einer Datenbank, einem Object Storage oder einer externen API interagiert, ist es wichtig, Zugangsdaten wie Benutzernamen, Passwörter oder Tokens sicher zu speichern. Diese Zugangsdaten werden häufig als "Geheimnisse" bezeichnet. Die Vertraulichkeit Ihrer Geheimnisse zu wahren, ist entscheidend für die Sicherheit Ihrer Anwendung.

Anfangs könnten Sie auf die Idee kommen, Ihre Zugangsdaten direkt im Code zu hinterlegen, zum Beispiel so:

// Verbindung zu einer PostgreSQL-Datenbank
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Diese Vorgehensweise ist jedoch nicht sicher. Ihre Geheimnisse könnten so leicht in Ihrem Git-Repository landen und wären damit für jeden mit Zugriff sichtbar. Selbst wenn Sie glauben, dass nur Sie Zugriff haben, ist es vergleichbar damit, einen Zettel mit Ihren Passwörtern an den Monitor zu kleben und zu hoffen, dass es niemand bemerkt. Das kann letztlich zu ernsthaften Sicherheitsproblemen führen.

Außerdem erschwert das Hardcodieren von Geheimnissen das reibungslose Verwalten verschiedener Umgebungen wie Entwicklung und Produktion.

Eine in der Branche weit verbreitete Best Practice ist es, Geheimnisse in Umgebungsvariablen zu speichern.

Umgebungsvariablen werden außerhalb Ihres Codes definiert und vor dem Start von Node.js gesetzt. Die Idee ist, alle Ihre Geheimnisse über Umgebungsvariablen zu definieren, sodass sie niemals fest im Anwendungscode stehen.

Sie können eine Umgebungsvariable setzen, indem Sie sie beim Start Ihres Node.js-Kommandos angeben, zum Beispiel so:

MY_PASSWORD=myDevelopmentPassword node app.js

Dieser Befehl erstellt eine Variable namens MY_PASSWORD mit dem Wert myDevelopmentPassword. Das Format ist einfach: <KEY>=<value>.

Üblicherweise werden Umgebungsvariablen in Großbuchstaben geschrieben. Beachten Sie, dass Umgebungsvariablen nur Zeichenketten speichern können, keine Arrays oder Objekte.

In Ihrer Datei app.js können Sie auf Ihre Umgebungsvariable mit process.env zugreifen, zum Beispiel:

console.log(process.env.MY_PASSWORD);

Dies gibt myDevelopmentPassword aus.

Ihr Passwort ist nun außerhalb Ihres Codes definiert. Das hilft zu verhindern, dass es versehentlich in Ihr Git-Repository gelangt.

Wenn Sie Stackhero in einer Produktionsumgebung nutzen, können Sie eine neue Umgebungsvariable mit dem Namen MY_PASSWORD und dem Wert myProductionPassword direkt im Dashboard Ihres Node.js-Services anlegen. So können Sie problemlos zwischen verschiedenen Umgebungen wechseln.

Beispiel einer Node.js-Konfiguration im Stackhero-DashboardBeispiel einer Node.js-Konfiguration im Stackhero-Dashboard

Mit dieser Methode wird Ihr Passwort nicht mehr im Code gespeichert, und Sie können für Entwicklungs- und Produktionsumgebungen problemlos unterschiedliche Zugangsdaten verwenden.

In realen Projekten müssen oft mehrere Geheimnisse verwaltet werden. Beispielsweise benötigt die Verbindung zu einer Datenbank meist einen Hostnamen, einen Benutzernamen und ein Passwort.

Ein einzelnes Geheimnis zu handhaben ist einfach, aber mehrere zu verwalten wird schnell unübersichtlich. Stellen Sie sich vor, Sie starten Ihre Anwendung mit einem Befehl wie diesem:

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

Das wird schnell unleserlich und schwer zu pflegen. In der Produktion benötigen Sie vermutlich noch mehr Variablen, was diese Methode unpraktisch macht.

Hier kommt die dotenv-Bibliothek ins Spiel.

Mit dotenv können Sie Ihre Geheimnisse in einer separaten Datei namens .env speichern.

Um loszulegen, installieren Sie die dotenv-Bibliothek mit folgendem Befehl:

npm install dotenv

Erstellen Sie anschließend eine .env-Datei, in der Sie Ihre Variablen ablegen:

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

Um Ihre Geheimnisse zu schützen, stellen Sie sicher, dass Ihre .env-Datei nicht in Ihr Git-Repository aufgenommen wird. Fügen Sie sie dazu Ihrer .gitignore-Datei hinzu:

echo ".env" >> .gitignore

Laden Sie abschließend die dotenv-Bibliothek am Anfang Ihrer app.js-Datei:

require("dotenv").config();

Mit dieser Konfiguration liest dotenv beim Start Ihrer Anwendung mit node app.js die .env-Datei automatisch auf Ihrer Entwicklungsmaschine ein. In der Produktion benötigen Sie die .env-Datei nicht. Die Umgebungsvariablen werden direkt aus der Konfiguration Ihres Node.js-Services übernommen, die Sie über das Stackhero-Dashboard verwalten können.

Nachdem wir die Theorie behandelt haben, schauen wir uns ein konkretes Beispiel an.

Ein vollständiges, funktionierendes Beispiel finden Sie hier: https://github.com/stackhero-io/dotenvWithNodejs

Mit diesen Techniken können Sie Ihre Geheimnisse flexibel und sicher verwalten und den Prozess einfach und effizient gestalten.