komp.jpg (6268 bytes) CAOZMX6H.jpg (2112 bytes) klawisze.jpg (4441 bytes) sej1.jpg (3045 bytes)

Bezpieczeństwo w systemach komputerowych


Wstęp

Niniejsza prezentacja dotyczy bezpieczeństwa w systemach komputerowych i powstała na potrzeby przedmiotu Systemy Operacyjne wykładanego na III roku Informatyki Uniwersytetu Warszawskiego. Autorami prezentacji są Łukasz Pejas, Piotr Turski i Rafał Wawrzyńczyk.

Prezentacja problemu

Bezpieczeństwo w systemach komputerowych jest tematem tak bogatym, że nie sposób choćby skrótowo przedstawić wszystkich jego aspektów w ramach jednej prezentacji. Obejmuje ono bowiem takie dziedziny jak:

W związku z powyższym autorzy prezentacji zdecydowali się skoncentrować na kilku wybranych kwestiach. Plan prezentacji jest następujący:

 

komp.jpg (6268 bytes)

Bezpieczeństwo aplikacji - luki, metody włamań


Istnieją setki rodzajów zagrożeń prawidłowego funkcjonowania systemów komputerowych. Należą tu m.in.

i wiele, wiele innych. Poniżej przedstawimy skrótowe omówienie wybranych rodzajów zagrożeń, a ze szczególną uwaga potraktowane zostaną przepełnienie bufora i niebezpieczne konstrukcje SQL.

Wirusy - programy posiadające zdolność do samopowielania się bez wiedzy użytkownika, dzięki czemu mogą szybko rozprzestrzeniać się w zainfekowanym systemie jak i poza nim (np. za pośrednictwem sieci internetowej). Wirus może doczepić się do kodu programu powodując jego wydłużenie lub nadpisać istniejący kod. Wirus składa się z głowy (część przejmująca sterowanie wykonaniem programu i służąca do samoreplikacji) oraz  ogona (mającego charakter opcjonalny i zawierającego kod odpowiedzialny np. za wyświetlanie jakiegoś napisu, kasowanie plików, itp.). Przykładowymi klasyfikacjami wirusów są następujące podziały:

Robaki (worms) - programy, których celem jest rozprzestrzenianie się za pośrednictwem sieci internetowej (niekoniecznie ma na celu modyfikowanie plików w systemie). Robaki propagują się np. drogą rozsyłania swoich kopii do osób zapisanych w książce adresowej danej osoby. Robak przesyłany jest w załączniku, a plik go zawierający ma często podwójne rozszerzenie (np. girl.jpg.vbs). Rozszerzenie .vbs jest ukrywane domyślnie.

Konie trojańskie - fragmenty kodu ukryte w programie i mogące wykonywać w sposób utajony zadania niemile widziane przez użytkownika (np. usuwanie plików). Konie trojańskie nie posiadają zdolności do samopowielania, a zarazić się nimi można jedynie instalując na dysku program będący nosicielem.

Bomby logiczne - fragmenty kodu zazwyczaj "uśpionego", a uruchamianego w przypadku spełnienia określonego warunku (np. uruchomienie określonego programu, nastanie wyznaczonego dnia). Bomby są często wykorzystywane do szantażu komputerowego.

Ataki DoS (Denial of Service) i DDoS (Distributed Denial of Service) - celem ataków odmowy dostępu jest zawieszenie lub ograniczenie funkcjonalności atakowanego serwera. Istnieje kilka głównych odmian ataków DoS; jedną z najczęściej stosowanych jest "zasypanie" ofiary ogromną liczbą pakietów, co powoduje znaczne spowolnienie działania wybranej maszyny lub jej całkowite zawieszenie. Wersja rozproszona stosowana jest przeciwko dużym serwisom internetowym i w znaczniej mierze utrudnia identyfikację napastników.

 

Przepełnienie bufora (buffer overflow) - spopularyzowane zostało artykułem "Smashing The Stack For Fun And Profit" opublikowanym w czasopiśmie Phrack w listopadzie 1996 r. Jest jedną z najczęściej stosowanych metod włamań do systemów komputerowych, ponieważ niejednokrotnie umożliwia uruchomienie dowolnego kodu z prawami roota.  

Aby osiągnąć swój cel, osoba dokonująca włamania przy pomocy przepełnienia stosu musi spełnić dwa cele cząstkowe:

Pierwszy z wymienionych celów osiągnąć można dwoma sposobami: aplikując przygotowany kod jako wejście programu lub parametryzując kod już obecny w przestrzeni adresowej (np. ustawiając parametr "/bin/sh" i skacząc do kodu biblioteki libc). Cel drugi osiągany jest przez przepełnienie bufora i nadpisanie sąsiednich adresów żądaną sekwencją bajtów. Najczęściej nadpisywane są:

 

                                                               Rys. 1. Rekord aktywacji odkładany na stos.

