Zabezpieczanie aplikacji internetowych za pomocą firewalli

Transkrypt

Zabezpieczanie aplikacji internetowych za pomocą firewalli
VIII Seminarium PLOUG
Warszawa
Kwiecieñ 2003
Zabezpieczanie aplikacji internetowych
za pomoc¹ firewalli aplikacyjnych
Wojciech Dworakowski
[email protected]
SecuRing
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
17
Poprzedni wykład miał na celu uświadomienie słuchaczowi, że posiadanie aplikacji internetowych
wiąże się z wieloma zagrożeniami. Zapewnienie odpowiedniego poziomu bezpieczeństwa aplikacji
internetowych to duże wyzwanie dla administratorów. Podobnie jak w wypadku tradycyjnych aplikacji i serwisów sieciowych należy stosować dwojaką ochronę:
• Metody prewencyjne – a więc zapobiegające powstaniu zagrożenia. Tu mamy przede
wszystkim konstruowanie bezpiecznych architektur, stosowanie dobrych zasad programowania oraz ciągłe edukowanie projektantów i programistów w zakresie bezpieczeństwa.
• Metody proaktywne – reagujące na próby ataków. Narzucenie odpowiednich reguł programowania to nie wszystko. Należy jeszcze stosować mechanizmy zabezpieczające przed
błędami popełnionymi przez programistów i projektantów.
Jedną z metod proaktywnego zabezpieczania aplikacji internetowych jest zastosowanie firewalli
umiejących filtrować ruch charakterystyczny dla aplikacji internetowych. Temat ten był omawiany
w artykule „Obrona przed atakami SQL-injection z punktu widzenia administratora” (PLOUG’tki
nr 25). Wykład jest rozszerzeniem tego tematu i praktyczną prezentacją dostępnych rozwiązań.
Zabezpieczanie aplikacji internetowych – punkt widzenia administratora
Podczas poprzedniego wykładu starałem się pokazać że większość zagrożeń dla danych udostępnianych przez aplikacje internetowe wiąże się z błędami wewnątrz samej aplikacji. Co w takim
razie może zrobić administrator serwera aplikacji, bazy danych lub sieci? Z reguły ma on ograniczony wpływ na kod który jest publikowany na jego serwerze. Kod tworzą deweloperzy, a administrator ma zapewnić, że będzie on działał na serwerach. Im większa firma, tym bardziej te dwie
funkcje są od siebie oddalone i tym mniejszy jest wpływ administratora na bezpieczeństwo samego
kodu umieszczonego na serwerze aplikacji.
Częstokroć kod ten pochodzi ze źródeł zewnętrznych. Jest tworzony na zlecenie lub jest to po prostu fragment jakiegoś produktu integrującego serwer WWW i bazę danych. W takim wypadku
wpływ administratora na jakość i bezpieczeństwo kodu udostępnianego na serwerze WWW jest
jeszcze mniejsza.
Wymagania co do bezpieczeństwa jakie powinny spełniać aplikacje internetowe, powinna regulować polityka bezpieczeństwa, a dokładniej odpowiednie instrukcje bezpieczeństwa wynikające z
przyjętej polityki. Tak więc dbałość o bezpieczeństwo aplikacji powinna być poza obowiązkami
administratorów serwerów aplikacyjnych. Jednakże mało w której instytucji istnieją tak szczegółowe instrukcje. Poza tym oprócz środków prewencyjnych należy stosować środki aktywnie reagujące na zagrożenia.
Z pomocą przychodzą tutaj rozwiązania potrafiące analizować ruch aplikacji internetowych i aktywnie reagować na próby ataku.
Spróbuję podać kilka metod technicznych, które mogą podnieść bezpieczeństwo serwera aplikacyjnego, niezależnie od udostępnianego na nim kodu i rodzaju zastosowanej metody server-side
(JSP + servlety, PL/SQL, ASP, PHP, itd.). Z góry zaznaczam, że nie są to sposoby skuteczne
w 100%, każdy z nich posiada swoje ograniczenia. Jednak stosowanie tych dodatkowych metod
może znacznie podnieść poprzeczkę, którą musi pokonać intruz.
Dlaczego tradycyjny firewall nie wystarcza?
Przyjrzyjmy się architekturze serwerów aplikacyjnych, a przede wszystkim sposobowi w jaki
klienci korzystają z serwera aplikacji internetowych. Poniższy schemat pokazuje architekture typowego serwera aplikacyjnego J2EE. Takim serwerem aplikacji jest m.in. Oracle 9iAS.
Wojciech Dworakowski
18
(schemat pochodzi z dokumentacji Oracle)
HTTP/
HTTPS
Typem klienta, który nas interesuje jest przeglądarka WWW. Nie implementuje ona po swojej
stronie Javy w związku z tym podstawową metodą komunikacji z serwerem aplikacji jest przekazywanie stron HTML lub dokumentów XML przez protokół HTTP.
Jeżeli na drodze między przeglądarką a serwerem aplikacji będzie stał firewall, to dla niego ruch
aplikacji internetowej będzie zwykłym ruchem HTTP lub HTTPS. Tradycyjne firewalle analizują
tylko trzecią i czwartą warstwę protokołów sieciowych. W naszym wypadku są to protokoły IP i
TCP. W związku z tym mogą one filtrować ruch tylko na podstawie:
• źródłowego i docelowego adresu IP
• źródłowego i docelowego numeru portu TCP
• stanu sesji TCP (tylko firewalle statefull inspection)
Jak widać tradycyjne firewalle nie są w stanie reagować na ataki wysokopoziomowe na same aplikacje internetowe. Dla nich ruch HTTP będący atakiem jest nie do rozróżnienia od zwykłego, dozwolonego ruchu HTTP gdyż nie analizują one zawartości sesji HTTP.
Poniższy schemat pokazuje analizę ruchu do aplikacji internetowej przez tradycyjny firewall:
4. TCP
3. IP
2. Łącza
1. Fizyczna
9iAS
OC4J
Oracle HTTP
Server
5. Aplikacji
Web Cache
Firewall
DBMS
Metadata
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
19
Firewalle z częściową możliwością analizy ruchu
Niektóre z zaawansowanych firewalli mają rozszerzone możliwości o analizę najczęściej wykorzystywanych protokołów. Zwykle jest to realizowane przez specjalne moduły umiejące analizować
konkretny protokół. W takim wypadku, monitorowany protokół jest wykrywany przez firewall i
przekazywany do analizy do odpowiedniego modułu.
Schemat monitorowania ruchu do aplikacji internetowej przez tego typu firewall przedstawia poniższy rysunek:
Firewall
Filtr
HTTP
9iAS
5. Aplikacji
2. Łącza
Oracle HTTP
Server
3. IP
OC4J
Web Cache
4. TCP
DBMS
Metadata
1. Fizyczna
Firewall-1
Przykładem firewalla, który umie analizować niektóre protokoły wyższych warstw, jest Checkpoint
Firewall-1. Posiada on moduły aplikcyjne o nazwie Security Servers. Nas będzie interesował HTTP
Security Server. Pozwala on na filtrowanie odwołań HTTP według:
– metody dostępu (GET, POST, inne)
– zawartości URI
Niestety nie ma możliwości analizowania parametrów POST. Jest to spore ograniczenie gdyż
większość formularzy webowych przekazuje swoje parametry w postaci zleceń POST.
Niemniej jednak Firewall-1 daje możliwość ograniczenia ruchu tylko do niezbędnych metod (np.
tylko GET i POST) oraz możliwość narzucenia ograniczneń na zawartość URI.
Żeby dodać regułę blokującą ruch w zależności od zawartości URI, należy najpierw zdefiniować
opis danego ataku (dla Firewall-1 jest to zasób). Z poziomu Checkpoint Policy Editor wykonać
należy:
Manage -> Resources -> New -> URI
20
Wojciech Dworakowski
W pole „Name” należy wpisać nazwę definiowanego zasobu, czyli nazwę opisu danego ataku – np.
„SQL-injection”, zaś w polu „URI Match Specification Type” zaznaczyć „Wild Cards”.
Na zakładce „Match” mamy możliwość zdefiniowania szczegółów tworzonego zasobu. Tu należy
jak najdokładniej opisać atak SQL-injection który chcemy blokować:
Schemes: http
Methods: GET, POST
Query: *SELECT*FROM*
tu wpisujemy wyrażenie które chcemy blokować w ciągu URI
Dodatkowo – na zakładce „Action” w polu „Replacement Uri” można zdefiniować stronę na którą
będzie przekierowany intruz. Istnieje również możliwość importowania wyrażeń z pliku.
Regułę blokującą zdefiniowany przed chwilą zasób „SQL-injection”, dodajemy tak jak każdą inną
regułę filtrowania, z tym że w polu „Service”, po kliknięciu prawym klawiszem myszy wybieramy
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
21
„Add with resource”. Następnie wybieramy usługę „http” a w polu „Resource” zdefiniowany przez
nas zasób „SQL-injection”.
Poniższy rysunek przedstawia gotową przykładową regułkę blokującą niektóre ataki SQLinjection:
Niewątpliwą zaletą blokowania ataków na serwery aplikacyjne na firewallu jest możliwość ochronienia wielu serwerów WWW i aplikacji, za pomocą jednego urządzenia i jednego zestawu reguł.
Znacznie upraszcza to wdrożenie i zarządzanie przy rozbudowanych infrastrukturach, gdzie musimy chronić wiele serwerów WWW korzystających z baz danych.
Natomiast ogromną wadą takiego rozwiązania jest niemożność analizowania ruchu HTTPS (SSL).
Ruch ten jest zaszyfrowany, a co za tym idzie – niemożliwy do przeanalizowania przez firewall.
Warto zauważyć że fragmenty aplikacji WWW chronione protokołem SSL, z reguły są połączone z
bardzo istotnymi informacjami w bazie danych, tak więc tym bardziej należałoby je chronić.
Powyższy przykład pokazywał jak skonfigurować Firewall-1 do obrony przed niektórymi atakami
typu SQL-injection. Podobne reguły należałoby stworzyć dla pozostałych typów ataków. Warto
przy tym zauważyć że nie wszystkie typy ataków da się opisać za pomocą parametrów dostępnych
w Firewall-1.
Jak widać Firewall-1 nie jest instrumentem przystosowanym do chronienia aplikacji internetowych.
Jednakże jeśli już jest w naszej sieci, to warto skorzystać z jego możliwości w zakresie filtrowania
ruchu HTTP.
Wojciech Dworakowski
22
Firewalle aplikacyjne
Tradycyjne firewalle sieciowe nie są w stanie sprostać ochronie aplikacji internetowych. W związku z tym, ostatnio pojawiła się nowa klasa oprogramowania – firewalle aplikacyjne.
Firewall aplikacyjny to rodzaj filtru integrującego się z serwerem WWW. Działa on między częścią
sieciową serwera, a częścią aplikacyjną. W związku z tym dostaje do analizy ruch po wstępnej
obróbce przez serwer, tak jak go będą widziały dalsze warstwy. Serwer zajmuje się:
• rozszyfrowaniem transmisji SSL (jeśli jest używana),
• zdekodowaniem zlecenia (jeśli było stosowane np. kodowanie hexadecymalne URI),
• wstępną obróbką zlecenia.
Firewalle aplikacyjne działając jako moduł serwera WWW bardzo blisko się integrują z serwerem
aplikacji. Dzięki takiemu rozwiązaniu:
• nie muszą dbać o szyfrowanie SSL
• nie da się ich obejść, przez zakodowanie zlecenia
• mogą być to stosunkowo proste mechanizmy, gdyż sporą część pracy wykonuje za nie
serwer WWW.
Poniższy schemat przedstawia umiejscowienie firewalla aplikacyjnego w architekturze serwera
aplikacji.
9iAS
Oracle HTTP Server
OC4J
DBMS
Firewall aplikacyjny
Firewall
Metadata
Praktycznie każdy współczesny serwer WWW posiada możliwość rozszerzania swojej funkcjonalności przez dodawanie modułów:
• dla serwera Microsoft ISS są to filtry ISAPI
• dla Apache są to moduły Apache
• dla Netscape/iPlanet/SunOne są to moduły iAPI
Oracle HTTP Server to standardowy serwer Apache 1.3.x. Posiada on możliwość ładowania modułów dynamicznych, tworzonych w postaci bibliotek. Tak więc powinien dobrze integrować się z
rozwiązaniami stworzonymi dla Apache. Przyjrzymy się dwóm takim rozwiązaniom.
Niestety jak narazie nie stworzono firewalla aplikacyjnego dedykowanego dla Oracle Application
Server. Rozwiązania przygotowane dla Apache 1.3 powinny działać, jednakże nie są to konfiguracje w jaki kolwiek sposób wspierane przez Oracle. Firewalle aplikacyjne to stosunkowo nowa
dziedzina informatyki, w związku z tym ciężko jest znaleźć jakiekolwiek informacje o próbach
zintegrowania poniższych rozwiązań z serwerami aplikacji Oracle. Poniższe rozwiązania na pewno
zadziałają dla serwera Apache, w związku z tym powinny również poprawnie współpracować z
Oracle HTTP Server, jednak ich wdrożenie powinno zostać poprzedzone szczegółowymi testami.
NGSecureWeb
NGSecureWeb to oprogramowanie hiszpańskiej firmy NGSec. Potrafi integrować się z następującymi platformami serwera WWW:
• Apache 1.3 – Linux (x86), Solaris (Sparc i x86), BSD (x86), Windows, HP-UX
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
23
• Microsoft IIS
• iPlanet (Sun One) – Linux (x86), Solaris (Sparc), Windows, HP-UX
Do instalacji jest niezbędny program axps, który umieszcza w pliku konfiguracyjnym Apache
(httpd.conf) odwołanie do modułu filtrującego – mod_ngswa. Do oprogramowania dołączony jest
graficzny konfigurator. Można też administrować nim przez edycję plików konfiguracyjnych.
NGSecureWeb potrafi wykrywać i blokować kilka typów ataków na serwery aplikacyjne. Mamy
do dyspozycji następujące rodzaje zabezpieczeń:
• Long URL Protection
Pozwala na ograniczenie długości URL i w ten sposób może zabezpieczać przed atakami
buffer overflow w przekazywanych parametrach
• Traversal Directory Protection
Wykrywa próby ominięcia zabezpieczeń katalogów wirtualnych serwera i wyjścia poza
standardową ścieżkę.
• Long Headers Protection
Zabezpiecza przed atakami buffer overflow w polach nagłówków HTTP.
• Forbidden Words Protection
Pozwala na zdefiniowanie niedozwolonych słów kluczowych, w przetwarzanych zleceniach HTTP. Słowa te mogą występować w nagłówkach, argumentach GET i POST.
• Shellcode Protection
Wykrywa próby uruchomienia na serwerze zewnętrznego kodu. Jest to metoda wykorzystująca ataki buffer overflow i format strings.
• Non Printable Characters Protection
Pozwala na zdefiniowanie listy zabronionych znaków specjalnych.
• Method Protection
Pozwala na ograniczenie dostępnych metod (np. GET, POST, PUT, HEADER, inne)
Przykładowo – do obrony przed atakami SQL-injection możemy wykorzystać filtr „Forbidden
Words Protection”. Wykrywa on w zleceniu HTTP słowa kluczowe. Poniższy rysunek przedstawia
przykładową konfigurację odrzucającą wszystkie zlecenia zawierające w sobie słowo SELECT.
W odróżnieniu od przykładu z Firewall-1, oprogramowanie NGSecureWeb potrafi analizować
również argumenty przekazywane w metodzie POST. Dzięki temu można filtrować każdy sposób
komunikacji między przeglądarką a serwerem.
24
Wojciech Dworakowski
Po skonfigurowaniu słowa kluczowego SELECT, każda próba użycia go w dowolnej części zlecenia HTTP spowoduje zwrócenie przez serwer strony informującej o zablokowaniu ataku.
Rozwiązanie to nie jest jednak wolne od wad. Za największą uważam to, że do opisania ataku da
się używać tylko i wyłącznie pojedynczych słów, a nie np. wyrażeń regularnych. Ponadto intruz
zawsze jest informowany o tym, że atak został zablokowany przez NGSecureWeb. Strona odpowiedzi, pokazana na rysunku powyżej nie da się edytować.
Zarządzanie modułem serwera odbywa się przez edycje plików konfiguracyjnych lub przy wykorzystaniu lokalnej konsoli GUI. Nie da się zarządzać wieloma serwerami z jednej konsoli.
CodeSeeker
CodeSeeker to oprogramowanie jeszcze w wersji beta, ale o bardzo dużych możliwościach. Oprogramowanie to zostało stworzone przez firmę Butterfly Security, jednak w październiku 2002 zostało przekazane dla projektu OWASP. Od tej pory jest udostępniane za darmo, na zasadach Open
Source. OWASP (Open Web Application Security Project) to grupa specjalistów zajmujących się
różnymi aspektami bezpieczeństwa aplikacji. W projekt są zaangażowani specjaliści z takich firm
jak np. IBM, Deloitte&Touche czy Microsoft, eksperci z firm zajmujących się komercyjnymi systemami ochronnymi oraz eksperci zajmujący się na codzień testowaniem bezpieczeństwa aplikacji.
Według dokumentacji CodeSeeker integruje się z Apache, IIS oraz iPlanet. Jednak dostępna skompilowana wersja 1.0-Beta-1 zawiera wyłącznie moduł ISAPI do Microsoft IIS. Moduły Apache i
iPlanet są w wersji rozwojowej. Ich źródła można pobrać przez CVS i skompilować samodzielnie.
Na razie CodeSeeker należy uznać za oprogramowanie w fazie testów beta. Dużo do życzenia pozostawia zwłaszcza instalator. Poniżej kilka wskazówek, które pomogą pomyślnie przebrąć proces
instalacji.
• Konsola CodeSeeker-a jest napisana w Javie. W mojej instalacji uruchamiała się prawidłowo przy zainstalowanym JDK v. 1.4.1 (j2sdk1.4.1_02)
• Po instalacji automatycznie uruchomi się program do generacji kluczy SSL (licensehelper.exe). Należy zapamiętać odciski (fingerprint) klucza serwera. Okienko w którym jest
on wyświetlany nie udostępnia zaznaczenia i skopiowania, więc najlepszym wyjściem jest
zrobienie „screenshota” (Alt-Pint Screen)
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
•
•
25
Instalator omyłkowo nie przegrywa programu licensehelper.exe, chociaż jest on uruchamiany podczas instalacji i potem istnieje do niego skrót w menu „Start”. Należy otworzyć
plik programu instalacyjnego za pomocą ZIP-a i rozpakować go. Następnie przegrać z niego „ręcznie” program licensehelper.exe do podkatalogu „bin” w katalogu w którym zainstalowaliśmy CodeSeeker.
Przed połączeniem z monitorowanym systemem z konsoli, administrator jest uwierzytelniany za pomocą hasła. Wcześniej należy dodać użytkownika do CodeSeekera, za pomocą
programu „User Manager”. Każdorazowo, po dodaniu użytkownika należy skopiować plik
/Program Files/CodeSeeker/conf/SystemUsers.temp do pliku /Program Files/CodeSeeker/conf/SystemUsers oraz zrestartować serwer WWW.
Podczas samej eksploatacji oprogramowania natomiast nie zauważyłem znaczących błędów. Np.
nie zadziałało zapisywanie zdarzeń do Event Loga na Windows.
CodeSeeker składa się z dwóch części: konsoli zarządzającej napisanej w Javie, oraz modułu monitorującego serwer WWW. W przypadku Microsoft IIS jest to biblioteka DLL, którą instaluje się
jako filtr ISAPI. W przypadku Apache jest to moduł w formie biblioteki „so”, który nalezy dodać
do Apache tak jak w przypadku NGSecureWeb opisywanego powyżej.
Konsola zarządzająca umożliwia kontrolowanie wielu serwerów WWW. Jeden z serwerów (pierwszy dodany do konsoli) ma funkcję nadrzędną i na nim jest przechowywana polityka inspekcji ruchu. Serwery komunikują się z konsolą za pomocą transmisji szyfrowanej SSL-em. Dodanie serwera do konsoli wymaga podania jego adresu IP, oraz odcisku (fingerprint) klucza.
Podczas normalnej eksploatacji moduł serwera przechwytuje całość ruchu kierowanego do serwera, po wstępnej obróbce przez serwer i nadzoruje go zgodnie z przyjętą polityką.
Możliwość definiowania bardzo szczegółowej polityki uważam za największą zaletę tego oprogramowania.
26
Wojciech Dworakowski
Polityka nadzoru ruchu do serwera aplikacji składa się z dwóch grup sygnatur: jedna opisuje ogólne zagrożenia takie jak path traversal, SQL-injection, próby wykonania programów, itp, druga zaś
opisuje konkretne znane exploity na poszczególne typy serwerów. Dla każdego zagrożenia można
skonfigurować listę ścieżek URL serwera, do których będzie stosowana dana reguła. Znacznie to
ułatwia wdrożenie filtrowania przy dużych, skomplikowanych aplikacjach WWW.
Do wykrycia każdego zagrożenia można zdefiniować akcje oraz sposób informowania. Akcje to:
• Zablokowanie odwołania. Można przy tym zdefiniować kod błędu HTTP, a nawet informacje tekstową mu towarzyszącą.
• Przekierowanie odwołania do innego adresu URL.
Każdorazowo, oprogramowanie może informować, o próbie ataku. Mamy do dyspozycji następujące metody:
• Wysłanie e-maila.
• Zapisanie informacji przez Syslog (unixowy mechanizm logowania zdarzeń) – również na
maszynie zdalnej.
• Zapisanie informacji do Windows EventLog
• Zapisanie informacji do pliku tekstowego. Administrator ma możliwość definiowania zawartości i stopnia szczegółowości zapisywanej informacji.
Zabezpieczanie aplikacji internetowych za pomocą firewalli aplikacyjnych
27
Przy wdrażaniu monitoringu, zalecane jest uruchomienie najpierw CodeSeekera w trybie pasywnym, bez blokowania ruchu lecz tylko z zapisywaniem każdego wykrytego ataku do logów. Potem
należy wykonać w swojej aplikacji internetowej większość możliwych operacji i sprawdzić czy
któraś z nich nie spowodowała podniesienia alarmu. Dla tych części aplikacji należy zdefiniować
wyjątki i wtedy dopiero włączyć blokowanie ataków w CodeSeeker. Taki sposób wdrożenia zapewni stabilnoość działania aplikacji i zmniejszy ilość fałszywych alarmów.
Podsumowanie
Firewalle aplikacyjne to nowe, ciekawe narzędzie uzupełniające, podnoszące bezpieczeństwo. Są
one w stanie znacznie ograniczyć ryzyko, jednak na pewno nie stanowią panaceum na wszelkie
metody ataku na aplikacje internetowe. Problem z większością ataków na aplikacje, polega na tym,
że nie da się ich odróżnić od normalnej aktywności użytkowników. W związku z tym najlepszą
formą ochrony pozostanie zawsze stosowanie zasad najlepszych praktyk jeśli chodzi o bezpieczeństwo. Np. ograniczanie tej „normalnej aktywności” do niezbędnego minimum.

Podobne dokumenty