SCTP (4) SCTP – protokół połączeniowy ogólnego przeznaczenia warstwy transportowej. Posiada on wiele cech zarówno TCP jak i UDP. Wykorzystuje 4-way ha...
51 downloads
69 Views
261KB Size
SCTP (4) SCTP – protokół połączeniowy ogólnego przeznaczenia warstwy transportowej. Posiada on wiele cech zarówno TCP jak i UDP. Wykorzystuje 4-way handshake, wspiera transmisje unicast, dane przesyłane są w komunikatach Oferuj: - obsługa hostów z wieloma interfejsami (multihoming) - wsparcie dla komunikacji wielokanałowej w ramach jednego połączenia (asocjacji) - selektywne potwierdzenia transmitowanych danych - przesyłanie komunikatów - mechanizmy kontroli przepływu danych - zarządzanie przeciążeniami - wykrywanie MTU (maximum transmition unit – rozmiar największego datagramu, który można przekazać przez warstwę protokołu) - mechanizmy zabezpieczające przed DoS Atak SYN Flood – atak polegający na wysłaniu wielu pakietów typu SYN (rozpoczynających three-way handshake). Serwer musi odpowiedzieć na każdy z wysłanych pakietów co pozwala go przeciążyć. SYN Cookies – mechanizm zabezpieczający przed atakiem SYN Flood. Polega na odpowiednim wyliczaniu ISN (Initial Sequence Numbers) dla pakietów SYN+ACK. Algorytm wyliczania: - 5 bitów – t mod 32, gdzie t to 32-bitowy licznik zwiększający się co 64 sekundy - 3 bity – wielkość okna wybrana przez serwer - 24 bity – wyliczone przez serwer przy pomocy sekretnej funkcji na podstawie adresu ip klienta i serwera, numer portu oraz licznik t Mechanizm uaktywnia się o przepełnieniu tabeli stanów przez połączenia oczekujące na pakiet SYN od serwera. Gdy to nastąpi serwer zaczyna odpowiadać pakietami SYN+ACK z wyliczonym ISN. Po otrzymaniu w odpowiedzi pakietu ACK zostaje on porównany po wspomnianym ISN co pozwala utworzyć połączenie mimo przeciążenia tabeli. Multihoming – mechanizm wsparcia dla stacji sieciowych z wieloma interfejsami. Działanie mechanizmu polega na ustanawianiu asocjacji tak, że podczas tego procesu serwer i klient wymieniają się całą listą adresów IP, które będą mogły zostać wykorzystane do komunikacji. W takim przypadku mamy adres podstawowy, którym wysyłane są wszystkie dane. Jeżeli on zawiedzie wykorzystuje się kolejny z listy. Multistreaming – mechanizm wsparcia wielu strumieni w jednej asocjacji. Strumień to niezależny, jednokierunkowy kanał komunikacyjny. Numer strumienia, nadany przez aplikację, działa na tej samej zasadzie co numery strumieni wy/we. Budowa pakietu SCTP: COMMON HEAD – nagłówek wspólny dla wszystkich części pakietu w postaci: SRC PORT NR | DST PORT NR VERIFICATION TAG CHECKSUM CHUNK #1 …
- informacje w pakiecie w postaci: CHUNK TYPE | CHUNK FLAGS | CHUNK LENGTH CHUNK VALUE
CHUNK #N Chunk type – identyfikator typu, Chunk flags – zależne od typu, Chunk length – rozmiar jednostki w bajtach, Chunk value – właściwa informacja przesyłana w pakiecie
DATA CHUNK – pakiet chunk typu pierwszego, pozwala na przesłanie danych użytkownika TYPE = 0 | RESERVER | U | B | E | LENGTH TSN STREAM IDENTIFIER S | STREAM SEQUENCE NUMBER n PAYLOAD PROTOCOL IDENTIFIER USER DATA (seq n of stream S) U = 1 – odbiora ignoruje pakiet i przekazuje do wyższych warstw | B = 1 – początek wiadomości | E = 1 – koniec wiadomości Length – rozmiar DATA chunk TSN – pozwala na identyfikacje zduplikowanych i zgubionych pakietów Stream identifier – identyfikuje strumień Stream sequence number – numer sekwencyjny danych przepływających przez strumień 4-way handshake – w protokole SCTP służy do utworzenia asocjacji. Przebieg: 1. Klient wysyła pakiet z INIT chunk z ustalonym Verification Tag. Ustala także informacje o ilości danych i strumieni. 2. Serwer potwierdza otrzymanie INIT i wysyła INIT ACK. Oprócz parametrów INIT zawiera też State Cookie, w którego skład wchodzą informacje potrzebne do utworzenia asocjacji, MAC oraz czas utworzenia i lifetime cookie. Dane te są zapisywane także w TCB (Transmission Control Block) serwera, na podstawie którego obliczany jest MAC. 3. Klient odbiera INIT ACK i wysyła COOKIE ECHO, który zawiera dane z cookie od serwera. Mogą być w nim przesyłane dane. 4. Po otrzymaniu COOKIE ECHO serwer oblicza i porównuje MAC, jeżeli się zgadzają sprawdza lifetime cookie. Jeżeli wszystko się zgadza serwer tworzy asocjacje. Gniazda 1-do-1 – umożliwia utworzenie tylko jednej asocjacji. Ułatwiają przekształcanie aplikacji TCP w SCTP, bo korzystają z tych samych funkcji. Należy pamiętać o zmianie opcji setsockopt(). Gniazdo 1-do-wielu – pozwala utworzyć wiele asocjacji. Funkcje send, write są zastąpione przez sendto, sendmsg oraz sctp_sendmsg. Pozwalają na ustanowienie asocjacji bez użycia funkcji connect (czyli podczas wysyłania danych użytkownika).
NETFILTER (7) Filtry bezstanowe – badają nagłówki (ip, port, protokół) i na podstawie tego przepuszczają pakiety. Filtry stanowe – badają stan całego ruchu przechodzącego przez filter. Działają na poziomie wartwy sieciowej oraz sesji. Umieszczają w pakiecie adres gniazda zwrotnego, który jest zapamiętywany i na podstawie tego podejmowana jest decyzja o przepuszczeniu pakietu. - libnfnetlink – niskopoziomowa biblioteka służąca do komunikacji między user-space, a kernelem - libnetfilter_conntrack – user-space, umożliwia zarządzanie wpisami w tablicy połączeń - conntrack-tools – narzędzia administracyjne, bazują na libnetfilter_conntrack, pozwala na zarządzanie tablicą połączeń - libnetfiler_log – user-space, logowanie pakietów - ulogd – demon umożliwiający logowanie pakietów do pliku lub DB - libnetfilter_queue – user-space, odbieranie pakietów zakolejkowanych przez jądro oraz zarządzenie akcjami związanymi z nimi - iptables – program do zarządzania polityką filtrowania i przetwarzania pakietów. Pozwala rejestrować funkcje, które są odpowiedzialne za wykonywanie operacji na pakietach wędrujących przez ścieżkę forwardingu. Matches – kryteria wykonywania operacji, targets – operacje. - libiptc – wykorzystywana przez iptables oraz ip6tables do komunikacji z jądrem by określić strategie przetwarzania pakietów. Warstwa sieciowa maskuje gniazda surowe używane przez bibliotekę.
nfq_open – tworzy połączenie Netlink z podsystemem nfnetlink_queue nfq_close – zamyka połączenie nfq_bind_pf - powiązanie uchwytu połączenia z rodziną protokołów nfq_unbinf_pf – odwiązanie uchwytu od rodziny protokołów ID kolejki to 16bitowa liczba, numer kolejki określa się w iptables za pomocą –queue-num. nfq_create_queue – powiązanie gniazda z kolejką nfq_q_handle – struktura wskaźnikowa na kolejkę. Jej obiekt zawiera się w nfq_callback. nfq_destroy_queue – zwolnienie uchwytu kolejki nfq_set_mode – określenie trybu kopiowania z kolejki do user-space Pakiety są przechwytywane przy pomocy funkcji recv ponieważ Netfilter jest datagramowy. nfq_handle_packet – wrzuca się do niej pakiet, na którym wywołuje funkcję callback callback – analiza/modyfikacja pakietu nfq_set_verdict – wydaje werdykt odnośnie poprawności pakietu Przetwarzanie pakietów - nfq_get_msg_packet_hdr – zwraca meta-nagłówek - nfq_get_msg_packet_hw – zwraca adres warstwy łącza danych - nfq_get_indev – zwraca indeks interfejsu, przez który otrzymano pakiet - nfq_get_payload – pozwala uzyskać bufor zwierający pakiet libiptc – wchodzi w skład iptables. Wykorzystywana do zarządzania regułai filtrowania i przetwarzania pakietów iptc_init – wykonanie zrzutu wszystkich reguł dla podanej tablicy iptc_strerror – określenie błędu odpowiadającego podanej w errno wartości iptc_free – pozwala zwolnić uchwyt z iptc_init iptc_first_chain, iptc_next_chain – iterowanie przez tablicę reguł iptc_is_chain – sprawdza czy łańcuch istnieje w tablicy iptc_builtin – sprawdza czy łaćbuch jest wbudowany iptc_commit – wprowadzenie zmian iptc_create_chain – dodaje nowy łańcuch do tablicy iptc_delete_num_entry – usuwa z łańcucha regułę o danym numere iptc_set_policy – definiuje domyślną politykę łańcucha Fizyczna -> łącza danych -> sieciowa -> transportowa -> sesji ->prezentacji -> aplikacji
UPRAWNIENIA (8) Identyfikatory procesu: - PID – nadawany przez fork(), wywołanie execv() nie zmienia pidu, można go uzyskać getpid() - PPID – identyfikator rodzica, nie zmieniany przez execv(), można go uzyskać getppid() - Process Group ID – identyfikuje grupę. Grupa może otrzymywać sygnały z jądra dla wszystkich procesów wewnątrz niej. Liderem grupy jest proces, który ją utworzył. - Session ID – identyfikator sesji. Sesja składa się z grup procesów i służy do powiązania usera z terminalem kontrolującym. Grupy w sesji są dzielone na pierwszoplanowe (jedna) i drugoplanowe (wiele). Pierwszoplanowe blokują powłokę, drugoplanowe działają w tle. Proces potomny (sforkowany) dziedziczy id sesji. Sesje wiąż usera z terminalem. Zamknięcie terminala przez usera wysyła SIGQUIT do procesów pierwszoplanowych. Zakończenie połączenia wysyła do nich SIGHUP. CTRL+C wysyła SIGINT. Domyślnie zakończają one proces. - Real user ID, Real group ID – określają tożsamość usera, który odpalił program - Effective ID, Effective group ID – służą jądru do sprawdzenia uprawnień do uprzywilejowanych akcji.
Uruchomienie programu z SUID/SGID powoduje, że EID/EGID odpowiada właścicielowi pliku, a nie userowi, który go odpalił. - Saved set-user-ID, Saved set-group-ID – kopie EID/EGID, ponieważ mogą one być zmieniane w czasie działania aplikacji. - File system user ID, File system group ID – wykorzystywane do sprawdzania praw dostępu do pliku. Zmienia się wraz z EID/EGID. - Supplementary user ID – dodatkowe identyfikatory grup wykorzystywane do określania praw dostępu. Proces potomny utworzony przez fork() dziedziczy kopie identyfikatorów użytkowników i grup po rodzicu. Po wywołaniu execv(), proces zachowuje identyfikatory usera i grup, ale EID i saved ID mogą się zmienić jeżeli ustawiono SUID/SGID. setuid()/setgid() – zmienia identyfikator efektywny. Jeżeli setuid=0 to zmieniany jest też saved set ID żeby nie można było uzyskać ponownie pełnych uprawnień. seteuid()/setegid() – pozwala zmieniać eid/egid na rzeczywiste lub saved setresuid() – pozwala zmieniać real ID, effective ID i saved set. Demony – proces wykonywany w tle i uniezależniony od terminala kontrolującego. Do demonizacji procesów służy funkcja daemon() (biblio glibc). Aby pominąć jej użycie należy: - wywołać fork() - w procesie macierzystym wywołać exit(). Dzięki temu proces potomy będzie uniezależniony od innych i nie będzie właścicielem grupy (bo identyfikatory odziedziczył od rodzica) - w procesie potomnym wywołać setsid(). Utworzy ona nową sesję i grupę dla tego procesu. W tym momencie proces jest już pełnoprawnym demonem - (OPCJONALNIE) przekierować katalog procesu na „/” funkcją chdir() - (OPCJONALNIE) przekierować std.out i std.err na /dev/null Capabilities – mechanizm przywilejów wprowadzony po to by nie było konieczności nadawania wewnątrz aplikacji pełnych praw roota w momencie, gdy akcja ich nie potrzebuje. Przywileje są atrybutami wątków, a nie procesów. Do obsługi wykorzystuje się biblio libcap2. - przywileje efektywne – zbiór wykorzystywany do sprawdzania uprawnień wątku - dozwolone – zbiór przywilejów, które proces w ogóle może wykorzystywać - dziedziczne – zbiór przywilejów zachowanych po execv(). Wykorzystywane do utworzenia zbioru dozwolonych. Wątek potomny utworzony fork() dziedziczy zbiór przywilejów rodzica. Polecenie setcap pozwala przypisać przywileje do plików wykonywalnych. Przywileje dodane przez setcap są przechowywane w grupie file capabilities, która znajduje się w atrybucie security.capability. Wątek może zmodyfikować ten atrybut tylko jeśli posiada uprawnienie CAP_SETFCAP. Plik może posiadać przywileje dozwolone, dziedziczone i efektywne.