Najbardziej powszechnym sposobem osiągnięcia wymienionych powyżej celów jest zaaplikowanie do programu spreparowanego słowa i nadpisanie rekordu aktywacji. Ujmując rzecz od strony praktycznej, fragment kodu uruchamiający shella zostaje skompilowany do postaci maszynowej i włączony do spreparowanego napisu, który przekracza rozmiar bufora i będzie argumentem funkcji. Po przekazaniu napisu do funkcji adres powrotny zostaje nadpisany wykonywalnym kodem lub wskaźnikiem do kodu uruchamiającego shell. Tak uruchomiony shell posiada uprawnienia programu, spod którego został uruchomiony (w szczególności są to uprawnienia roota).

Przykładem programu prowadzącego do przepełnienia stosu jest

 

void function(char *str)
{
    char buffer[16];
    strcpy(buffer,str);
}

void main()
{
    char large_string[256];
    int i;
    for( i = 0; i < 255; i++)
        large_string[i] = 'A';

    function(large_string);
}

 

Ilustrację graficzną przepełnienia bufora przedstawia rys. 2.

 

                                                         Rys. 2. Przepełnienie bufora.

 

Jak dotychczas brak w pełni skutecznego sposobu ochrony systemu przed atakami wykorzystującymi przepełnienie bufora. Do najczęściej wymienianych metod obrony należą:

 Niepoprawnie:

 void func(char *str)
{
    char buffer[256];
    strcpy(buffer, str);
    return;

Poprawnie:

 void func(char *str)
{
    char buffer[256];
    strncpy(buffer, str, sizeof(buffer) -1);
    buffer[sizeof(buffer) - 1] = 0;
    return;
}

Niepoprawnie:

void func(char *str)
{
    char buffer[256];
    buffer[0] = '\0';
    strcat(buffer, str);
    return;
}

Poprawnie:

void func(char *str1, *str2)
{
    char buffer[256];
    buffer[0] = '\0';
    strncpy(buffer, str1, sizeof(buffer) - 1);
    buffer[sizeof(buffer) - 1] = '\0';
    /* concatenate string, calculate amount of space we have left in buffer */
    strncat(buffer, str2, sizeof(buffer) - strlen(buffer) - 1);
    return;
} 

(na podstawie [8])

 

Wykaz funkcji stwarzających bezpośrednią okazję do przepełnienia bufora obejmuje: 

  • strcpy

  • strcat

  • sprintf

  • gets

  • scanf, sscanf, fscanf

  • memcpy

  • Sam StackGuard jest patchem gcc umieszczającym specjalne słowo (tzw. canary) na stosie tuż po adresie powrotnym. Nadpisanie adresu powrotu (a więc i nadpisanie canary) zostanie wykryta zanim program odwoła się do zmienionego adresu (rys. 3).

     

                                                                Rys. 3. StackGuard

     

    Canary może być słowem losowym (wybieranym z każdym uruchomieniem programu) albo zawierać terminatory, tj. symbole przerywające działanie funkcji kopiujących C: 0 (null), CR, LF, -1 (EOF). Daje to gwarancję, że osoba dokonująca próby przepełnienia bufora nie będzie w stanie przekazać canary w spreparowanym przez siebie słowie.

    Testy wykazują, że najbardziej efektywną kombinacją jest stosowanie StackGuard wraz z blokadą wykonywania kodu w segmencie stosu.

    Modyfikacją idei StackGuard jest PointGuard, umieszczający canary przy wszystkich wskaźnikach funkcji.

     

    SQL Injection - metoda ataku baz danych wykorzystująca luki w aplikacjach SQL i pozwalająca na ominięcie firewalla chroniącego bazę. Ogólnie rzecz biorąc, polega na podaniu aplikacji sieciowej takich parametrów, które przekażą do bazy "wrogie" zapytania SQL i zwrócą ich wyniki. Celem ataku może być kradzież danych lub uzyskanie dostępu do hostów organizacji za pośrednictwem serwera bazy danych. Aby atak mógł dojść do skutku, w aplikacji będącej jego przedmiotem musi być używany dynamiczny SQL.

    Lista najczęściej wykorzystywanych metod przeprowadzenia SQL Injection obejmuje:

    Załóżmy (przykład na podstawie [2]), że w bazie danych składowana jest procedura get_cust(surname in varchar2) podająca numer pracownika o nazwisku surname:

     

    create or replace procedure get_cust (lv_surname in varchar2)
    is

            type cv_typ is ref cursor;
            cv cv_typ;
            lv_phone        customers.customer_phone%type;
            lv_stmt         varchar2(32767):='select customer_phone '||
                                            'from customers '||
                                           'where customer_surname='''||
                                            lv_surname||'''';

    begin
            dbms_output.put_line('debug:'||lv_stmt);
            open cv for lv_stmt;
            loop
                    fetch cv into lv_phone;
                    exit when cv%notfound;
                    dbms_output.put_line('::'||lv_phone);
            end loop;
            close cv;
    end get_cust;
    /

     (na podstawie [2])

    Możliwymi sposobami dokonania ataku SQL Injection są w tej sytuacji np. 

    SQL> exec get_cust('x'' union select username from all_users where ''x''=''x');
    debug:select customer_phone from customers where customer_surname='x' union
    select username from all_users where 'x'='x'
    ::AURORA$JIS$UTILITY$
    ::AURORA$ORB$UNAUTHENTICATED
    ::CTXSYS
    ::DBSNMP
    ::MDSYS
    ::ORDPLUGINS
    ::ORDSYS
    ::OSE$HTTP$ADMIN
    ::OUTLN
    ::SYS
    ::SYSTEM
    ::TRACESVR

    SQL> exec get_cust('x'' or ''x''=''x');
    debug:select customer_phone from customers where customer_surname='x' or 'x'='x'
    ::999444888
    ::999555888
    ::999777888

    Obrona przed atakami SQL Injection obejmuje w głównej mierze

     

    CAOZMX6H.jpg (2112 bytes)

    Wybrane aspekty bezpieczeństwa w sieciach


    Sniffing
    Sniffing jest jedną z najbardziej rozpowszechnionych metod przechwytywania danych przesyłanych przez sieć. Polega na przejmowaniu pakietów sieciowych, które często są niezaszyfrowane (telnet, ftp, poczta elektroniczna), a mogą zawierać interesujące dla napastnika informacje (login, hasło, adresy IP, itp.). Sniffery wykorzystywane są nie tylko przez hackerów, ale i przez agencje wywiadowcze, instytucje zajmujące się pomiarem ruchu w sieci, administratorów sieci, itp. Zainstalowanie sniffera wymaga praw administratora sieci.

     

     

                                                                        Rys. 4. Sniffer

    Idea sniffingu opiera się na fakcie, że w sieci nie posiadającej switcha pakiety rozsyłane są do wszystkich maszyn. W zwykłych warunkach komputer ignoruje wiadomości nie przeznaczone dla niego, jednak zmiana ustawień karty sieciowej (na tzw. promiscuous mode) może sprawić, że komputer akceptuje wszystkie pakiety. Zamontowany sniffer może dodatkowo usuwać z przechwytywanych danych warstwy właściwe dla użytego protokołu i dostarczać same istotne informacje. Poniżej przedstawiono przykład przechwyconego pakietu sieciowego (żądanie klienta wysłane do serwera); po prawej stronie treść informacji zdekodowana do ASCII.

     

        21:06:30.786814 0:1:3:e5:46:6b 0:4:5a:d1:46:ad 0800 650: 192.168.1.3.32946 >
        66.38.151.10.80: P [tcp sum ok] 1:585(584) ack 336 win 64080 <nop,nop,timestamp 608776
        899338> (DF) (ttl 64, id 7468, len 636)
        0x0000 4500 027c 1d2c 4000 4006 8074 c0a8 0103        E..|.,@.@..t....
        0x0010 4226 970a 80b2 0050 54ac b070 78ef d6c3        B&.....PT..px...
        0x0020 8018 fa50 c663 0000 0101 080a 0009 4a08        ...P.c........J.
        0x0030 000d b90a 4745 5420 2f63 6f72 706f 7261        ....GET./corpora
        0x0040 7465 2f69 6d61 6765 732f 6275 696c 642f         te/images/build/
        0x0050 626c 6c74 5f72 645f 312e 6769 6620 4854         bllt_rd_1.gif.HT
        0x0060 5450 2f31 2e31 0d0a 486f 7374 3a20 7777        TP/1.1..Host:.ww
        0x0070 772e 7365 6375 7269 7479 666f 6375 732e         w.securityfocus.
        0x0080 636f 6d0d 0a55 7365 722d 4167 656e 743a         com..User-Agent:
        0x0090 204d 6f7a 696c 6c61 2f35 2e30 2028 5831         .Mozilla/5.0.(X1
        0x00a0 313b 2055 3b20 4c69 6e75 7820 6936 3836         1;.U;.Linux.i686

    (na podstawie [3])

    Metody obrony przed sniffingiem to

     

      21:09:04.599289 opensource-01.ee.ethz.ch.https > 192.168.1.3.32933: P [tcp sum ok]
    7011:7135(124) ack 793 win 10052 (DF) (ttl 237,       id 65192, len 164)
    0x0000 4500 00a4 fea8 4000 ed06 43e2 8184 0799        E.....@...C.....
    0x0010 c0a8 0103 01bb 80a5 be10 d77f 19a2 0520        ................
    0x0020 5018 2744 8303 0000 4d3a a587 805e e2bc        P.'D....M:...^..
    0x0030 9a2a 8ff3 fe95 46d4 930e b2bc 74f0 a484        *....F.....t...
    0x0040 fcae 33ad 6d1f 0198 6020 aee5 0c26 908e         ..3.m...`....&..
    0x0050 a1b5 17b4 84b7 44bc 1b0b 434e bbae a483        ......D...CN....
    0x0060 1e23 38d3 520f 687e c5e3 b62e 5225 aa2f         .#8.R.h~....R%./
    0x0070 f747 1a71 669c 8fd1 55bd 511c 4988 b78a        .G.qf...U.Q.I...
    0x0080 a08d 554e a3fe bb7d 36ca e66b fb8b 0392        ..UN...}6..k....
    0x0090 a3f3 4cef 7b04 af5a 7a94 cb4c a1e6 e7fa        ..L.{..Zz..L....
    0x00a0 9610 a5ee                                      ....

    (na podstawie [3])

     

    SSL - secure sockets layer
    SSL - uniwersalny standard bezpiecznych połączeń szyfrowanych klient - serwer (opracowany przez Netscape). SSL jest protokołem ogólnego przeznaczenia. W założeniu stanowi uzupełnienie protokołów już istniejących, działających poniżej warstwy aplikacji (czyli HTTP, FTP, SMTP, POP3, Telnet, etc.), a powyżej warstwy sieci i transportu (czyli TCP/IP). Zadaniem SSL jest stworzenie wirtualnego, odpornego na próby podsłuchiwania kanału transmisji dla informacji przesyłanych przez aplikacje (serwery sieciowe). zadania: autentyfikacja:
    SSL jest protokołem scentralizowanym, wykorzystuje instytucje certyfikujące (Certyfing Authorities - CA) i technologię kluczy publicznych i prywatnych. Największe firmy certyfikujące płacą producentom przeglądarek, takich jak Netscape Navigator czy Internet Explorer, za umieszczanie ich certyfikatów nadrzędnych w kolejnych wersjach programów. Dzięki temu użytkownicy tych przeglądarek mogą w bezpieczny sposób weryfikować certyfikaty serwerów podpisane przez te firmy.

    autentyfikacja serwera: autentyfikacja klienta: Jak to działa?
    Najważniejszą częścią protokołu SSL jest SSL Handshake Protocol, służący ustanowieniu szyfrowanego połączenia klient-serwer. "Handshake" przebiega według następującego schematu: Kryptografia w SSL
    SSL jest protokołem otwartym i rozszerzalnym, nie ma w nim nawiązania do jednego konkretnego algorytmu szyfrującego. Protokół umożliwia stronom połączenia przedstawienie propozycji obsługiwanych algorytmów szyfrujących i wybranie wspólnego, najbardziej odpowiedniego dla obu.

    Ogólnie mówiąc, SSL wykorzystuje dwa podstawowe rodzaje szyfrów - szyfry asymetryczne (z kluczem prywatnym i publicznym) oraz symetryczne (z jednym kluczem szyfrujaco - deszyfrującym). Algorytmy z kluczem publicznym są znacznie wolniejsze od szyfrów symetrycznych, dlatego nie nadają się do wydajnego kodowania danych przesyłanych w dużych strumieniach. Z drugiej strony zastosowanie tylko i wyłącznie szyfru symetrycznego wymagałoby wcześniejszej wymiany klucza za pomocą jakiegoś innego kanału. Dzięki połączeniu dwóch rodzin algorytmów oba problemy są rozwiązywane w sposób efektywny.

    SSL 2.0 i SSL 3.0 pozwalają administratorom na wybór algorytmów, których będzie używał dany serwer. Administrator, chcąc zapewnić bezpieczeństwo swojego serwisu, może wyłączyć komunikację z użyciem słabszych algorytmów kodowania. Z drugiej strony, jeśli chce udostępnić dany serwer do użytku większej liczbie klientów, może pozwolić na użycie szerszej gamy algorytmów, a podczas komunikacji klient i serwer ustalą najsilniejszy algorytm jaki obie strony potrafią obsłużyć.

    Ze względu na ograniczenia prawne w Stanach, amerykańskie przeglądarki eksportowane poza USA obsługują jedynie kodowanie z kluczem publiczny do 512 bitów (1024 bity w USA) i kluczem sesji do 40 bitów (128 bitów w USA)


    klawisze.jpg (4441 bytes)

    Mechanizmy obronne na granicy sieci



    IDS / IPS (intrusion detection / prevention system)
    IDS
    IDS to system wykrywania prób ataku. Działa on na zasadzie sondy wpiętej w monitorowany segment sieci. Sonda ta powinna otrzymywać cały ruch sieciowy (jego "kopię") przeznaczony dla monitorowanego systemu. IDS umie wykrywać w monitorowanym ruchu objawy charakterystyczne dla prób ataku. W wielkim uproszczeniu działa on podobnie do systemu antywirusowego. Porównuje analizowany ruch z bazą sygnatur ataków, która jest integralną częscią IDS. Aktualność tej bazy decyduje o skuteczności IDS. Współczesne produkty IDS pozwalają na zdalne aktualizacje bazy sygantur ataków. Drugim ważnym aspektem wpływającym na skuteczność IDS jest dostrojenie systemu do charakterystyki monitorowanego ruchu. Źle dostrojony IDS będzie generował dużą ilość fałszywych alarmów i informacji o niewielkim stopniu ważności. W powodzi informacji może zginąć wiadomość o faktycznym ataku. Po wykryciu potencjalnego ataku, standardowy IDS może zarchiwizować podejrzany ruch sieciowy i zawiadomić administratora. Jak wynika z powyższego opisu, IDS jest urządzeniem pasywnym. Umie wykryć atak, ale podjęcie akcji należy już do administratora. Jeśli administrator nie będzie w stanie podjąć kroków natychmiastowo, to atakujący może mieć wystarczająco dużo czasu żeby dokonać ataku i zatrzeć po sobie ślady. W związku z powyższym współczesne IDS są coraz częściej wyposażane w możliwości reakcji na atak. Typową opcją jest wyposażanie IDS w moduł integrujący go z zewnętrznym firewallem. W razie wykrycia próby ataku, IDS jest w stanie zdalnie zrekonfigurować firewalla tak żeby blokował on ruch z adresu podejrzanego o atak.

    IPS
    Obecnie coraz częściej mówi się o IPS. Są to systemy IDS rozbudowane o możliwości aktywnej reakcji na wykryte zdarzenia. Pierwszym ruchem zmierzającym do rozszerzenia możliwości reakcji standardowego systemu IDS było pojawienie się technologii przerywania połączeń. W skrócie, współczesne IDS-y mogą w przypadku wykrycia podejrzanego połączenia TCP przerwać to połączenie przez pod-szycie się pod stronę atakującą i wysłanie pakietu kończącego połączenie. Tak więc atakowany serwer zakończy połączenie i atak nie będzie mógł dojść do skutku.

    IDS-inline
    Kolejnym krokiem jest IDS-inline. O ile tradycyjny IDS ma jedną kartę sieciową, która jest sondą wpinaną w monitorowaną sieć, to IDS-inline posiada dwie karty - zewnętrzną i wewnętrzną. Cały monitorowany ruch sieciowy przechodzi przez urządzenie. Przypomina to budowę firewalla, jednak w środku działa silnik IDS, który wykrywa ataki i umie je blokować. W sumie urządzenie pełni podobne funkcje jak firewall jednakże działa w inny sposób. Firewalle to technologia restryktywna. Blokują one cały ruch z wyjątkiem ruchu dozwolonego. Istotą działania IDS jest wykrywanie prób ataku, w związku z tym IDS-inline chociaż jest umieszczony w tym samym miejscu co firewall, to działa w ten sposób, że przepuszcza cały ruch z wyjątkiem tego co uzna za próbę ataku. W przypadku IDS-inline klasyfikacja aktywności sieciowej jest o wiele bardziej za-awansowana niż w przypadku firewalli. IDS stosuje do tego wiele technologii. Ogólnie mówi się że IDS-y działają na podstawie dopasowywania sygnatur ataków. W rzeczywistości współczesne IDS-y stosują wiele różnych technik detekcji prób ataku. Np. normalizatory i interpretery poszczególnych protokołów, sygnatury opisowe w miejsce konkretnych wzorców, metody heurystyczne oraz sztuczną inteligencję.

    Główne zadania
    Dwa podstawowe typy systemów wykrywania włamań:
    Stosowane rozwiązania
                   Serwer www + system Host IDS
    /
    /
    /
    Wezeł(router+firewall)--- Serwer SQL + system Host IDS
    \
    \
    \
    Serwer poczty + system Host IDS
                   Serwer www
    /
    /
    /
    Wezeł(router+firewall+network IDS)--- Serwer SQL
    \
    \
    \
    Serwer poczty
    Metody detekcji

    Firewall (zapora, ściana ogniowa)
    Powszechnie terminem firewall określa się wszystko co filtruje pakiety, począwszy od dedykowanych komputerów aż po odpowiednie oprogramowanie. Główną ideą jest uczynienie zapory jedyną bramą łączącą lokalne zasoby ze światem zewnętrznym.

                                                    Rys. 5. Firewall


    Główne zadania:
    1. Badanie i filtracja pakietów
    Zapory sieciowe mogą przeprowadzać analizy nadchodzących pakietów różnych protokołów. W oparciu o taką analizę, zapora sieciowa może podjąć różne działania, zatem możemy zaprogramować firewall do przeprowadzania warunkowego przetwarzania pakietów. Reguły akceptacji lub odrzucenia przechodzącego pakietu możemy tworzyć opierając się głównie na następujących danych: Metody ustalania reguł: Istnieją dwie zasadnicze strategie definiowania sposobu działania firewalla: 2. Aplikacja pośrednicząca - proxy
    Serwer Proxy to pośrednik pomiędzy programem klienta, a serwerem znajdującym się w Internecie. Program klienta nawiązuje połączenie z Proxy zamiast bezpośrednio z serwerem. Serwer Proxy odbiera zapytanie od klienta i decyduje czy zapytanie ma zostać przepuszczone czy też należy je odrzucić. Jeżeli zapytanie jest dozwolone to wówczas komunikuje się z rzeczywistym serwerem i przekazuje otrzymane od klienta zapytanie, a do klienta przekazuje otrzymaną odpowiedź. Na tym poziomie oprócz uprawnień maszyn istnieje także możliwość sprawdzania uprawnień konkretnych protokołów, usług i aplikacji.

    Wyróżniamy następujące typy serwerów Proxy: 3. Diagnostyka antywirusowa przesyłanych plików
    Jeżeli firewall "rozumie" dany protokół (np. FTP) jest w stanie go zdekodować i dokonać pewnej analizy przepływających danych (np. diagnostyka antywirusowa).

    4. Konwersja protokółów
    Sieć lokalna nie musi pracować na tym samym protokole co sieć zewnętrzna. Jeśli firewall zna oba te protokoły może dokonywać tłumaczenia przepływających pakietów na bieżąco.

    5. Ochrona przesyłanych informacji (tworzenie wirtualnych sieci prywatnych VPN)
    Często zachodzi potrzeba bezpiecznego połączenia kilku sieci lokalnych lecz odległych geograficznie. Jedyną możliwości jest wówczas wykorzystanie internetu. Firewalle umożliwiają stworzenie bezpiecznego (szyfrowanego) tunelu między tymi sieciami (tunelowanie), który następnie będzie wykorzystywany przez wszystkie inne aplikacje (łącznie z tymi które nie oferują żadnych zabezpieczeń przesyłanych danych). Jest to przezroczyste dla użytkowników - widzą oni całą sieć jako jedną sieć lokalną.

    6. Translacja adresów (Network Address Translation - NAT)
    Ukrywanie wewnętrznych hostów i struktury sieci - cała siec wewnętrzną jest z zewnątrz widziana jako jeden komputer o adresie zapory. Poszczególne porty mapowane są na konkretne porty konkretnych hostów.

    7. Monitorowanie i rejestrowanie zdarzeń, generowanie natychmiastowych alarmów
    Firewall może monitorować ruch pomiędzy sieciami, prowadzić dzienniki zdarzeń, zapisywać adresy źródłowe, docelowe, porty oraz inne informacje zbierane z przepływających pakietów. W razie wykrycia niedozwolonej działalności możliwe jest powiadomienie administratora lub automatyczne podjęcie innych natychmiastowych działań.

    Typy firewalli Ze względu na warstwową architekturę stosu protokołów TCP/IP wyróżnia się trzy główne typy firewalli: aplikacyjne, połączeniowe i filtrujące. Filtry pakietowe są zwykle bardzo szybkie, jednak ich wadą jest to, że podane kryteria selekcji mogą okazać się niewystarczające dla niektórych usług internetowych.

    Dwie idee projektowania firewalli
    Wady i niedogodności:

     

    sej1.jpg (3045 bytes)

    Mechanizmy obronne zintegrowane z systemem operacyjnym




    SELinux
    SELinux projektem w ramach którego wzbogacono system GNU/Linux o mechanizmy obowiązkowej kontroli dostępu. W jądrze umieszczono nowe komponenty, które zostały tworzone dla polepszenia bezpieczeństwa systemu. W ramach projektu dostosowano również kod wielu programów systemowych tak, aby były one w stanie korzystać z dobrodziejstw architektury SELinux. Opracowano definicje uprawnień poszczególnych programów, tak aby z jednej strony mogły one wypełniać swoje zadania, a z drugiej - na wypadek błednego działania -- nie mogły spowodować dużych szkód w bezpieczeństwie systemu i jego danych.

    Każdy proces i obiekt (plik, gniazdo, itd.) w systemie otzrymuje zestaw atrybutów bezpieczeństwa tworzący tzw. kontekst bezpieczeństwa. Kontekst ten zawiera pełne dane na temat uprawnień danego obiektu. W momencie, gdy potrzebna jest kontrola uprawnień (np. gdy proces stara się otworzyć plik) funkcji kontrolującej uprawnienia przekazywane są dwa zestawy atrybutów bezpieczeństwa - w tym wypadku procesu i pliku (sprawdzone będzie czy proces może otwierać pliki oraz czy dany plik możne być otworzony przez proces). Na tej podstawie podejmowana jest decyzja o zezwoleniu na wykonanie operacji lub jej odrzucenie.

    Oprócz operacji kontorli dostępu drugim istatnym zadaniem jest inicjowanie praw (kontekstu bezpieczeństwa) nowo tworzonego obiektu. W tradycyjnym systemie UNIX np. przy tworzeniu pliku brany jest pod uwagę identyfikator i grupa użytkowników, prawa dostępu do katalogu nadrzędnego itd. Używając SELinux początkowy zestaw parametrów nowego obiektu może być znacznie szerszy.

    Należy też zwrócić uwagę, że dodatkowa informacja o kontekście bezpieczeństwa musi być gdzieś przechowywana. W przypadku pewnych danych dynamicznych, jak proces, gniazda TCP, czy pamięć dzielona - mogą być one zawsze przechowywane w strukturach jądra systemu. Jednak np. kontekst bezpieczeństwa plików czy katalogów musi być przechowywany w sposób trwały - jako rozszerzone atrybuty danego obiektu na dysku. Wymaga to współpracy ze strony systemu plików.

    Faktem jest - i nikt tego nie ukrywa - że projekt SELinux jest projektem badawczym, który innym pozostawia kwestie końcowych implementacji. Jednak mimo swojego mocno naukowego charakteru - zdobywa on sobie coraz większe uznanie i popularność w praktycznych zastosowaniach. Każdy z nas przy odrobinie starań może już dziś zabezpieczyć lepiej swój komputer przed niepowołanym dostępem z zewnątrz z powodu błedów oprogramowania. Jednak na na prawdę szerokie użycie SELinuksa przyjdzie nam jeszcze chwilę poczekać.

    RBAC (Role Based Access Control)
    W modelu zwanym TE (ang. Type Enforcement) każdy proces w systemie otrzymuje atrybut zwany domeną, a każdy obiekt - otrzymuje atrybut zwany typem. Wszystkie procesy będące w tej samej domenie są traktowane jednakowo (mają jednakowe uprawnienia), jak również wszystkie obiekty o danym typie są traktowane na równi. Dla każdej pary domeny i typu możemy określić, jakie działania mogą być podejmowane. Domena może być powiązana z kilkoma punktami wejścia - programami,które mogą być wykonywane przez użytkowników spoza domeny, a także wybranymi programami pomocniczymi i/lub bibliotekami, które są używane w ramach domeny. Pozwala to np. oddzielić programy zajmujżce się pocztą od innych części systemu.

    Tradycyjny model RBAC (ang. Role-Based Access Control) spotykany np. w systemach UNIX pozwala użytkownikom spełniać określoną role i dostarcza jednego zestawu uprawnień dla tej roli. W systemie SELinux użytkownik może posiadać nie jedną rolę, ale zestaw ról, a uprawnienia każdej z nich mogą być definiowane zestawem domen (patrz wcześniejszy akapit). Można powiedzieć, że w modelu tym użytkownik może się przemieszczać pomiędzy różnymi domenami uprawnień - zgodnie z nadanymi mu uprawnieniami przemieszczania.

    ACL (Access Control List)
    Tradycyjne prawa dostępu (odczyt, zapis, wykonanie) pokazują podstawę mechanizmu sterowania dostępem do różnych plików w oparciu o dziewięć bitów plus dwa bity na każdy plik. Zaletą tego rozwiązania jest absolutna prostota.

    Niestety, jeżeli administrator systemu będzie chciał ustawić wszystkie możliwe uprawnienia dostępu do pliku n użytkownikom, będzie potrzebował 2n różnych grup. Jest to oczywiście strajnie niepraktyczne, zatem nowsze systemy operacyjne wykorzystują pojęcie grupy rozszerzonej - listy kontroli dostępu - ACL. ACL umożliwia bardzo szczegółową kontrolę uprawnień w porównaniu z tradycyjnym modelem uprawnień.

    Przy użyciu list kontroli dostępu system operacyjny dołącza do pliku dodatkową listę uprawnień dla określonych użytkowników i grup. Umożliwia to przypisanie uprawnień odczytu lub zapisu dla pojedynczego pliku dwóm lub trzem użytkownikom, a nie tylko całej grupie.

    ASLR (Address Space Layout Randomizatoin)
    Poprawka sprawiająca, że ładowany dynamicznie kod, pojawia się pod losowym (a więc nie znanym włąmywaczowi) adresem. Praktycznie uniemożliwia to ingerencję w taki kod, dodatkową zaletą jest to, że funkcja ta nie ma wpływu na wydajność systemu.

    Ochrona pamięci, PaX.
    Podjęto wiele prób mających na celu stworzenie poprawki jądra lepiej zabezpieczającej pamięć. Projekt PaX należe do najczęściej używanych. Do momentu wykorzystania PaX w poprawce gr-security, nie był on zbyt znany i rozpowszechniony. Gr-security jest bardzo popularna i wiele osób z niej korzysta.

    Mówiąc ogólnie, istnieją trzy grupy ataków, pod kątem których tworzone są poprawki wzmacniające ochronę pamięci: Wprowadzenie i wykonanie dowolnego kodu oznacza, że można: Jeżeli zatem można zastąpić kod oryginalny, intruz może wprowadzić swój kod do działającego procesu. Tak więc, zamiast wykonywać określone zadania, program będzie robił to, czego oczekuje od niego intruz.

    Dwie pierwsze techniki wymadają wyłącznie dostępu zapisu i możliwości wykonywania w pamięci. PaX radzi sobie z tymi technikami na swój własny sposób. Trzecia technika różni się w tym względzie, że wymaga także dostępu do plików. Przy pomocy list kontroli dostępu (ACL) i/lub innych mechanizmów kontroli dostępu (np. RSBAC), PaX gwarantuje kompleksową ochronę przed wszelkimi odmianami ataków klasy pierwszej (wprowadzenie i wykonywanie dowolnego kodu).

    SSP (Stack Smashing Protector)
    Przełącznik ochrony stosu (SSP) to poprawka dla kompilatora gcc zabazpieczająca system przed grupą ataków zwanych pod nazwą błędów przepełnienia stosu.

    SSP wykorzystuje dwa mechanizmy: "Mina-pułapka" często w żargonie określana jest mianem kanarka (w kopalniach kanarki wykrywały kiedyś obecność śmiercionośnego tlenku węgla, który zabijał kanarki zanim zabił górników). Kanarkiem jest w naszym przypadku losowa liczba umieszczana na stosie. Atak przepełnienia stosu tę liczbę, która jest następnie wykrywana prze SSP przed wykonaniem kodu wykorzystującego ten błąd. Jeżeli SSP wykryje zatąpienie losowej liczb inną liczbą, dokonuje zapisu komunikatu w dzienniku systemu i przerywa pracę programu.

    Systemy ze zintegrowanym bezpieczeństwem

     


    Bibliografia

    [1] http://downloads.securityfocus.com/library/discex00.pdf [buffer-overflow]
    [2] http://www.securityfocus.com/infocus/1644 [SQL Injection]
    [3] http://www.securityfocus.com/infocus/1549 [sniffing]
    [4] http://www.republika.pl/b_s_k/bsk/index2.htm [bezpieczeństwo w systemach komputerowych]
    [5] http://arch.ipsec.pl/ref/agh-5/ [bezpieczeństwo systemach komputerowych na przykładzie Linuxa]
    [6] http://arch.ipsec.pl/ref/agh-3/ [administracja systemów komputerowych - bezpieczeństwo]
    [7] http://www.leon.w-wa.pl/texts/security.php [bezpieczeństwo w Linuxie]
    [8] http://www.securityfocus.com/popups/forums/secprog/secure-programming.shtml [bezpieczne programowanie]
    [9] http://marcin.owsiany.pl/sec/buffer_overflow.txt ["Smashing The Stack For Fun And Profit" - lokalna kopia]
    [10] http://marcin.owsiany.pl/security.pl.html [strona z linkami do stron poświęconych bezpieczeństwu]
    [11] http://www.nsa.gov/selinux/ [SecurityEnchanced Linux]
    [12] http://www.adamantix.org/[Adamantix]
    [13] http://www.gentoo.org/proj/en/hardened/ [Hardened Gentoo]
    [14] http://www.openbsd.org/ [OpenBSD]
    [15] http://www.grsecurity.net/ [Grsecurity/PaX]
    [16] http://www.rsbac.org/[Rule Set Based Access Control]
    [17] http://www.kernelthread.com/publications/security/index.html [A Taste of Computer Security]
    [18] http://www.hacking.pl