Laboratorium 11 i 12: firewall iptables, vpn

Systemy programowych zapór sieciowych

Zapora sieciowa ma za zadanie filtrować ruch przychodzący i wychodzący z danego urządzenia sieciowego (na przykład komputera). Dzięki filtrowaniu ruchu możemy zapewniać różnego rodzaju zasady bezpieczeństwa związane z danym urządzeniem sieciowym. Obsługa sieci w Linuksie jest obecnie wbudowana w jądro. Jednym z jej elementów jest netfilter, zestaw modułów do filtrowania pakietów.

Netfilter posiada narzędzia dostępne zewnętrznie, służące do określenia reguł przesyłania pakietów (to nie tylko filtrowania, moga one
być zmienione podczas przechodzenia przez zaporę). Najpopularniejsze to iptables (poprzednio używano ipchains,
ale dokumenty opisujące je należy traktować jako ciekawostkę historyczną). Iptables oparte jest o pojęcie reguły -- przepisu mówiącego,
co należy zrobić z pakietem spełniającym określone warunki. Na przykład reguła

iptables -A FORWARD -i eth0 -p tcp --sport 80 -m string --string '|7F|ELF' -j DROP

zablokuje ładowanie z sieci programów w formacie ELF.

Podstawowa funkcjonalność zapory polega na filtrowaniu pakietów, które przepuszcza tylko te pakiety, które odpowiadają wyznaczonym przez nas zasadom bezpieczeństwa. Pakiety, które nie są przepuszczane mogą być porzucane po cichu lub też odrzucane z komunikatem do nadawcy. W zaporze sieciowej możemy filtrować zarówno ruch przychodzący, jak i wychodzący. Reguły filtrowania mogą być dosyć skomplikowane, w tym mogą uwzględniać stan protokołu, dla którego wykonywane jest filtrowanie.

Kolejną ważną funkcjonalnością zapory jest możliwość wykonywania translacji adresów. Istnieją dwa główne rodzaje translacji adresów:

  • SNAT pozwala komputerom w sieci wewnętrznej na dostęp do różnego rodzaju serwerów z Internetu,
  • DNAT pozwala komputerom z sieci zewnętrznej (Internetu) na dostęp do różnego rodzaju serwerów umieszczonych w sieci wewnętrznej.

Uwaga: By korzystać z translacji adresów, zwykle trzeba zezwolić na przekazywanie pakietów ip przez jądro:

echo 1 > /proc/sys/net/ipv4/ip_forward

Jeszcze inną ważną funkcjonalnością jest możliwość modyfikowania różnych fragmentów przechodzących pakietów (w istocie translacja adresów jest też przykładem tego rodzaju funkcjonalności). Dzięki temu możemy pakiety tak modyfikować, że poruszają się po sieci w bardziej regularny lub łatwiej sterowalny sposób.

Często w praktyce administracyjnej przydaje się także możliwość rejestrowania różnego rodzaju sytuacji sieciowych. Zapory pozwalają na śledzenie i rejestrowanie wielu sytuacji. Przydaje się to do optymalizowania ruchu w sieci oraz wykrywania usterek w jej konfiguracji.

Dalsze informacje do przeczytania przed zajęciami:

Ćwiczenia - zapory sieciowe

  1. Ogranicz za pomocą iptables maksymalną wielkość pakietu ICMP-echo do 1kB.
  2. Ogranicz do 3 na minutę liczbę pakietów ICMP-echo.
  3. Ogranicz żądania http do 2kB wielkości i do 3 na minutę.
  4. Każ systemowi logować pakiety http większe niż 2kB i częstsze niż 3 na minutę, ale ich nie usuwać.
  5. Skonfiguruj zmienianie wartości pola TTL dla każdego pakietu na wartość 56 i sprawdź to, wykorzystując sniffer (tcpdump lub wiresharka).
  6. Spraw, żeby były usuwane pakiety większe niż 3 kB, zwracając komunikat błędu ICMP-net-unreachable.
  7. Pozmieniaj wartość pola MSS - sprawdzić wykorzystując sniffer.

Tworzenie sieci VPN

