Skip to main content
Tech Blog banner - 1

Kluczowe praktyki bezpieczeństwa - czyli jak dbamy o aplikacje w Raiffeisen Tech

Wraz z rosnącą liczbą zagrożeń cyberataków oraz coraz bardziej zaawansowanymi atakami, zabezpieczenie aplikacji jest ważniejsze niż kiedykolwiek wcześniej. To powoduje, że organizacje, dostawcy oprogramowania, deweloperzy muszą priorytetowo traktować silne i sprawdzone środki bezpieczeństwa, aby chronić swoje aplikacje oraz ich użytkowników. A jakie kluczowe praktyki bezpieczeństwa wyznaczyliśmy w Raiffeisen Tech? Zapraszamy do zapoznania się z artykułem, w którym przedstawiamy, jak dbamy o nasze aplikacje. 

  • Michał Brandt

Case study - jak dbamy o aplikacje w Raiffeisen Tech

Oto kilka przykładów praktyk i mechanizmów jakie stosujemy, aby nasze aplikacje były możliwie jak najbardziej bezpieczne i odporne na ataki przestępców:

1. Silne mechanizmy uwierzytelnienia i autoryzacji

  • Uwierzytelnianie Wieloskładnikowe (MFA): Stosowanie MFA dodaje dodatkową warstwę zabezpieczeń, wymagając od użytkowników podania dwóch lub więcej form dodatkowej weryfikacji (np. hasło i kod przesłany na telefon, kod jednorazowy ze specjalnej aplikacji tzw. authenticator). To znacznie utrudnia atakującym uzyskanie nieautoryzowanego dostępu, bo po prostu nie mają oni dostępu do dodatkowego składnika MFA.
  • Bezpieczne polityki haseł: Stosujemy stale aktualizowane wymagania dotyczące haseł i regularnych aktualizacji.
    Mechanizmy weryfikacyjne potrafią sprawdzać siłę haseł, aby upewnić się, że użytkownicy tworzą silne, bezpieczne hasła zgodne z wymaganiami.

2. Kryptograficzne zabezpieczenie danych w tranzycie i w spoczynku

  • Szyfrowanie w tranzycie: We wszystkich warstwach komunikacyjnych systemu czy aplikacji, tych publicznych i tych wewnętrznych stosujemy wyłącznie bezpieczne protokoły takie jak HTTPS z TLS, SSH czy ECDSA, aby upewnić się, że dane przesyłane między klientem a serwerem czy pomiędzy innymi elementami systemu (np. połączenie do bazy danych) pozostają zaszyfrowane. Takie podejście pozwala zabezpieczyć transmitowane dane przed podsłuchaniem (przechwyceniem) przez atakujących.
  • Szyfrowanie w spoczynku: Ważne, wrażliwe dane, takie jak poświadczenia użytkowników, informacje o płatnościach czy dane osobowe, powinny być zaszyfrowane na każdym etapie ich przechowywania -  w bazach danych lub systemach plików, ale także tymczasowo na maszynach wirtualnych czy klastrach typu docker/kubernetes (szyfrowanie woluminów) oraz w usługach gromadzących dzienniki zdarzeń (np.
    Elastic- czy OpenSearch). To gwarantuje, że nawet jeśli dane zostaną wykradzione czy w inny sposób przedostaną się w niepowołane ręce, nie będą mogły być odczytane bez ich odszyfrowania.

3. Weryfikacja i sanityzacja danych wejściowych

  • Weryfikacja i walidacja danych: W naszych aplikacjach zawsze sprawdzamy dane wprowadzane przez użytkowników, aby upewnić się, że spełniają one wymagania - oczekiwany format, typ czy zawartość. Jest to
    niezwykle ważne również w przypadku danych finansowych czy osobowych takich jak adresy e-mail, numery telefonów, numery kont, kwoty a także przesyłane pliki przed ich przetworzeniem w innych komponentach systemu.
  • Sanityzacja: Sanityzowanie danych wejściowe jest niezwykle istotne, aby zredukować ryzyko ataków typu SQL Injection czy Cross-Site Scripting (XSS). Korzystamy z mechanizmu eskapowania - poprzez zamienianie specjalnych znaków na ich przetwarzalne odpowiedniki nie będące częścią składni jakiegokolwiek z języków programowania a także stosujemy zapytania przygotowanych w bazach danych zamiast umieszczać je bezpośrednio w kodzie aplikacji.

