13 rozwiązań podnoszących bezpieczeństwo aplikacji w Node.js

Node.js wszedł do użytku niemal 10 lat temu, przyczyniając się do umocnienia doktryny JavaScript everywhere. Technologia jest dziś wykorzystywana nie tylko w startupach, ale również w aplikacjach gigantów rynkowych, takich jak Uber, Paypal i Netflix, dla których stała się realną alternatywą JavyPHP.

Jowita Kessler. Copywriter w Neotericu. Humanistka w IT – pisze do rzeczy i do ludzi, ubiera technologie w słowa i tłumaczy je na języki ludzkie. Nie ufa SkyNetowi, ale uczy się jak go okiełznać. Jej idolami w świecie treści z pogranicza technologii i biznesu są Cassie Kozyrkov i Neil Kakkar. Po godzinach ratownik, fanka nietoperzy, Gwiezdnych Wojen i rzadkich zjawisk atmosferycznych (od lat wypatruje nocnej tęczy).


Każda z wymienionych technologii ma swoich zwolenników i przeciwników, którzy w swoich argumentach o wyższości jednej technologii nad drugą (a następnie drugiej nad pierwszą) porównują je w zakresie skalowalności, wydajności, szybkości budowania aplikacji, jej bezpieczeństwa i innych aspektów. O ile jednak stosunkowo łatwo porównać technologie pod względem ich skalowalności, o tyle ocena bezpieczeństwa aplikacji przysparza już pewnych problemów. Dlaczego?

Czy Node jest bezpieczny?

Czy da się jednoznacznie stwierdzić, że Node jest bezpieczny? Nie do końca. Tak samo, jak nie da się jednoznacznie stwierdzić, że całkowicie bezpieczne są windy, samochody, samoloty, a nawet maile. Nie ma przecież nieskazitelnych, bezpiecznych dostawców usług mailowych. Istnieje jednak szereg rozwiązań, dzięki którym nasza korespondencja może stać się bezpieczniejsza.

Tak jak każda technologia wychodząca spod ludzkiej ręki, języki i środowiska programowania niosą ze sobą korzyści i zagrożenia. Większość technologii może osiągnąć satysfakcjonujący poziom bezpieczeństwa, dzięki wdrożeniu określonych zasad i Node nie jest w tym zakresie wyjątkiem. W tym artykule skupimy się na najlepszych rozwiązaniach podnoszących bezpieczeństwo w Node.js.

Czy Node stanowi zagrożenie dla bezpiecznego funkcjonowania aplikacji?

Node bywa postrzegany jako zagrożenie samo w sobie. Główną przyczyną może być brak domyślnej obsługi błędów, wynikający z konstrukcji platformy. Może to skutkować wyłączeniem serwera z powodu błędu powodującego nieprawidłowe działanie aplikacji. Poza typowymi problemami, związanymi z bezpieczeństwem aplikacji webowych, takich jak ataki XSS, CSRF, nieodpowiednie konfiguracje bezpieczeństwa, niepoprawne przekierowania i przeniesienia, do najczęstszych zagrożeń Node.js należą problemy charakterystyczne dla tej technologii, takie jak phishing w NPM (złośliwe moduły o podobnych nazwach) lub Regular Expressions DoS.

Jako krewniak JavaScriptu, Node jest narażony na pewne zagrożenia wywodzące się z samej architektury języka. Co więcej, podczas gdy sam JavaScript działa po stronie klienta, w przeglądarce, to Node działa po stronie serwera i oprócz powyższych jest narażony na wszelkie zagrożenia, z którymi zderza się oprogramowanie serwerowe.

Chociaż Node sam w sobie nie jest zagrożeniem dla bezpieczeństwa w internecie, korzystanie z komponentów dostarczanych przez podmioty trzecie może wiązać się z ryzykiem przemycenia do naszej aplikacji niebezpiecznego kodu. Oprogramowanie pochodzące z innych źródeł niż od zaufanych twórców może być przydatne, jednak korzystanie z niego często wiąże się z dodatkowym ryzykiem. Konfiguracja, instalacja oraz użytkowanie komponentów od zewnętrznych dostawców wymaga dodatkowych nakładów pracy, mających na szczególnym względzie  bezpieczeństwo aplikacji webowych.

Ładuj broń, wróg u bram

Zagrożenia dla aplikacji webowych pochodzą z różnych źródeł. Internet nie jest bezpiecznym miejscem dla wrażliwych aplikacji! Szeroki przedział dobrych praktyk, przydatnych komponentów i środków ostrożności przyczynia się jednak do znacznej poprawy bezpieczeństwa aplikacji budowanych w Node.js. Oto kilka z nich:

1. Nie korzystaj ze starych wersji Express

Według Node.js User Survey Report 2018, Express jest najpopularniejszym frameworkiem aplikacji internetowych dla Node.js. Bądź jednak ostrożny! Podczas gdy Express sam w sobie nie odpowiada bezpośrednio za bezpieczeństwo aplikacji (to nie jest jego rola), jego starsze wersje mogą przyczyniać się do zwiększenia zagrożenia. Dla zapewnienia bezpieczeństwa budowanych aplikacji konieczne jest korzystanie z jego aktualnych i wspieranych wersji.

2. Zainstaluj Helmet

Jeśli zdecydujesz się na użycie Node.js z Expressem, Helmet jest koniecznością! Jest to zbiór mniejszych funkcji, które poprawiają bezpieczeństwo nagłówków HTTP, w tym zapobiegają atakom typu cross-site scripting, man-in-the-middle oraz wymuszają bezpieczne (HTTPs lub SSL/TLS) połączenia z serwerem.