Wymagania dotyczące poufności, tajemnic produkcyjnych firm oraz konieczność umożliwiania pracownikom pracy zdalnej, w tym z domu, powoduje, że konieczne jest wprowadzanie metod udostępniania sieci wewnętrznej firmy przez szyfrowane kanały. Zwykle praca bezpośrednio za pomocą protokołu SSH jest niewystarczająca, dlatego sięga się po bardziej specjalizowane rozwiązania, takie jak VPN, które pozwalają na przekazywanie szyfrowanym kanałem całego ruchu sieciowego (bez konieczności ustanawiania odrębnych tuneli dla różnych aplikacji oraz bez ograniczenia się do protokołu TCP).

Wśród rozwiązań VPN dostępne są dwa podejścia:

  • tunelowanie ruchu VPN w protokole SSL,
  • przekazywanie ruchu VPN za pomocą protokołu IPsec.

Zasadnicza różnice między tymi dwoma podejściami:

  • tunelowanie w protokole SSL jest prostsze do zapewnienia,
  • tunelowanie w protokole SSL ma lepiej przetestowaną infrastrukturę (znacznie więcej użytkowników stosuje SSL),
  • tunelowanie w protokole SSL pozwala na korzystanie z powszechniej znanych mechanizmów,
  • tunelowanie w protokole IPsec można wykorzystywać przy uboższej infrastrukturze stosu sieciowego komputera.

Do tworzenia sieci VPN na bazie protokołu SSL służy OpenVPN.
Do tworzenia sieci VPN na bazie IPsec służy Openswan.

Dalsze informacje do przeczytania przed zajęciami:

Ćwiczenia VPN

Celem ćwiczeń jest budowanie poprawnej konfiguracji VPN krok po kroku.

Załóżmy, że komputer serwera VPN to vpn-server (adres ip ip-server), a klienta to vpn-client (adres ip ip-client).

Będziemy stawiać tunel VPN o adresach 10.0.0.1 (serwer) / 10.0.0.2 (klient)

1 instalacja pakietów openvpn

Na obu komputerach:

apt-get install openvpn

2 konfiguracja openvpn bez autoryzacji i szyfrowania

vpn-server# openvpn --ifconfig 10.0.0.1 10.0.0.2 --dev tun
vpn-client# openvpn --ifconfig 10.0.0.2 10.0.0.1 --dev tun --remote 192.168.1.10

Sprawdź, czy serwer nasłuchuje na porcie 1194 (:openvpn):

vpn-server# netstat -l | grep openvpn

Sprawdź, czy jest połączenie po vpn między komputerami:

vpn-client# ping 10.0.0.1
vpn-server# ping 10.0.0.2

3 konfiguracja openvpn ze wspólnym kluczem

Stwórz klucz:

vpn-server# openvpn --genkey --secret vpn-shared-key

Przegraj klucz do komputera klienta:

vpn-server# scp vpn-shared-key root@vpn-client:

Włącz vpn:

vpn-server# openvpn --ifconfig 10.0.0.1 10.0.0.2 --dev tun --secret vpn-shared-key 0
vpn-client# openvpn --ifconfig 10.0.0.2 10.0.0.1 --dev tun --remote ip-server --secret vpn-shared-key 1

Upewnij się, że tunel działa. Sprawdź, czy klient może korzystać z tunelu gdy nie ma klucza.

4 konfiguracja openvpn z certyfikatami

Do wygenerowania certyfikatów wykorzystaj skrypty z /usr/share/easy-rsa

Ustaw właściciela certyfikatu (zmienne w pliku vars) na PL/Mazowieckie/Warszawa/mimuw-bsk-lab

Następnie wygeneruj certyfikaty dla centrum autoryzacji, klienta i serwera przez:

vpn-server# . vars
vpn-server# ./clean-all
vpn-server# ./build-ca
vpn-server# ./build-dh
vpn-server# ./build-key-server vpn-server
vpn-server# ./build-key vpn-client

Przekopiuj certyfikaty ca.cert, vpn-client.crt i klucz vpn-client.key na vpn-client.

vpn-server# openvpn --dev tun --tls--server --ifconfig 10.0.0.1 10.0.0.2 --ca ca.crt --cert vpn-server.crt --key vpn-server.key --dh dh1024.pem
vpn-client# openvpn --dev tun --tls-client --ifconfig 10.0.0.2 10.0.0.1 --ca ca.crt --cert vpn-client.crt --key vpn-client.key --remote [ip-vpn-server]

