Podstawy bezpieczeństwa aplikacji internetowych

 gru, 07 - 2014   Bezpieczeństwo

Bezpieczeństwo systemów internetowychBezpieczeństwo jest jednym z ważniejszych zagadnień podczas projektowania i tworzenia aplikacji, szczególnie w przypadku systemów działających na tzw. danych wrażliwych, takich jak dane personalne, adresy, numery kont bankowych, hasła, itp. Artykuł ten poświęcony jest bezpieczeństwu systemów internetowych i zostaną w nim opisane kwestie związane z szeroko rozumianą ochroną aplikacji w sieci.

 

Temat bezpieczeństwa jest bardzo rozległy, dlatego poniżej przedstawione zostały jedynie ogólne charakterystyki problemów, jakie każdy programista i projektant powinien wziąć pod uwagę.

 

Wprowadzenie

Na ogólny poziom bezpieczeństwa aplikacji internetowej składa się bardzo wiele czynników i trudno jest jednoznacznie stwierdzić, który z nich jest najważniejszy. Ogólnie stwierdza się, że poziom bezpieczeństwa danego systemu jest tak wysoki jak najgorzej zabezpieczony element tego systemu. Dlatego należy pamiętać o jak najdokładniejszym zabezpieczeniu wszystkich części aplikacji oraz postarać się przeanalizować jak największą ilość działań, które mogą spowodować zagrożenia w bezpieczeństwie i w miarę możliwości starać się im przeciwdziałać. Należy także mieć na uwadze to, że w zdecydowanej większości przypadków, zagrożenia wywoływane są przez człowieka, czy to świadomie, czy też nieświadomie. Większość luk w systemach bezpieczeństwa aplikacji pojawia się w wyniku przeoczenia oczywistego niebezpieczeństwa przez programistę, a nie jest efektem jakichś specjalnych technik włamania zastosowanych przez atakującego.

Pomimo tego, iż należy dążyć do jak najdokładniejszego zabezpieczenia systemu, całkowite jego bezpieczeństwo jest rzeczą nie do osiągnięcia, w szczególności w aplikacjach sieciowych, udostępnianych przez Internet. Zagrożenia związane z połączeniem do sieci internetowej są tak liczna i nieprzewidywalne, że eksperci mówiąc o bezpieczeństwie, mają raczej na myśli omijanie lub łagodzenie zagrożeń, niż ich eliminacje.

 

 

Potrzeba wprowadzenia zabezpieczeń

Internetowi napastnicy próbują włamać się do aplikacji, używają jej w nieprzewidziany sposób, by doprowadzić do wystąpienia błędów i innych sytuacji, które mogliby wykorzystać do swoich celów. Sytuacje, których nikt nie przewidział, niemal zawsze stanowią zagrożenie bezpieczeństwa. Pierwsza rzeczą, jaką mogą zrobić programiści, to zauważyć konieczność wyposażenia aplikacji w mechanizmy zabezpieczeń. W ramach tego należy określić, co tak naprawdę wymaga ochrony (przedmiot), przed kim ma być ona zastosowana (podmiot) oraz w jakim celu, a także jakie zastosować zabezpieczenia i w jaki sposób je zrealizować.

Przedmiotem ochrony są wszelkie zasoby aplikacji. Zazwyczaj będą to należące do niej dane, lecz mogą to być także pliki, połączenia, usługi oraz wszelkie inne informacje, które mają dla niej jakąś wartość. Podmiotem są wszyscy korzystający z aplikacji. Zazwyczaj będą to zwyczajni użytkownicy, jednak mogą to także być inne programy korzystające z usług sieciowych lub udostępnionego, zewnętrznego interfejsu programowania. Zadaniem ochrony jest przede wszystkim zapewnienie bezpieczeństwa uczciwym użytkownikom, korzystającym z aplikacji.

Jeśli chodzi o wybór zabezpieczeń i sposób ich realizacji, tutaj możliwości jest bardzo wiele. Ogólna zasada mówi, że należy ograniczać powierzchnię ataku. Ograniczenie liczby funkcji aplikacji jedynie do tych, które są niezbędne, ułatwia właściwe zajęcie się jej zabezpieczeniem. Po ustaleniu kim będą jej użytkownicy oraz jakie czynności będą mogli wykonywać, można zająć się wykorzystaniem najlepszych metod zabezpieczania. Wiele zależy od technologii, w jakiej wykonywana jest aplikacja (serwerów, języka programowania, itp.), niemniej jednak podstawowe reguły są takie same.

 

Poufność i prywatność

Kluczowym elementem dynamicznych serwisów internetowych są dane. Niektóre z nich są banalne i nie wymagają szczególnej ochrony. Istnieją jednak także dane specjalne, na przykład nazwiska i adresy, hasła, numery ubezpieczeń, kart kredytowych, telefonów itd. Są to tak zwane dane prywatne czyli takie, które nie powinny stać się ogólnodostępne ani bezpańskie. Ich wartość polega na tym, że pomagają ustalić unikalną tożsamość ich właściciela. Takie dane muszą być chronione, a aplikacja powinna je ujawniać tylko w odpowiednich sytuacjach. Oznacza to, że należy upewnić się, iż w trakcie działania aplikacji informacje te w żaden niezaplanowany i przypadkowy sposób nie zostaną ujawnione. Oprócz tego, jeśli aplikacja przesyła wrażliwe dane przez sieć, konieczne jest przedsięwzięcie odpowiednich środków mających na celu zapewnienie bezpieczeństwa informacji podczas transmisji, na przykład zaszyfrowanie ich.

 

Integralność, walidacja i szyfrowanie danych

