Bezpieczenstwo - pitaatip/Cyberwej GitHub Wiki

Bezpieczeństwo aplikacji

Jak będą chcieli to i tak nas zhackują. Nawet emacsem przez sendmail.

Zabezpieczenia środowiska uruchomieniowego

W przypadku środowiska uruchomieniowego(system operacyjny, Java, serwer aplikacji) należy przede wszystkim zadbać o regularne aktualizowanie oprogramowania, ze szczególnym uwzględnieniem wszystkich krytycznych poprawek bezpieczeństwa. Można rozważyć zastosowanie odpowiednich modułów podnoszących ogólny poziom bezpieczeństwa w systemie, np. SELinux. Zabezpieczenia wykorzystywanego przez nas kontenera serwletów, Apache Tomcat, zostały opisane tutaj

Zabezpieczenia bazy

Dostęp do bazy danych MySQL jest zabezpieczony hasłem. Jednak przechowywanie hasła w pliku konfiguracyjnym wykorzystywanym do połączenia z bazą, powoduje, że każdy kto ma dostęp do kodu źródłowego aplikacji ma również dostęp do bazy. Sugerowanym rozwiązaniem jest zastosowanie zewnętrznego modułu kontroli dostępu, wykorzystującego rozwiązania PAM, LDAP lub Kerberos. http://dev.mysql.com/doc/refman/5.5/en/pluggable-authentication.html

Zabezpieczenia aplikacji

Warstwą na której poziom bezpieczeństwa mamy największy wpływ jest tworzona przez nas aplikacja. Potencjalnym miejscem ataków typu Cross-site scripting (XSS), Cross-site request forgery(CSRF) i SQL injection są formularze i co za tym idzie komponenty przetwarzające wejście użytkownika przesłane w postaci zapytań protokołu HTTP.

  • Cross-site scripting - polega na wprowadzeniu na stronę fragmentu kodu, który wyświetlony przez innych użytkowników może spowodować wykonać w ich imieniu niepożądane akcje. JSF posiada domyślnie włączone podstawowe zabezpieczenie przeciwko XSS, polegające na zamianie specjalnych znaków HTML na encje(np. znak < jest zamieniany na <. Artykuły na temat bezpieczeństwa aplikacji napisanych w JSF, przestrzegają przed wypisywaniem wprowadzonych przez użytkownika wartości wewnątrz niektórych tagów lub wewnątrz atrybutów HTML. Zastosowanie walidacji poszczególnych pól, np. akceptacja tylko liter oraz cyfr, wprowadzenie maksymalnej długości wejścia, dodatkowo zwiększa poziom bezpieczeństwa.

  • Cross-site request forgery - metoda opiera się na przesyłaniu do web aplikacji spreparowanych żądań pochodzących od zalogowanych użytkowników, odwiedzających przygotowane do ataku strony internetowe. Przeciwdziałanie takim atakom może polegać np. na umieszczeniu na stronie z formularzem losowego tokenu, dołączaniu go do requestów klienta i ponownej weryfikacji po stronie serwera.

  • SQL injection - to wstrzykiwanie poprzez formularz kodu SQL, który ma na celu np. wyciągnięcie danych do których użytkownik nie ma uprawnień, bądź usunięcie danych. W tworzonej przez nas aplikacji, do persystencji danych wykorzystany jest framework Hibernate, który praktycznie zabezpiecza przed atakami SQL injection w przypadku niekorzystania z natywnych zapytań SQL, ale jest narażony na wstrzyknięcie kodu w języku HQL.

  • Autoryzacja użytkowników - w kolejnej fazie planujemy zintegrowanie logowania do aplikacji z systemem LDAP, tymczasowo autoryzacja użytkowników opiera się na weryfikacji obliczonego hashu wprowadzonego hasła z hashem przechowywanym w bazie danych

Obecnie nasza aplikacja nie oferuje możliwości przesyłania plików na serwer, jeżeli w przyszłości miałaby być wprowadzona np. funkcjonalność dodawania avatarów użytkowników, należałoby rozszerzyć rozważania związane z bezpieczeństwem również o ten aspekt.

Propozycje działań mających na celu zwiększenie poziomu bezpieczeństwa

W środowisku produkcyjnym proponujemy zastosowanie następujących narzędzi w celu zwiększenia poziomu bezpieczeństwa:

  • Użycie LDAP do autoryzacji użytkowników
  • Użycie PAM, LDAP bądź Kerberosa do autoryzacji dostępu do bazy danych
  • Wykorzystanie odpowiednio zabezpieczonego systemu operacyjnego i kontenera serwletów

W odniesieniu do implementacji aplikacji będzie konieczna:

  • walidacja wszystkich pól wprowadzanych przez użytkownika
  • użycie tokenu zabezpieczającego przed CSRF

Oprócz tego można rozważyć zastosowanie narzędzi testujących aplikację pod kątem podatności na ataki, np. skaner Nessus.