Tento dokument môže byť v porovnaní s dokumentáciou v angličtine zastaralý. Aktuálne informácie nájdete v dokumentácii v angličtine.

Osvedčené postupy pre Express v produkcii - Security

Prehľad

Termín “production” znamená stav životného cyklu softvéru, kedy je aplikácia, alebo jej API, všeobecne prístupná koncovým používateľom. Naopak, termín “development” znamená, že sa kód aktívne vyvíja, testuje a aplikácia nie je verejne prístupná. K tomu korešpondujúce systémové prostredia sa nazývajú production resp. development prostredie.

Development a production prostredia sú zvyčajne nakonfigurované odlišne a majú často diametrálne odlišné požiadavky. Čo je povolené v developmente nemusí byť akceptovateľné v produkcii. Napr., v development prostredí môžete chcieť logovať maximum errorov pre debugovanie, ale takéto správanie sa systému môže byť považované za security problém v prípade production prostredia. V prípade developmentu sa často nemusíte starať o veci ako sú škálovateľnosť, spoľahlivosť a výkonnosť, kým v produkcii sa tieto veci považujú za kritické.

Tento článok popisuje niektoré osvedčené postupy z pohľadu bezpečnosti Express aplikácií v produkcii.

POZN.: Ak si myslíte, že ste objavili security vulnerabilitu Express-u, prosím pozrite si Security Policies and Procedures.

Nepoužívajte deprecated a vulnerable verzie Express-u

Express 2.x a 3.x už nie sú viacej udržované. Security a performance problémy v týchto verziách už nik neopravuje. Preto ich nepoužívajte! Ak ste vaše Express aplikácie ešte nezmigrovali na verziu 4, postupujte podľa príručky Prechod na Express 4.

Taktiež sa uistite, že nepoužívate žiadnu z vulnerable Express verzií nachádzajúcu sa na stránke Security - aktualizácie. Ak áno, updatnite vašu aplikáciu na niektorú zo stabilných verzií, ideálne na najnovšiu.

Používajte TLS

Ak vaša aplikácia pracuje, alebo prenáša citlivé dáta, použivajte Transport Layer Security (TLS) pre zabepečenie spojenia a dát. Táto technológia šifruje dáta pred ich odoslaním z klienta na server, čím predchádza niektorým bežným (a jednoduchým) útokom. Hoci Ajax a POST requesty nemusia byť viditeľné a zdajú sa skryté v prehliadači, ich network traffic je zraniteľný na packet sniffing a man-in-the-middle útoky.

Možno ste sa už stretli so Secure Socket Layer (SSL) šifrovaním. TLS je ďalšou modifikáciou SSL. Inými slovami, ak ste predtým používali SSL, zvážte upgrade na TLS. Vo všeobecnosti odporúčame pre handlovanie TLS používať Nginx. Ako dobrú referenciu ako nakonfigurovať TLS na Ngix-e (a ďalších serveroch) uvádzame Recommended Server Configurations (Mozilla Wiki).

Taktiež sa vám môže hodiť nástroj Let’s Encrypt, pomocou ktorého môžete získať TLS certifikát zdarma. Je voľnou, automatizovanou a otvorenou certifikačnou autoritou (CA) prevádzkovanou Internet Security Research Group (ISRG).

Používajte Helmet

Helmet môže pomôcť ochrániť vašu aplikáciu voči niektorým, všeobecne známym zraniteľnostiam, pomocou správneho nastavenia HTTP hlavičiek.

Helmet je v skutočnosti len kolekcia deviatich menších middleware funkcií nastavujúcich HTTP hlavičky týkajúce sa bezpečnosti:

Helmet nainštalujete rovnako, ako akýkoľvek iný modul:


$ npm install --save helmet

Potom ho môžete použiť vo vašom kóde takto:


...
var helmet = require('helmet');
app.use(helmet());
...

Určite aspoň zakážte X-Powered-By hlavičku

Ak nechcete použiť Helmet, potom určite aspoň zakážte X-Powered-By hlavičku. Útočník dokáže zneužiť túto hlavičku (ktorá je defaultne povolená) k detekcii Express aplikácií a následne vykonať špecifické typy útokov.

Preto sa odporúča, vypnúť túto hlavičku pomocou app.disable() metódy:


app.disable('x-powered-by');

V prípade, že použijete modul helmet.js, ten sa o to postará.

Používajte cookies bezpečným spôsobom