3. Korzystaj z TLS (Transport Layer Security)

TLS to technologia szyfrowania, zapobiegająca powszechnym atakom. Zalecana szczególnie w przypadku danych wrażliwych, ponieważ TLS zabezpiecza zarówno połączenie, jak i przesyłane dane.

4. Zapobiegaj XSS (Cross Site Scripting)

Cross Site Scripting jest jednym z najpopularniejszych typów zagrożeń, na które narażony jest Node.js. Mówiąc prościej, umożliwia on napastnikom wstrzyknięcie skryptów po stronie klienta na strony internetowe wyświetlane przez innych użytkowników, co może prowadzić do wycieków danych. Zapobieganie atakom XSS jest możliwe dzięki poprawnemu kodowaniu danych i wykorzystaniu narzędzi takich jak silnik Jade z wbudowanymi strukturami kodującymi.

5. Używaj tokenów Anti-Forgery

Zapobieganie Cross Site Forgery Requests (CSFR) wymaga użycia tokenów przeciwdziałających atakom. Tokeny Anti-CSRF towarzyszą żądaniu użytkownika, zapobiegają atakom one-click i są wykorzystywane przez serwer do weryfikacji autentyczności żądania.

6. Dodaj pakiet csurf do kodu Node.js

Pakiet csurf służy jako middleware w ochronie CSRF do tworzenia i walidacji tokenów. Csurf pomaga zapobiegać atakom CSRF, wyłączającym żądania w imieniu użytkowników aplikacji bez wzbudzania ich ostrożności.

7. Ustaw opcje bezpieczeństwa cookies

Korzystanie z domyślnej nazwy sesji cookie można uznać za zachowanie ryzykowne, ponieważ może narażać aplikację na precyzyjne ataki. Rozsądniejszym rozwiązaniem jest użycie jednego z modułów middleware sesji cookie: cookie-session i express-session.

8. Wyłącz X-Powered-By header

Wyłączenie X-Powered-By header jest prostą, ale skuteczną metodą unikania jednego z powszechnych zagrożeń powodowanych przez nagłówek używany przez hakerów. X-Powered-By wysyłane w każdym żądaniu daje hakerom informacje, jaka technologia jest używana w aplikacji, umożliwiając wykorzystanie jej słabości. Wyłączenie nagłówka ukrywa przed napastnikami informacje o tym, z jakich środków korzysta serwer.

9. Korzystaj z supervisor programs

Programy nadzorujące monitorują kod aplikacji i uruchamiają ją ponownie, gdy wystąpi błąd i program ulegnie awarii. Co ważne, programy takie, jak pm2, forever nodemon mogą również restartować programy w przypadku modyfikacji plików. Korzystanie z narzędzi koordynujących kod przyczynia się do lepszej konstrukcji aplikacji i jej ogólnej odporności na zagrożenia.

10. Podziel swoją aplikację na mikroserwisy

W miarę rozwoju projektu, zyskuje on nowych użytkowników i zestawy dodatkowych funkcji. Rozbudowa aplikacji skutkuje zwiększeniem jej rozmiarów, co również ma wpływ na bezpieczeństwo. Mikrousługi są samodzielnymi jednostkami, składającymi się na duże aplikacje. Podział monolitu na takie mniejsze mikroserwisy umożliwia izolację, lepsze skalowanie i indywidualne testowanie poszczególnych elementów.

11. Stosuj zasady linter security

Różne wtyczki linter umożliwiają identyfikację potencjalnych problemów na wczesnym etapie rozwoju projektu, przed wdrożeniem go do produkcji. Narzędzia takie jak ESLint nie tylko wymuszają czystszy kod, ale również pomagają wyeliminować potencjalne zagrożenia.

12. Korzystaj z Node Package Managera (NPM)

NPM umożliwia lepszą kontrolę zależności i bardziej wydajne workflow. Dodatkowo, wypuszczona dwa lata temu usługa NodeSource Certified Module kontroluje jakość kodu i licencji oraz zmniejsza ryzyko potencjalnych zagrożeń.

13. Uzbrój się w Cloudflare WAF (Web Application Firewall)

Cloudflare WAF to jeden z firewalli przyczyniających się do bezpieczeństwa aplikacji, także tych na skalę dużych przedsiębiorstw. Chroni aplikację przed atakami cross-site scripting, cross-site request forgery oraz SQL injection.

Koniec końców, czy Node.js jest bezpieczny?

Nie chodzi tylko o to, jakiego narzędzia lub technologii używasz, ale JAK to robisz. Najbardziej zaawansowany robot kuchenny nie uczyni z ciebie szefa kuchni. Kluczem do sukcesu, w tym przypadku — bezpieczeństwa aplikacji, jest doświadczenie i korzystanie z odpowiednich rozwiązań. Technologia jest tylko narzędziem w rękach programistów i większość krytycyzmu wobec Node.js odnosi się raczej do sposobów w jaki jest używany, a nie do tego, czym jest sam w sobie. Wyzwania pojawiają się w zależności od tego, do czego platforma jest używana, a nie tylko od jej charakteru. Node.js, podobnie jak inne języki i środowiska, jest bezpieczny, gdy projekty w nim budowane są traktowane z odpowiednią dbałością i zastosowaniem najlepszych praktyk.


Artykuł został pierwotnie opublikowany na neoteric.eu. Zdjęcie główne artykułu pochodzi z unsplash.com.

Patronujemy

 
 
Polecamy
System billingowy z wykorzystaniem AWS Lambda i Kotlina. Porównanie kosztów