Node.js: Tvarkykite slaptus duomenis

Kaip tvarkyti slaptus duomenis naudojant Node.js

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Node.js cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Įdiekite savo programą per kelias sekundes su paprastu git push.
  • Naudokite savo domeno vardą ir pasinaudokite automatiniu HTTPS sertifikatų konfigūravimu, kad padidintumėte saugumą.
  • Mėgaukitės ramybe su automatinėmis atsarginėmis kopijomis, vieno paspaudimo atnaujinimais ir paprasta, skaidria bei prognozuojama kainodara.
  • Gaukite optimalią veikimo ir tvirtą saugumą dėka privačios ir dedikuotos VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: išbandyti Stackhero Node.js cloud hosting sprendimą užtrunka tik 5 minutes!

Kai jūsų Node.js projektas sąveikauja su duomenų baze, objektų saugykla ar išorine API, labai svarbu saugiai laikyti prisijungimo duomenis, tokius kaip naudotojo vardai, slaptažodžiai ar prieigos raktai (token). Šie prisijungimo duomenys dažnai vadinami „slaptais duomenimis“ (secrets). Jų konfidencialumo užtikrinimas yra būtinas norint išlaikyti jūsų aplikacijos saugumą.

Iš pradžių galite svarstyti galimybę įrašyti prisijungimo duomenis tiesiai į kodą, pavyzdžiui, taip:

// Prisijungimas prie PostgreSQL duomenų bazės
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Tačiau toks būdas nėra saugus. Taip jūsų slaptos reikšmės gali lengvai patekti į Git saugyklą ir tapti matomos visiems, turintiems prieigą prie kodo. Net jei manote, kad tik jūs turite prieigą, tai prilygsta slaptažodžių užrašymui ant lapelio ir palikimui ant monitoriaus tikintis, kad niekas nepastebės. Ilgainiui tai gali sukelti rimtų saugumo problemų.

Be to, slaptažodžių įrašymas tiesiai į kodą apsunkina sklandų skirtingų aplinkų, tokių kaip kūrimo ir gamybinė (production), valdymą.

Viena iš dažniausiai naudojamų gerųjų praktikų pramonėje – slaptus duomenis laikyti aplinkos kintamuosiuose.

Aplinkos kintamieji apibrėžiami už jūsų kodo ribų ir nustatomi prieš paleidžiant Node.js. Idėja – visus slaptus duomenis apibrėžti naudojant aplinkos kintamuosius, kad jie niekada nebūtų užkoduoti pačioje aplikacijoje.

Aplinkos kintamąjį galite apibrėžti paleisdami Node.js komandą taip:

MY_PASSWORD=myDevelopmentPassword node app.js

Ši komanda sukuria kintamąjį MY_PASSWORD su reikšme myDevelopmentPassword. Formatas paprastas: <RAKTAS>=<reikšmė>.

Pagal nusistovėjusią praktiką, aplinkos kintamieji rašomi didžiosiomis raidėmis. Taip pat verta žinoti, kad aplinkos kintamieji gali saugoti tik tekstines reikšmes (string), o ne masyvus ar objektus.

Jūsų app.js faile prie aplinkos kintamojo galite prieiti per process.env, pavyzdžiui:

console.log(process.env.MY_PASSWORD);

Tai išves myDevelopmentPassword.

Dabar jūsų slaptažodis apibrėžtas už kodo ribų, todėl sumažėja rizika, kad jis netyčia pateks į Git saugyklą.

Jei naudojate Stackhero gamybinėje aplinkoje, galite apibrėžti naują aplinkos kintamąjį MY_PASSWORD su reikšme myProductionPassword tiesiai iš Node.js paslaugos valdymo skydelio. Tai leidžia lengvai užtikrinti sklandų darbą tarp skirtingų aplinkų.

Node.js konfigūracijos pavyzdys Stackhero valdymo skydelyjeNode.js konfigūracijos pavyzdys Stackhero valdymo skydelyje

Naudojant šį metodą, slaptažodis nebėra saugomas kode, o skirtingiems aplinkoms galite lengvai naudoti skirtingus prisijungimo duomenis.

Realiuose projektuose dažnai reikia valdyti kelis slaptus duomenis. Pavyzdžiui, jungiantis prie duomenų bazės gali reikėti nurodyti host'ą, naudotojo vardą ir slaptažodį.

Vieną slaptą reikšmę valdyti paprasta, tačiau kai jų daug, tai greitai tampa nepatogu. Įsivaizduokite, kad aplikaciją paleidžiate tokia komanda:

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

Tai greitai tampa sunkiai skaitoma ir prižiūrima. Gamybinėje aplinkoje kintamųjų gali būti dar daugiau, todėl toks būdas tampa nepraktiškas.

Čia padeda dotenv biblioteka.

Naudojant dotenv, slaptus duomenis galite laikyti atskirame faile, pavadintame .env.

Pradžiai įdiekite dotenv biblioteką vykdydami:

npm install dotenv

Tada sukurkite .env failą, kuriame laikysite kintamuosius:

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

Kad apsaugotumėte slaptus duomenis, pasirūpinkite, kad .env failas nepatektų į jūsų Git saugyklą. Tam pridėkite jį į .gitignore failą:

echo ".env" >> .gitignore

Galiausiai, įkelkite dotenv biblioteką pačioje app.js failo pradžioje:

require("dotenv").config();

Naudojant šią konfigūraciją, kai paleidžiate aplikaciją su node app.js, dotenv automatiškai perskaito jūsų .env failą kūrimo aplinkoje. Gamyboje .env failo nereikia – aplinkos kintamieji paimami tiesiai iš Node.js paslaugos konfigūracijos, kurią galite valdyti Stackhero valdymo skydelyje.

Dabar, kai aptarėme teoriją, pažiūrėkime į praktinį pavyzdį.

Pilnai veikiantį pavyzdį rasite čia: https://github.com/stackhero-io/dotenvWithNodejs

Naudodami šiuos metodus, galėsite lanksčiai ir saugiai valdyti slaptus duomenis, o pats procesas bus aiškus ir efektyvus.