ZałącznikWielkość
Bsi_11_lab.pdf353.49 KB
Bsi_12_lab.pdf171.69 KB

Zaliczenie 2009

W celu wykonania tego zadania należy się dobrać w zespoły dwuosobowe.

Należy skonfigurować sieć VPN między dwoma komputerami z wykorzystaniem mechanizmu współdzielonego klucza. Następnie zaś skonfigurować zaporę na komputerze klienta VPN, tak aby wychodził z niego wyłącznie ruch VPN.

Należy zapisać wszystkie polecenia i opcje konfiguracji w pliku tekstowym, będzie on częścią rozwiązania. Sprawdzający zapewne będzie wymagał także prezentacji rozwiązania.

Zaliczenie 2010

W celu wykonania tego zadania należy się dobrać w zespoły dwuosobowe.

Należy skonfigurować sieć VPN między dwoma komputerami z wykorzystaniem certyfikatów. Następnie zaś skonfigurować zaporę na komputerze klienta VPN, tak aby wychodził z niego wyłącznie ruch VPN, a na serwerze tak, żeby wszystkie połączenia przez VPN były logowane.

Należy zapisać wszystkie polecenia i opcje konfiguracji w pliku tekstowym, będzie on częścią rozwiązania. Sprawdzający zapewne będzie wymagał także prezentacji rozwiązania.

Zaliczenie 2011

Zadanie zaliczeniowe wykonaj w parach i używając 2 komputerów. Jeden z komputerów skonfiguruj jako serwer VPN; drugi jako klient VPN. Tunel może wykorzystać te same adresy IP co w ćwiczeniach (10.0.0.1 i 10.0.0.2).

konfiguracja openvpn z certyfikatami

Do wygenerowania certyfikatów wykorzystaj skrypty z /usr/share/doc/openvpn/examples/easy-rsa/2.0

Ustaw właściciela certyfikatu (zmienne w pliku vars) na PL/Mazowieckie/Warszawa/mimuw-bsk-lab

Następnie wygeneruj certyfikaty dla centrum autoryzacji, klienta i serwera przez:

vpn-server# . vars
vpn-server# ./clean-all
vpn-server# ./build-ca
vpn-server# ./build-dh
vpn-server# ./build-key-server vpn-server
vpn-server# ./build-key vpn-client

Przekopiuj odpowiednie certyfikaty z keys/ do katalogów /etc/openvpn na vpn-server i vpn-client. (uwaga: to które pliki gdzie skopiować to już część zadania)

Napisz plik konfiguracyjny dla serwera i klienta; plik umieść w /etc/openvpn.
Skonfiguruj openvpn tak, by korzystało z certyfikatów do wzajemnej autoryzacji klienta i serwera.
Dodatkowo, uwzględnij następujące opcje

  • włącz kompresję
  • używaj TCP i portu 20500 na serwerze
  • włącz klienta i serwera w trybie demona
  • automatycznie utrzymuj połączenie przy życiu
  • zapisuj logi do /var/log/openvpn.log

Skonfiguruj openvpn tak, by można było go uruchomić na kliencie i na serwerze przez standardowy skrypt startowy ( /etc/init.d/openvpn start )

konfiguracja firewall'a dla vpn

  1. na komputerze klienta zezwól tylko na ruch przez VPN
  2. na komputerze serwera loguj wszystkie pakiety przychodzące przez VPN z prefiksem "VPN:"
  3. na komputerze serwera odrzucaj wszystkie pakiety ICMP-echo większe niż 1000 bajtów

konfiguracja serwera VPN jako bramki NAT

Skonfiguruj maszyny serwera i klienta tak, aby cały ruch sieciowy klienta przechodził przez łącze VPN.

Zaliczenie 2012

