Node.js: Zarządzanie sekretami
Jak zarządzać sekretami w Node.js
👋 Witamy w dokumentacji Stackhero!
Stackhero oferuje gotowe do użycia rozwiązanie Node.js cloud, które zapewnia wiele korzyści, w tym:
- Wdrażaj swoją aplikację w kilka sekund za pomocą prostego
git push.- Używaj własnej nazwy domeny i korzystaj z automatycznej konfiguracji certyfikatów HTTPS dla zwiększonego bezpieczeństwa.
- Ciesz się spokojem dzięki automatycznym kopiom zapasowym, aktualizacjom jednym kliknięciem oraz prostemu, przejrzystemu i przewidywalnemu cennikowi.
- Uzyskaj optymalną wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.
Oszczędzaj czas i upraszczaj sobie życie: wypróbowanie rozwiązania Node.js cloud hosting Stackhero zajmuje tylko 5 minut!
Gdy Twój projekt Node.js współpracuje z bazą danych, obiektowym magazynem danych lub zewnętrznym API, kluczowe jest bezpieczne przechowywanie danych uwierzytelniających, takich jak nazwy użytkowników, hasła czy tokeny, często nazywane "sekretami". Utrzymanie tych sekretów w tajemnicy jest niezbędne dla zachowania bezpieczeństwa.
Co możesz być skłonny zrobić
Możesz początkowo rozważyć coś takiego:
// Łączenie z bazą danych PostgreSQL
const pg = new Client({
host: 'xxxxx.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Niestety, ta metoda nie jest bezpieczna. Dlaczego? Ponieważ Twoje sekrety mogą trafić do repozytorium Git, narażając je na dostęp dla każdego, kto ma dostęp. Nawet jeśli myślisz, że tylko Ty masz dostęp, to jak zostawienie karteczki z hasłami na monitorze i zakładanie, że nikt inny tego nie zobaczy. To może ostatecznie prowadzić do problemów z bezpieczeństwem.
Dodatkowo, to podejście nie wspiera płynnego zarządzania różnymi środowiskami, takimi jak deweloperskie i produkcyjne.
Zmienne środowiskowe
Powszechnie przyjętą praktyką w branży jest przechowywanie sekretów w zmiennych środowiskowych.
Zmienne środowiskowe są definiowane poza kodem i ustawiane przed uruchomieniem Node.js. Koncepcja polega na definiowaniu wszystkich sekretów za pomocą zmiennych środowiskowych, unikając ich twardego kodowania w aplikacji.
Definiowanie pierwszych zmiennych środowiskowych
Aby zdefiniować zmienną środowiskową, możesz ją ustawić na początku uruchamiania Node.js w ten sposób: MY_PASSWORD=myDevelopmentPassword node app.js
Ta komenda ustawia zmienną o nazwie "MY_PASSWORD" z wartością "myDevelopmentPassword". Format to po prostu <KEY>=<value>.
Zgodnie z konwencją, zmienne środowiskowe są pisane wielkimi literami. Zauważ, że można używać tylko ciągów znaków, nie tablic ani obiektów.
Odczytywanie zmiennych środowiskowych
W pliku app.js możesz odczytać nową zmienną środowiskową za pomocą process.env w ten sposób: console.log(process.env.MY_PASSWORD);. To wyświetli myDevelopmentPassword.
Teraz hasło jest zdefiniowane poza kodem, co zapobiega jego publikacji w repozytorium Git.
Na Stackhero, w środowisku produkcyjnym, masz możliwość zdefiniowania nowej zmiennej środowiskowej o nazwie "MY_PASSWORD" zawierającej "myProductionPassword" bezpośrednio w panelu sterowania usługi Node.js, zapewniając płynne działanie.
Przykład konfiguracji Node.js na panelu Stackhero
Podsumowując, Twoje hasło nie jest już przechowywane w kodzie, a Ty masz oddzielne hasła dla środowisk deweloperskich i produkcyjnych.
Korzystanie z biblioteki dotenv
W rzeczywistych scenariuszach często trzeba zarządzać wieloma sekretami. Na przykład, połączenie z bazą danych wymaga przechowywania nazwy hosta, użytkownika i hasła.
Zarządzanie jednym sekretem jest proste, ale zarządzanie wieloma może stać się uciążliwe. Wyobraź sobie uruchamianie aplikacji z tą linią komend:
POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Ta linia jest niewygodna i trudna do utrzymania. Aplikacja produkcyjna może wymagać wielu zmiennych, co czyni to podejście niepraktycznym.
Właśnie tutaj biblioteka dotenv staje się nieoceniona.
Dzięki dotenv, sekrety mogą być przechowywane w osobnym pliku o nazwie .env.
Najpierw możesz zainstalować bibliotekę dotenv za pomocą:
npm install dotenv
Następnie utwórz plik .env zawierający zmienne:
POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Upewnij się, że ten plik .env nie jest przesyłany do repozytorium Git, dodając go do listy ignorowanych plików:
echo ".env" >> .gitignore
Na koniec załaduj bibliotekę dotenv na początku pliku app.js w ten sposób:
require("dotenv").config();
Z tą konfiguracją, podczas uruchamiania aplikacji za pomocą node app.js, dotenv automatycznie odczyta zawartość pliku .env na Twojej platformie deweloperskiej. W produkcji ten plik nie istnieje, a zmienne środowiskowe są pobierane bezpośrednio z konfiguracji usługi Node.js (dostępnej na panelu Stackhero).
Przykład działania
To wszystko było teorią. Przejdźmy do rzeczywistego przykładu.
Możesz znaleźć kompletny przykład dostępny tutaj: https://github.com/stackhero-io/dotenvWithNodejs
Teraz wiesz, jak zarządzać swoimi sekretami w elastyczny i bezpieczny sposób, wszystko to bardzo łatwo.