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 komunikuje się z bazą danych, obiektem storage lub zewnętrznym API, niezwykle ważne jest bezpieczne przechowywanie danych uwierzytelniających, takich jak nazwy użytkowników, hasła czy tokeny. Takie dane często określa się mianem "sekretów". Zachowanie poufności sekretów jest kluczowe dla bezpieczeństwa Twojej aplikacji.
Co możesz być skłonny zrobić
Na początku możesz rozważać zapisanie danych uwierzytelniających bezpośrednio w kodzie, na przykład tak:
// Połączenie z bazą danych PostgreSQL
const pg = new Client({
host: '<XXXXXX>.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Jednak takie podejście nie jest bezpieczne. Twoje sekrety mogą łatwo trafić do repozytorium Git, przez co będą widoczne dla każdego, kto ma dostęp do kodu. Nawet jeśli wydaje Ci się, że tylko Ty masz dostęp, to tak, jakby zostawić karteczkę z hasłami na monitorze i liczyć, że nikt jej nie zauważy. Może to prowadzić do poważnych problemów z bezpieczeństwem.
Dodatkowo, twarde kodowanie sekretów utrudnia sprawne zarządzanie różnymi środowiskami, takimi jak development i produkcja.
Zmienne środowiskowe
Jedną z najlepszych praktyk w branży jest przechowywanie sekretów w zmiennych środowiskowych (environment variables).
Zmienne środowiskowe są definiowane poza kodem i ustawiane przed uruchomieniem Node.js. Chodzi o to, aby wszystkie sekrety były przekazywane przez zmienne środowiskowe, dzięki czemu nigdy nie są zapisane na stałe w aplikacji.
Definiowanie pierwszych zmiennych środowiskowych
Zmienne środowiskowe możesz ustawić, przekazując je na początku polecenia uruchamiającego Node.js, na przykład:
MY_PASSWORD=myDevelopmentPassword node app.js
To polecenie tworzy zmienną o nazwie MY_PASSWORD i wartości myDevelopmentPassword. Format jest prosty: <KLUCZ>=<wartość>.
Zgodnie z konwencją, nazwy zmiennych środowiskowych zapisuje się wielkimi literami. Warto pamiętać, że zmienne środowiskowe mogą przechowywać tylko ciągi znaków (stringi), nie tablice ani obiekty.
Odczytywanie zmiennych środowiskowych
W pliku app.js możesz uzyskać dostęp do zmiennej środowiskowej przez process.env, na przykład:
console.log(process.env.MY_PASSWORD);
Wyświetli to myDevelopmentPassword.
Teraz Twoje hasło jest zdefiniowane poza kodem, co pomaga uniknąć przypadkowego dodania go do repozytorium Git.
Jeśli korzystasz ze Stackhero w środowisku produkcyjnym, możesz zdefiniować nową zmienną środowiskową o nazwie MY_PASSWORD i wartości myProductionPassword bezpośrednio z poziomu dashboardu usługi Node.js. Dzięki temu łatwo zachować spójność i bezpieczeństwo między środowiskami.
Przykład konfiguracji Node.js w panelu Stackhero
Dzięki temu rozwiązaniu hasło nie jest już przechowywane w kodzie i możesz wygodnie korzystać z różnych danych uwierzytelniających w środowiskach deweloperskim i produkcyjnym.
Korzystanie z biblioteki dotenv
W rzeczywistych projektach często trzeba zarządzać wieloma sekretami. Na przykład połączenie z bazą danych wymaga hosta, nazwy użytkownika i hasła.
Obsługa pojedynczego sekretu jest prosta, ale zarządzanie kilkoma szybko staje się niewygodne. Wyobraź sobie uruchamianie aplikacji poleceniem takim jak:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Taka komenda szybko staje się nieczytelna i trudna w utrzymaniu. W produkcji liczba zmiennych może być jeszcze większa, co czyni to rozwiązanie niepraktycznym.
Właśnie tutaj przydaje się biblioteka dotenv.
Dzięki dotenv możesz przechowywać sekrety w osobnym pliku .env.
Aby zacząć, zainstaluj bibliotekę dotenv poleceniem:
npm install dotenv
Następnie utwórz plik .env i umieść w nim swoje zmienne:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Aby chronić swoje sekrety, upewnij się, że plik .env nie zostanie dodany do repozytorium Git. Możesz to zrobić, dodając go do pliku .gitignore:
echo ".env" >> .gitignore
Na końcu załaduj bibliotekę dotenv na początku pliku app.js:
require("dotenv").config();
Dzięki temu rozwiązaniu, gdy uruchamiasz aplikację poleceniem node app.js, dotenv automatycznie odczyta plik .env na Twoim komputerze deweloperskim. W środowisku produkcyjnym plik .env nie jest potrzebny — zmienne środowiskowe są pobierane bezpośrednio z konfiguracji usługi Node.js, którą możesz zarządzać przez dashboard Stackhero.
Przykład działania
Skoro omówiliśmy teorię, zobaczmy praktyczny przykład.
Kompletny, działający przykład znajdziesz tutaj: https://github.com/stackhero-io/dotenvWithNodejs
Dzięki tym technikom możesz zarządzać sekretami w elastyczny i bezpieczny sposób, a cały proces pozostaje prosty i wydajny.