W aplikacjach internetowych bazujących na danych, ogromne znaczenie ma zapewnienie prawidłowości danych. Oznacza, że dane zostaną sprawdzone za każdym razem, gdy trafią do systemu, oraz że będą istnieć sposoby weryfikacji ich poprawności. Programista piszący aplikację, musi zawsze zakładać, że użytkownik wprowadzi niepoprawne dane.

Dodatkowo należy się upewnić, że dane nie zmienią się ani nie uszkodzą. Dobrym sposobem zabezpieczenia danych jest ich szyfrowanie. Dzięki temu można mieć pewność, że później kiedy dane zostaną odszyfrowane będą miały dokładnie taką samą postać jak w momencie szyfrowania. Zalecanym sposobem szyfrowania jest wykorzystanie matematycznie mocnego algorytmu zatwierdzonego przez NIST (National Institute of Standards and Technology). Szyfrowanie zapewnia poufność oraz integralność danych.

 

Uwierzytelnianie

Uwierzytelnianie jest procesem pozwalającym określić, czy osoba lub rzecz jest tym, za kogo lub za co się podaje. Nic nie powinno się wydarzyć, zanim system nie upewni się, z kim ma do czynienia. Zanim cokolwiek udostępnimy, użytkownik powinien zadeklarować, kim jest. Dotyczy to wszystkich żądań przesyłanych Internetem (również tych, przesyłanych asynchronicznie). Jeśli nie uwierzytelniono użytkownika, nigdy nie należy tworzyć sesji, natomiast po poprawnym wykonaniu tej operacji, należy przeprowadzić jego autoryzację.

Uwierzytelnianie jest często wykonywane przy wykorzystaniu nazwy użytkownika i hasła. Znajomość tych danych, traktowane jest jako potwierdzenie autentyczności użytkownika. Każdy użytkownik początkowo rejestruje się (lub jest przez kogoś rejestrowany), podając jakieś przypisane mu lub samodzielnie określone hasło. Podczas następnych wizyt użytkownik musi znać to hasło. System często narzuca użytkownikom warunki konstrukcji hasła (np. określoną ilość znaków, dodatkowe cyfry lub znaki, itp.), zapewniając tym samym odpowiednią jego siłę. Podstawowym problemem z hasłami jest to, że ludzie je zapominają. Poza tym hasło może być w różny sposób przechwycone przez osoby nieuprawnione do jego znajomości. Dlatego też coraz więcej firm wykorzystujących Internet w swojej działalności, zaczyna wymagać stosowania dodatkowych mechanizmów uwierzytelniania. Rośnie potrzeba stosowania pewnych i wiarygodnych metod uwierzytelniania oraz zapewnienia niezaprzeczalności.

 

Autoryzacja i kontrola dostępu

Kolejnym krokiem jest przeprowadzenie autoryzacji użytkownika. Autoryzacja jest procesem przydzielania użytkownikom uprawnień do wykonywania pewnych czynności lub dostępu do określonych danych. Samo to, że ktoś zalogował się do aplikacji, nie oznacza wcale, że powinien mieć uprawnienia do wykorzystania wszystkich jej możliwości. Zawsze należy określać, jakie możliwości będzie miał uwierzytelniony użytkownik.

Jeśli ktoś prawidłowo zalogował się do aplikacji, może ona chcieć określić, do jakich zasobów dany użytkownik powinien mieć dostęp podczas sesji. A zatem pod pojęciem autoryzacji rozumie się zarówno wstępne przydzielenie uprawnień, jak i późniejsze, faktyczne sprawdzenie uprawnień przypisanych użytkownikowi, wykonywane w momencie, gdy żąda on dostępu do jakiegoś zasobu lub wykonania jakiejś operacji.

 

Niezaprzeczalność

Kiedy użytkownik zostanie już uwierzytelniony, należy śledzić wykonywane przez niego operacje i rejestrować te spośród nich, które mają kluczowe znaczenie dla bezpieczeństwa systemu. Dzięki temu, jeśli stanie się coś złego, będzie można uzyskać informację o tym, co się stało oraz kto może być za to odpowiedzialny. Rejestrowanie takich zdarzeń tworzy ich fizyczny ślad, który może pomóc w uzyskaniu niepodważalności.

Przykładowymi zdarzeniami związanymi z bezpieczeństwem systemu, są:

  • inicjalizacja lub utworzenie sesji;
  • udane oraz nieudane próby zalogowania się do systemu;
  • wylogowanie się użytkownika;
  • próby logowania, w których podano nieprawidłowe hasło;
  • operacje utworzenia, odczytu, aktualizacji i usunięcia konta użytkownika;
  • zmiany konfiguracji;
  • uruchomienie i zatrzymanie serwera;
  • nieprzewidziane zdarzenia systemowe;
  • próby wykonania operacji, do których użytkownik nie ma uprawnień;
  • zmiany hasła;
  • wykonanie czynności wymagającej większych uprawnień;

Podczas rejestrowania powyższych zdarzeń należy zapisywać takie dane jak: kto wykonał operację, skąd pochodziło żądanie, na jakich zasobach żądanie operowało, na jakiej stronie została wykonana operacja, data oraz godzina zajścia zdarzenia i inne informacje, które mogą później przydać się w prowadzeniu dochodzenia.

 

Podsumowanie

W powyższym artykule starałem się opisać z jakimi problemami powinien zmierzyć się każdy twórca systemu, który operuje na ważnych dla użytkownika danych i przez to jest narażony na różnego rodzaju ataki. Temat bezpieczeństwa jest bardzo rozległy, dlatego przedstawiony został jedynie zarys problemu. W dalszych artykułach poświęconych bezpieczeństwu będzie on rozwijany o kolejne zagadnienia, takie jak rodzaje ataków oraz sposoby zapobiegania im.

Zapraszam do komentowania.


Przeczytaj równierz