Zadanie zaliczeniowe wykonaj w parach i używając 2 komputerów. Należy skonfigurować sieć VPN między dwoma komputerami (klient-serwer) z wykorzystaniem certyfikatów oraz ustalić odpowiednie reguły zapory sieciowej. Pliki konfiguracyjne dla klienta i serwera napisz uwzględniając następujące opcje:

  • komunikacja odbywać ma się za pośrednictwem protokołu TCP
  • włącz kompresję LZO
  • ruch sieciowy z komputera klienta powinien odbywać się wyłącznie po VPN
  • komputer serwera skonfiguruj jako bramkę NAT dla klienta
  • komunikaty icmp-echo-request od klienta do serwera odrzucaj bez żadnego komunikatu, natomiast komunikaty icmp-echo od klienta "w świat" odrzucaj z komunikatem icmp-net-prohibited oraz loguj z prefiksem "ICMP rejected: "
  • odrzucaj wszystkie komunikaty od klienta do maszyny solab15 z komunikatem icmp-host-prohibited

Skonfiguruj openvpn tak, by można było go uruchomić na kliencie i na serwerze przez standardowy skrypt startowy (/etc/init.d/openvpn start). Logi openvpn powinny być zapisywane do pliku /var/log/openvpn.log

Zaliczenie 2013

Zadanie zaliczeniowe wykonaj w parach używając dwóch komputerów. Skonfiguruj sieć VPN między dwoma komputerami (apache i bramka) z wykorzystaniem certyfikatów oraz ustal odpowiednie reguły zapory sieciowej. Pliki konfiguracyjne dla bramki i serwera napisz uwzględniając następujące opcje:

  • openvpn można uruchomić na obu komputerach przez standardowy skrypt startowy (/etc/init.d/openvpn start).
  • Logi openvpn powinny być zapisywane do pliku /var/log/openvpn.log
  • komunikacja odbywać ma się za pośrednictwem protokołu TCP
  • włącz kompresję LZO
  • tunel VPN powinien używać adresów 10.x.0.1 i 10.x.0.2 gdzie x jest numerem komputera apache (np. dla solab15 x=15)
  • tylko komputery o nazwach (CN) apache i bramka mogą korzystać ze skonfigurowanego tunelu

Następnie skonfiguruj routing w następujący sposób:

  • komputer bramki skonfiguruj jako bramkę NAT dla serwera
  • ruch sieciowy z komputera apache powinien odbywać się wyłącznie po VPN
  • na komputerze apache uruchom serwer www działający na porcie 8080
  • przekieruj wszystkie odwołania do portu 80 bramki do portu 8080 serwera (używając tunelu do przesyłania pakietów) (uwaga: włącz przekierowanie pakietów nie tylko dla całego systemu, ale również dla interfejsu tun0)

Skonfiguruj firewall na bramce w następujący sposób:

  • odrzucaj wszystkie pakiety od apache do hosta solab01
  • odrzucaj wszystkie próby połączeń z eth0 przez TCP do portów inne niż 22, 80 i 1194; zapisuj informację do logów z prefixem "tcp rejected: "

Zaliczenie 2014

1. VPN (praca w parach)

Bazując na uzyskanej wiedzy o konfiguracji VPN, skonfiguruj serwer OpenVPN oraz
klienta, tak aby było możliwe połączenie sieciowe przez uzyskany tunel.

Przedstaw zalety oraz wady własnego rozwiązania i skonfigurowanych
parametrów połączenia.

2. Firewall (indywidualnie)

Za pomocą iptables skonfiguruj zaporę chroniącą lokalną stację roboczą/serwer
tak aby:

Zezwalać na dowolne połączenia wychodzące.
Zezwalać na połączenia przychodzące tylko pod warunkiem, że sami je inicjujemy.
Zezwalać na przychodzące połączenia inicjujące tylko na porty 443, 80 i 22
(na serwerze utrzymujemy serwery ssh oraz http, więc klienci muszą mieć dostęp).
Wpuszczać żądania echa ICMP.
Ograniczyć liczbę połączeń inicjujących przychodzących do portu 22 do 3 na minutę
z jednego źródłowego adresu IP.
Zadbać o interfejs loopback.
Przygotować regułę/reguły firewalla umożliwiające uruchomienie podstawowego serwera DNS.
Blokować wszystkie inne połączenia przychodzące.

Należy sprawdzić szczelność firewalla przedstawiając proponowane metody
testowania i ich wyniki.

