Parametry jądra i protokołów sieciowych
Napisał: Patryk Krawaczyński
12/06/2009 w Bezpieczeństwo Brak komentarzy. (artykuł nr 70, ilość słów: 1237)
J
ądro systemu Linux pozwala na wyłączanie oraz włączanie konkretnych usług sieciowych tuż po starcie systemu za pomocą przekazania odpowiednich wartości do pseudo-systemu plików /proc/sys. W ten sposób jesteśmy w stanie dokonać zmian w systemie bez wymogu rekompilacji jego jądra. Dokonane zmiany umożliwiają nam protekcję przed takimi atakami jak Man In the Middle, SYN Cookies, Ping Flood, Source Routing Scans czy IP Spoofing. Dają również możliwość uaktywnienia rozszerzonych funkcjonalności systemu pod postacią logowania różnych zdarzeń czy zachowania się względem zrzutu pamięci. Dane wartości możemy odczytać / ustawić bezpośrednio za pomocą systemu pliku /proc lub za pomocą użycia programu sysctl.
Obydwie metody posiadają wsparcie w systemie Slackware. W przypadku programu sysctl wymagane jest uaktywnienie opcji CONFIG_SYSCTL
w jądrze systemu (lecz nie powinno być z tym problemu ze względu na fakt, iż jest ona standardowo zaznaczona w jądrach serii 2.4 i 2.6). Poniżej postaram się przedstawić i opisać kilka kluczowych konfiguracji, które mogą wpłynąć na bezpieczeństwo naszego systemu.
W celu orientacji na temat ustawionych już wartości możemy wykorzystać program cat, lub wcześniej wspomniany sysctl:
cat /proc/sys/net/ipv4/ip_forward
W celu użycia programu sysctl należy nazwy poszczególnych katalogów rozdzielić kropkami (“.”) z pominięciem początkowej frazy /proc/sys:
sysctl net.ipv4.ip_forward
W celu aktywowania lub dezaktywowania danej funkcji w jądrze należy kolejno przekazać wartość “1” (aktywacja) lub “0” (dezaktywacja):
echo "1" > /proc/sys/net/ipv4/ip_forward
lub
sysctl net.ipv4.ip_forward = 1
Należy wspomnieć, że wszystkie ustawione wartości przepadają po restarcie maszyny. Dlatego dobrym rozwiązaniem jest dodanie wszystkich wpisów za pomocą programu echo np. do /etc/rc.d/rc.locl. Używając programy sysctl możemy stworzyć plik /etc/sysctl.conf i w nim umieścić wszystkie wpisy. W Slackware są one ładowane za pomocą wpisu:
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then /sbin/sysctl -e -p /etc/sysctl.conf fi
uruchamianego z poziomu skryptu /etc/rc.d/rc.S. Sprawdza on istnienie programu sysctl i równocześnie pliku /etc/sysctl.conf, który musi być możliwy do odczytu. Po spełnieniu wymienionych warunków, ładowane są wszystkie ustawienia z pliku konfiguracyjnego z pominięciem błędnych wpisów. Przejdźmy do ustawienia i opisu poszczególnych funkcji (przedstawione wpisy będą prezentowane w dwojakiej postaci dla pełnej kompatybilności, lecz należy wybrać tylko jeden sposób zapisu):
echo "0" > /proc/sys/net/ipv4/ip_forward --- net.ipv4.ip_forward = 0
Jeśli nasz system nie pełni rolę routera z pewnością możemy wyłączyć przekazywanie pakietów (ang. forwarding). Funkcja ta pozwala przekazywać pakiety pomiędzy dwoma i więcej sieciami (interfejsami) – tzw. multihoming. Opcja ta powinna być zawsze ustawiana jako pierwsza ze względu na fakt, iż ma ona wpływ na dalsze opcje. W Slackware istnieje osoby daemon powodujący uaktywnienie tej funkcji – /etc/rc.d/rc.ip_forward.
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all --- net.ipv4.icmp_echo_ignore_all = 1
Aktywujemy funkcję ignorowania żądań programu ping. Od tej pory jądro nie będzie odpowiadać na pakiety ICMP typu 8 (ang. echo request). Czyli mówiąc prościej nasz host nie będzie odpowiadał na “pingi” z innych hostów. Jeśli nie używamy programu ping do diagnostyki hostów w naszej sieci z pewnością możemy aktywować tą funkcję. W przeciwnym razie blokadę pingów możemy wykonać za pomocą iptables dopuszczając tylko wybrane hosty do możliwości otrzymania odpowiedzi – czyli pakietów ICMP typu 0 (ang. echo replay message). Pozwala to uniknąć ataku typu Ping Flood.
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts --- net.ipv4.icmp_echo_ignore_broadcasts = 1
Ten parametr jądra aktywuje ignorowanie żądań wysyłanych na adres rozgłoszeniowy (ang. broadcast). Spowoduje to możliwość uniknięcia ataków typu Smurf oraz podobnych ataków DoS, które bazują w tym wypadku na technice fałszowania zapytań ping (Echo Request), poprzez zamianę adresu źródła tych zapytań na adres atakowanego serwera. Tak spreparowane pakiety ping, wysyłane są na adres rozgłoszeniowy sieci zawierającej wiele komputerów. Pakiety zostają rozesłane do wszystkich aktywnych systemów w sieci, co powoduje przesłanie przez nie pakietów odpowiedzi – Echo Reply na sfałszowany wcześniej adres źródłowy atakowanej ofiary – zalewając ją odpowiedziami.
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; \ do echo "0" > $f; done --- net.ipv4.conf.all.accept_source_route = 0
Wyłączamy przekierowywanie IP. Przyjmowanie pakietów z routingiem źródłowym (ang. source route) stanowi ryzyko dokonania zmian w naszej tablicy routingu. Pakiety tego typu mogą zostać wykorzystane do zmylenia na temat źródła ich pochodzenia.
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; \ do echo "0" > $f; done --- net.ipv4.conf.all.accept_redirects = 0 for f in /proc/sys/net/ipv4/conf/*/send_redirects; \ do echo "0" > $f; done --- net.ipv4.conf.all.send_redirects = 0
Wyłączamy przekierowywanie pakietów ICMP, które także mogą być użyte do zmiany tablic routingu i tak jak w poprzednim przypadku uniemożliwiając tym samym wymuszenie nadawcy trasę pakietu. O ile pakiety te nie są za bardzo skutecznym sposobem by aktualizować tablicę routingu hostów w celu określenia najkrótszej drogi do celu – o tyle atakujący może wykorzystać je do przeprowadzenia ataku DoS na siec – poprzez podsyłanie sfabrykowanych pakietów tego typu.
for f in /proc/sys/net/ipv4/conf/*/secure_redirects; \ do echo 1 > $f; done --- net.ipv4.conf.all.secure_redirects = 1
Natomiast jeśli koniecznie potrzebujemy odbierać pakiety ICMP informujące o nowych trasach pakietów najlepiej akceptować tylko te pakiety dla bram zapisanych w liście standardowych bram, w ten sposób możemy pomóc w lepszej obronie przed atakiem Man in the middle.
echo "1" > /proc/sys/net/ipv4/tcp_syncookies --- net.ipv4.tcp_syncookies = 1
By móc skorzystać z tej funkcji należy w jądrze aktywować opcję CONFIG_SYN_COOKIES
. Opcja ta umożliwia włączenia ochrony przed atakiem typu SYN Flooding – poprzez zminimalizowanie przeciążenia serwera podczas ataku. Atak polega na wysłaniu bardzo dużej ilości pakietów SYN do atakowanego serwera. Serwer odpowiada pakietami SYN/ACK nie otrzymując dalszych inicjacji połączenia, tym samym przechowując stany połączeń w tablicy, która ma ograniczony rozmiar (znajduje się w pamięci RAM). Po wyczerpaniu zasobów w tablicy zostaje zablokowana możliwość nawiązywania nowych połączeń z serwerem. Gdy w atakowanym systemie wyczerpie się miejsce w tablicy połączeń półotwartych, zostaje uruchomiony wspomniany mechanizm SYN Cookies.
echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog echo "2" > /proc/sys/net/ipv4/tcp_synack_retries --- net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2
Wartość syn_backlog standardowo posiada wartość równą “1024”, a synack_retries “5”. Pierwsza z nich określa maksymalną ilość zapamiętanych żądań połączeń, które nadal nie zostały potwierdzone. Druga zmienna określa ile pakietów SYN,ACK system wyśle zanim uzna, że połączenie nie może zostać zrealizowane. Poprzez zwiększenie limitu oraz obniżenie ilości pakietów wartości te potrafią wpłynąć na optymalizację mechanizmu SYN Cookies. Należy jednak być ostrożnym przy ustawianiu w/w parametrów ze względu na fakt, iż pierwszy wpływa na zużycie pamięci RAM (domyślna wartość 1024 jest właściwa dla systemów z pamięcią powyżej 128MB, a 128 jest dobre dla komputerów z mniejszą ilością pamięci), a drugi może sprawić kłopoty z komunikacją za pomocą wolniejszych łączy.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; \ do echo "1" > $f; done --- net.ipv4.conf.all.rp_filter = 1
Włączamy ochronę, która potrafi skutecznie utrudnić podszywanie się (ang. IP Spoofing) pod postacią włączania filtrowania trasy powrotnej (ang. reverse path filtering). Ochrona ta polega na weryfikacji źródła pochodzenia pakietu. Jeśli pakiet dotrze do systemu przez inny interfejs niż ten, z którego wyszła prośba o jego otrzymanie – zostanie odrzucony. Jeśli korzystamy na naszym serwerze z routingu asymetrycznego opcję tę należy pozostawić nie aktywną.
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses --- net.ipv4.icmp_ignore_bogus_error_responses = 1
Włączamy ignorowanie błędów ICMP zgłaszanych przez komputery w sieci, źle reagujących na ramki.
for f in /proc/sys/net/ipv4/conf/*/log_martians; \ do echo "1" > $f; done --- net.ipv4.conf.all.log_martians = 1
Ustawienie tej wartości spowoduje odkładnie w dziennikach informacji o różnych typach pakietów, w tym tych które zostały odrzucone, sfałszowane, przekierowane czy z routingiem źródłowym.
echo "1" > /proc/sys/net/ipv4/tcp_rfc1337 --- net.ipv4.tcp_rfc1337 = 1
Stosujemy się do wytycznych dokumentu RFC 1337 (TIME-WAIT Assassination Hazards in TCP), który określa poprawki związane z niebezpieczeństwami ginięcia gniazd w stanie time-wait. Dzięki połączeniom otwartym i oczekującym na dalsze informacje można bardzo łatwo przeprowadzić atak DDoS. Aktywując wymienioną funkcję jądro systemu odrzuci wszystkie pakiety z ustawioną flagą RST dla gniazd sieciowych ustawionych w tryb time-wait.
echo "1" > /proc/sys/net/ipv4/eth0/proxy_arp echo "1" > /proc/sys/net/ipv4/eth1/proxy_arp --- net.ipv4.eth0.proxy_arp = 1 net.ipv4.eth1.proxy_arp = 1
Jeśli nasz serwer pełni rolę routera i chcemy udostępnić publiczne IP innemu routerowi możemy skorzystać z tej funkcji – czyli stworzyć pseudo-most. Router za pomocą proxy arp odpowiada w imieniu urządzania podając swój adres sprzętowy. Powoduje to połączenia dwóch rozdzielonych routerem sieci w jedną. Bardzo skutecznie można wykorzystać tą funkcję również do budowy DMZ.
Więcej informacji: Kształtowanie Ruchu i Zaawansowany Routing HOWTO