4. Zabezpieczenie API (Application Programming Interface) i punktów końcowych (Endpoints)

  • Ograniczanie częstotliwości zapytań: Zastosowanie ograniczenia liczby zapytań do punktów końcowych API, aby zapobiec atakom siłowym i nadużyciom to jedna z podstawowych technik zabezpieczeń, stosowana również w naszych systemach. Ograniczamy liczbę żądań, jakie użytkownik może wysyłać w określonym czasie, chroniąc się w ten sposób przed zautomatyzowanymi atakami – nie tylko na poziomie samej aplikacji, ale również bazy danych, sieci czy maszyn wirtualnych.
  • Tokeny uwierzytelniające: W ramach transmisji danych pomiędzy komponentami systemu używamy tylko bezpiecznych tokenów (takich jak OAuth lub JWT) do uwierzytelniania zapytań do API. W najbardziej wrażliwych miejscach tokeny takie są dodatkowo podpisane kryptograficznie, mają daty wygaśnięcia i są przechowywane w bezpieczny sposób.

5. Regularne testy bezpieczeństwa

  • Skanowanie podatności: Nasze zasoby, aplikacje i systemy są codziennie skanowane za pomocą automatycznych narzędzi, dzięki czemu jesteśmy w stanie bardzo szybko zidentyfikować potencjalne słabości. Takie podejście pomaga wykryć nie tylko podatności, ale również powszechne problemy, takie jak nieaktualne wersje oprogramowania, bibliotek czy modułów, a także błędy w konfiguracji.
  • Testy penetracyjne: Każdego roku badamy nasze systemy i aplikacje w ramach programu testów penetracyjnych, prowadzonych przez najlepszych ekspertów w kraju w tej dziedzinie. Symulacja rzeczywistych ataków pozwala zidentyfikować luki w zabezpieczeniach, których mogą nie wykryć narzędzia automatyczne. Oczywiście robimy to po to, aby naprawić potencjalne problemy z bezpieczeństwem, zanim zostaną one wykorzystane przez atakujących.

6. Bezpieczne wdrażanie i konfiguracja

  • Bezpieczne ustawienia domyślne: W ramach procesu tzw. hardeningu (utwardzania) sprawdzamy, czy domyślne ustawienia oprogramowania, baz danych, serwerów, usług i urządzeń są skonfigurowane w bezpieczny sposób. Na przykład, wyłączane są domyślne konta, zmieniane uprawnienia do zasobów, folderów czy plików zgodnie z zasadą minimalnej wiedzy koniecznej, a także konfiguracja firewalli umożliwia tylko dopuszczoną, autoryzowaną transmisję danych do naszych systemów.
  • Izolacja środowisk: W każdym przypadku zachowujemy separację pomiędzy różnymi środowiskami (deweloperskim, testowym i produkcyjnym), aby zapobiec przypadkowemu ujawnieniu danych i zmniejszyć ryzyko nieautoryzowanego dostępu. Separacja taka jest realizowana na wielu poziomach np. oddzielne konta chmurowe, wydzielone zasoby (np. różne instancje bazy danych) itp.

7. Aktualizacje oprogramowania

  • Regularne aktualizacje: Wszystkie aktywa teleinformatyczne są regularnie aktualizowane w ramach dojrzałego procesu - biblioteki, moduły, frameworki, systemy operacyjne a także firmware – tak, aby najświeższe poprawki bezpieczeństwa były zawsze wgrane do systemu czy biblioteki. Luki w przestarzałym oprogramowaniu są jednym z najpopularniejszych celów cyberataków.
  • Zarządzanie zależnościami: Korzystając z narzędzi do skanowania zależności (np. GitHub Dependabot), jesteśmy również w stanie zidentyfikować przestarzałe lub podatne zależności zewnętrzne (biblioteki czy moduły dostarczane przez firmy trzecie) w projekcie, a odpowiednio wczesne wykrycie tychże pozwala na usunięcie podatności zanim będzie ona mogła być wykorzystana w cyberatakach.

Podsumowanie

Wdrażając powyższe praktyki w procesie tworzenia aplikacji i utrzymania systemów IT, możemy tworzyć i utrzymywać bezpieczniejsze środowisko dla użytkowników i zmniejszyć ryzyko cyberataków i naruszeń bezpieczeństwa naszych danych. Bezpieczeństwo traktujemy jako ciągły proces, który ewoluuje razem z organizacją, nowymi zagrożeniami i technologiami. Budowanie bezpiecznej aplikacji to nie tylko ochrona danych, ale także dbanie o zaufanie użytkowników w świecie, gdzie bezpieczeństwo cyfrowe jest kluczowe.