Zaliczenie 2015

1. VPN (praca w parach)

Bazując na uzyskanej wiedzy o konfiguracji VPN, skonfiguruj serwer OpenVPN oraz
klienta, tak aby było możliwe połączenie sieciowe przez uzyskany bezpieczny tunel.

Przedstaw zalety oraz wady własnego rozwiązania i skonfigurowanych
parametrów połączenia.

2. Firewall (indywidualnie)

Za pomocą iptables skonfiguruj zaporę chroniącą lokalną stację roboczą/serwer
tak aby:

Zezwalać na dowolne połączenia wychodzące.
Zezwalać na połączenia przychodzące tylko pod warunkiem, że sami je inicjujemy.
Zezwalać na przychodzące połączenia inicjujące tylko na porty 80, 9000-9010.
(Dla celów testowania na serwerze powinny być uruchomione serwery ssh oraz http).
Wpuszczać żądania echa ICMP.
Zezwalać na połączenia inicjujące ssh tylko z podsieci BSK lab.
Ograniczyć liczbę połączeń inicjujących przychodzących do portu 22 do 10 na minutę
z jednego źródłowego adresu IP.
Zadbać o interfejs loopback.
Przygotować regułę/reguły firewalla umożliwiające uruchomienie podstawowego serwera DNS.
Blokować wszystkie inne połączenia przychodzące.

Sprawdź szczelność firewalla za pomocą nmapa przedstawiając proponowane metody
testowania. Porównaj wyniki testów dla portu 22 i 9000.

Zaliczenie 2016

Zadanie

1. Napisać skrypt tworzący indywidualne certyfikaty dla użytkowników serwera OpenVPN. Dane wejściowe: imię i nazwisko użytkownika oraz jego adres email (imienia i nazwiska należy użyć jako CN w generowanym certyfikacie). Wcześniej trzeba oczywiście zadbać o utworzenie CA na potrzeby VPN.

2. Napisać skrypt tworzący listę odwołanych certyfikatów dla użytkowników, którzy mają utracić dostęp. Uwzględnić listę CRL w konfiguracji serwera VPN.

3. Skonfigurować serwer OpenVPN oparty o transport tcp i ww. certyfikaty wraz z uwzględnieniem CRL.

4. Skonfigurować klienta OpenVPN tak, aby użytkownik mógł się połączyć z serwerem za pomocą swojego certyfikatu.

5. Na serwerze skonfigurować firewalla tak, aby można było wykonywać połączenia przychodzące jedynie do portu OpenVPN tcp tylko z podsieci 192.168.0.0/16.

Zaliczenie 2018

Zadanie zaliczeniowe można wykonać w parach, ponieważ używamy dwóch komputerów: serwera i bramki.

Na komputerze serwera:

1. Uruchom serwer www nasłuchujący na standardowym porcie (80).
2. Ustaw reguły w jego zaporze tak, żeby wpuszczały tylko ruch przychodzący
z bramki.

Skonfiguruj sieć VPN między dwoma komputerami serwer i bramka z wykorzystaniem
certyfikatów. Openvpn można uruchomić na obu komputerach przez standardowy
skrypt startowy (/etc/init.d/openvpn start).

Logi openvpn powinny być zapisywane do pliku /var/log/openvpn.log,
komunikacja odbywać ma się za pośrednictwem protokołu TCP.
Tunel VPN powinien używać adresów 10.x.0.1 i 10.x.0.2 gdzie x czwartą
częścią adresu IP serwera (np. 192.12.14.15 będzie x=15).

Tylko komputery bramka i serwer (możesz je nazwać) mogą korzystać z tunelu.

Następnie skonfiguruj routing w następujący sposób:

  • Komputer bramki skonfiguruj jako bramkę NAT dla serwera
  • Ruch sieciowy z serwera ma odbywać się wyłącznie po VPN
  • Przekieruj wszystkie odwołania do portu 8080 bramki do portu 80 serwera
    (używając tunelu do przesyłania pakietów). Nie zapomnij włączyć IP
    forwarding.
  • Zabroń w bramce pakietów dla bramki adresowanych na port 80. Zapisuj
    do logu informacje o odrzuconych pakietach.