Node.js: Geheimnisse verwalten

Wie Sie Geheimnisse mit Node.js verwalten

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Node.js Cloud Lösung, die zahlreiche Vorteile bietet, darunter:

  • Deployen Sie Ihre Anwendung in Sekundenschnelle mit einem einfachen git push.
  • Nutzen Sie Ihren eigenen Domainnamen und profitieren Sie von der automatischen Konfiguration von HTTPS-Zertifikaten für erhöhte Sicherheit.
  • Genießen Sie sorgenfreie automatische Backups, Ein-Klick-Updates und eine einfache, transparente und vorhersehbare Preisgestaltung.
  • Erhalten Sie optimale Performance und robuste Sicherheit dank einer privaten und dedizierten VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Node.js Cloud Hosting Lösung von Stackhero auszuprobieren!

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.