Aby ste sa uistili, že cookies nepredstavujú zraniteľnosť vašej aplikácie, nepoužívajte pre session cookie defaultný názov a nastavte správne security parametre.

Pre prácu s cookie existujú dva hlavné middleware moduly:

Hlavným rozdielom medzi týmito modulmi je spôsob ukladania cookie session dát. express-session middleware ukladá session dáta na servery; v samotnej cookie sa ukladá len session ID, nie session dáta. Defaultne je použité ako úložisko pamäť, čo je nevhodné pre použitie v production prostredí. Tam budete musieť nastaviť škálovateľné session úložisko; pozrite sa na compatible session stores.

cookie-session middleware implementuje vlastné cookie-backed úložisko: serializuje celú session do cookie a nie len jej session ID. Použitie tejto implementácie sa odporúča v prípade, že sú session dáta relatívne malé a ľahko šifrovateĺné, ako primitívne hodnoty (skôr než objekty). Hoci by prehliadače mali podporovať veľkosť cookie aspoň 4096 bytes, aby ste sa uistili, že nepresiahnete limit, neprekračujte veľkosť 4093 bytes pre doménu. Taktiež si musíte uvedomiť, že cookie dáta budú na klientovi viditeľné, takže ak existuje dôvod, prečo by ste ich chceli uchovávať radšej zabezpečené a utajené, potom je lepšie použiť express-session modul.

Používaním defaultného názvu session cookie vystavujete aplikáciu možným útokom. Táto zraniteľnosť je podobná tej X-Powered-By: útočník dokáže zneužiť túto informáciu a vykonať cielené útoky.

Aby ste sa vyhli tomuto problému, použite generické názvy cookie; napr použitím express-session middlewaru:


var session = require('express-session');
app.set('trust proxy', 1); // trust first proxy
app.use( session({
   secret : 's3Cur3',
   name : 'sessionId',
  })
);

Pre zlepšenie bezpečnosti nastavte nasledujúce cookie parametre:

Tu je príklad použitia cookie-session middleware modulu:


var session = require('cookie-session');
var express = require('express');
var app = express();

var expiryDate = new Date( Date.now() + 60 * 60 * 1000 ); // 1 hour
app.use(session({
  name: 'session',
  keys: ['key1', 'key2'],
  cookie: { secure: true,
            httpOnly: true,
            domain: 'example.com',
            path: 'foo/bar',
            expires: expiryDate
          }
  })
);

Uistite sa, že používate bezpečné dependencie

Používanie npm, ku správe dependencií aplikácie je efektívne a pohodlné, avšak dependencie ktoré používate môžu obsahovať kritické bezpečnostné diery, ktoré môžu taktiež ovplyvniť vašu aplikáciu. Bezpečnosť vašej aplikácie je len tak silná, ako je “najslabší článok” vašej aplikácie.

Pre uistenie sa, že sú vaše dependencie bezpečné, použite niektorý z nasledujúcich toolov: nsp a requireSafe. Oba robia v princípe to isté.

nsp je command-line tool, ktorý porovnáva Node Security Project vulnerability databázu voči dependenciám použitých vo vašej aplikácii a zisťuje, či neobsahujú niektoré zo známych vulnerabilities. Tento tool nainštalujete takto:


$ npm i nsp -g

Pomocou nasledujúceho príkazu submitnete npm-shrinkwrap.json / package.json na validáciu do nodesecurity.io:


$ nsp check

Tu je príklad použitia requireSafe pre audit vašich Node modulov:


$ npm install -g requiresafe
$ cd your-app
$ requiresafe check

Ďalšie odporúčania

Tu sú ďalšie odporúčania zo skvelého Node.js Security Checklist zoznamu. Pre viac detailov ohľadom jednotlivých odporúčaní si prečítajte samotný blog post:

Vyhnite sa ďalším známym zraniteľnostiam

Sledujte Node Security Project odporučania, ktoré môžu ovplyvňovať Express, príp. ostatné moduly vašej aplikácie. Vo všeobecnosti je Node Security Project skvelým zdrojom znalostí a toolov ohľadom bezpečnosti Node.js.

Na záver dodajme, že Express aplikácie - ako akékoľvek iné webové aplikácie - môžu byť náchylné na mnohé typy útokov. Zoznámte sa so zoznamom známych web vulnerabilities a prijmite opatrenia, aby ste sa im vyhli.