Budowa bezpiecznej sieci WLAN (WEP + IPSec)

2005-01-01 00:00:00 +0000


Sieci bezprzewodowe stają się coraz powszechniejsze. Niski koszt budowy infrastruktury oraz wygoda, jaką daje mobilność przyciągają coraz to większą rzeszę użytkowników. Najczęściej jednak zapominają oni o niebezpieczeństwie, jakie niesie z sobą komunikacja przy użyciu fal radiowych. W większości sieci nie są wykorzystywane żadne metody szyfrowania, tak więc cały ruch dostępny jest dla każdego, kto z odpowiednim wyposażeniem (i wrogimi zamiarami) znajdzie się w pobliżu sieci. Wystarczy laptop z kartą WLAN i odpowiednim oprogramowaniem, by poznać chociażby hasła przesyłane otwartym tekstem.

Jak więc zadbać o poufność naszej komunikacji? Standardem szyfrowania stosowanym w bezprzewodowych sieciach IEEE 802.11, jest WEP (Wired Equivalent Privacy). Oferuje on szyfrowanie kluczami o długościach 40 i 104 bitów, co w połączeniu z wektorem inicjującym (IV) o długości 24 bitów, daje odpowiednio 64 i 128 bitów. W takiej właśnie postaci o sile szyfrowania informuje większość producentów (choć nie jest to stwierdzenie poprawne z technicznego punktu widzenia). Niemniej jednak, od dłuższego czasu wiadomo o słabościach algorytmu WEP. Złamanie 104 bitowego klucza wymaga zgromadzenia przez włamywacza około 350 tys. pakietów, po czym znalezienie użytego ciągu to kwestia sekund. Oprogramowanie używane przy włamaniach dostępne jest publicznie w sieci Internet. Do najbardziej popularnych aplikacji zaliczyć można kismet, AirSnort, czy narzędzie przeznaczone do prezentacji słabości WEP o nazwie WepLab. Odnośniki do tychże programów znaleźć można na końcu artykułu. O wiele lepszym rozwiązaniem okazuje się WPA (Wi-Fi Protected Access), zaproponowany jako lek na słabości WEP. Niestety nie wszystkie urządzenia mogą korzystać z nowego algorytmu. Czy zdani więc jesteśmy tylko na łatwy do złamania WEP? Niekoniecznie...

W dalszej części artykułu skupimy się na budowie małej sieci bezprzewodowej, zapewniającej wysoki poziom bezpieczeństwa. Sieć dla uproszczenia składać się będzie tylko z dwóch maszyn. Dzięki temu do działania wystarczą dwie karty sieciowe (sieć pracować będzie w trybie Ad-Hoc). Maszyna A (komputer stacjonarny) posiada połączenie z siecią Internet za pośrednictwem interfejsu eth0. Do komunikacji z Maszyną B (laptop) wykorzystana zostanie karta WLAN - wlan0. Dla uproszczenia pewnych operacji na obu maszynach zainstalowano system GNU/Linux z jądrem serii 2.6. Pokrótce przedstawię także sposób przekazywania połączeń z Maszyny B do Internetu. Jako, że większość providerów nie zezwala na dzielenie łącza, przedstawiony sposób utrudni w znacznym stopniu wykrycie tego procederu. Po szczegółowe informacje odsyłam do czasopisma Hakin9. W numerze 11 pojawił się artykuł autorstwa Mariusza Tomaszewskiego, Macieja Szmita i Marka Gusty pt. "Sprzątanie pajęczyn - detekcja nielegalnego współdzielenia łącza" (dostępny w formacie pdf na stronie www czasopisma).

A więc do rzeczy... Najlepszym rozwiązaniem byłoby zastosowanie WPA do szyfrowania danych przesyłanych między maszynami. Niestety jedna z kart sieciowych nie wspiera tego rozwiązania. Pomijając słabości WEP, wykorzystamy go jako jedną z warstw zabezpieczeń. Powinno zniechęcić ono przypadkowych podglądaczy, a Ci których nie zniechęci trafia na kolejną barierę, tym razem o wiele poważniejszą - między komputerami stworzony zostanie bowiem tunel IPSec. Być może rozwiązanie oparte o WEP wydaje się zbędne, jednak próba złamania klucza zmarnuje trochę zasobów włamywacza.

Zacznijmy od zestawienia połączenia między Maszynami A i B (zakładam, że karty sieciowe oraz wymagane oprogramowanie i moduły jądra są już zainstalowane/dostępne w systemie). Jako użytkownik root poddajemy edycji plik ifcfg-wlan0 (w większości dystrybucji przechowywany w katalogu /etc/sysconfig/network). Przykładowy plik, może wyglądać następująco:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

DEVICE=wlan0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.0.1
NETMASK=255.255.255.0
ESSID="p4k219xv"
MODE="Ad-Hoc"
CHANNEL=3
KEY="426C-6144-4130-5630-3637-3267-57"

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

W tworzonej sieci bezprzewodowej skorzystamy z adresów klasy A z 24 bitową maską (10.0.0.0/24). Maszyna A posiadać będzie adres 10.0.0.1, zaś Maszyna B - 10.0.0.2. Zgodnie z zaleceniami budowy bezpiecznej sieci, ESSID powinien być nic nie mówiącym ciągiem znaków (tak by włamywacz nie skojarzył go w łatwy sposób z siecią). Jak zaznaczono wcześniej sieć pracuje w trybie Ad-Hoc (pozwala to połączyć dwa urządzenia bez pośrednictwa Access Pointa). Pole KEY, to klucz używany przez WEP zapisany w notacji szesnastkowej [kody znaków dostępne są w tablicy ASCII (man ascii)].

Po podniesieniu interfejsu poleceniem "ifconfig wlan0 up", wynik użycia iwconfig powinien być zbliżony do następującego:

[root@MaszynaA]# iwconfig wlan0
wlan0     IEEE 802.11b  ESSID:"p4k219xv"
          Mode:Ad-Hoc  Frequency:2.422 GHz  Cell: 02:C4:77:C4:ED:32
          Bit Rate=11 Mb/s
          Retry:on   Fragment thr:off
          Encryption key:426C-6144-4130-5630-3637-3267-57   Security mode:restricted
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
  

Od tego momentu sieć powinna funkcjonować, a Maszyny A i B powinny być w stanie przesyłać do siebie pakiety. Po przeprowadzeniu testów poleceniem ping, przechodzimy dalej. Zanim jednak zbudujemy tunel IPSec, zatrzymamy się chwile przy budowie filtra pakietów. Poniższe linie stanowić mogą skrypt uruchamiający stanowy firewall.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#!/bin/bash

# VARIABLES goes first
PROG=/usr/sbin/iptables
ETHIP=192.168.1.14
WLANIP=10.0.0.1

# RULES now

# Default Policy:
$PROG -P INPUT DROP
$PROG -P FORWARD DROP
$PROG -F
$PROG -F -t nat
$PROG -F -t filter

# Loopback interface:
$PROG -A INPUT -i lo -j ACCEPT

# Ethernet and WLAN interfaces:
$PROG -A INPUT -i wlan0 -d $WLANIP/32 -s 10.0.0.2/32 -m mac --mac-source [ADRES_MAC_MASZYNY B] -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$PROG -A INPUT -i eth0 -d $ETHIP/32 -s 192.168.1.0/24 -p icmp --icmp-type 8 -j REJECT --reject-with icmp-host-unreachable
$PROG -A INPUT -i eth0 -d $ETHIP/32 -s 192.168.1.0/24 -p icmp --icmp-type 0 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$PROG -A INPUT -i eth0 -d $ETHIP/32 -p icmp -m conntrack --ctstate RELATED -j ACCEPT
$PROG -A INPUT -i eth0 -d $ETHIP/32 -s ! 192.168.1.0/24 -m mac --mac-source [ADRES_MAC_PROVIDERA_BRAMY_DO_INTERNETU] -m conntrack --ctstate ESTABLISHED -j ACCEPT

# NAT and FORWADING
$PROG -t filter -A FORWARD -s 10.0.0.0/30 -j ACCEPT
$PROG -t filter -A FORWARD -d 10.0.0.0/30 -s ! 192.168.1.0/24 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$PROG -t nat -A POSTROUTING -s 10.0.0.2 -o eth0 -p tcp -j SNAT --to 192.168.1.14:1024-32000
$PROG -t nat -A POSTROUTING -s 10.0.0.2 -o eth0 -p udp -j SNAT --to 192.168.1.14:1024-32000
$PROG -t nat -A POSTROUTING -s 10.0.0.2 -o eth0 -j SNAT --to 192.168.1.14

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Szczegółowy opis poszczególnych linii został pominięty, zaś w razie niejasności odsyłam do systemowego podręcznika iptables (man iptables). Przed użyciem należy dostosować adresy IP oraz ścieżkę do programu iptables. Należy również poznać odpowiednie adresy MAC [Media Access Control]. Wpisanie ich na stałe zapobiega pewnej klasie ataków (głównie Man-in-the-Middle). Aby zapobiec zapytaniom o adresy MAC maszyn, można stworzyć plik /etc/ethers i wpisać tam na stałe pewne adresy IP oraz odpowiadające im adresy sprzętowe. Wówczas wymagana jest modyfikacja jednego ze skryptów startowych (np. /etc/rc.d/rc.local) i dodanie w nim linii postaci: "/sbin/arp -f /etc/ethers". Plik ethers wyglądać może następująco:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

10.0.0.2	[ADRES_MAC_MASZYNY B]
192.168.1.1	[ADRES_MAC_PROVIDERA_BRAMY_DO_INTERNETU]

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Domyślną polityką skryptu zapory ogniowej jest reguła "co nie jest dozwolone - jest zabronione". Maszyna A nie zezwala na pingowanie jej z sieci providera (udając, że host jest niedostępny), ani żaden inny rodzaj ruchu z wnętrza sieci (poza pakietami typu ping reply). Oczywiście skrypt wymagać może dostosowania do konkretnego systemu i ewentualnego dopuszczenia określonego ruchu.

Aby przekazywanie pakietów między interfejsami sieciowymi było możliwe, należy na Maszynie A zmodyfikować plik /etc/sysctl.conf, by zawierał następującą linię:

net.ipv4.ip_forward = 1

Aby utrudnić providerowi wykrycie dzielenia łącza warto dodać tam (na obu systemach) także linię:

net.ipv4.tcp_timestamps = 0

Na Maszynie B, należy także dołączyć linię:

net.ipv4.ip_default_ttl = 65
Na koniec stworzymy szyfrowany tunel między maszynami w sieci bezprzewodowej. Do tego celu użyjemy oprogramowania OpenSWAN, umożliwiającego wykorzystanie IPSec (w obu systemach używany jest natywny stos IPSec udostępniany przez jądra 2.6). Przykładowy plik konfiguracyjny /etc/ipsec.conf może wyglądać następująco:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

# /etc/ipsec.conf - Openswan IPsec configuration file

version 2.0

config setup
        interfaces="ipsec0=wlan0"

conn %default
        esp=aes-sha1-256
        auth=esp
        keylife=4h

conn p4k219xv
        left=10.0.0.1
        leftsubnet=0.0.0.0/0
        leftrsasigkey=[KLUCZ_MASZYNY_A]
        right=10.0.0.2
        rightrsasigkey=[KLUCZ_MASZYNY_B]
        auto=start

include /etc/ipsec.d/examples/no_oe.conf

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Aby poznać klucze obu maszyn, należy wydać polecenie "ipsec showhostkey --left" na Maszynie A oraz odpowiednio "ipsec showhostkey --right" dla Maszyny B. Następnie należy umieścić w odpowiednich miejscach pliku konfiguracyjnego otrzymane dane. Plik ipsec.conf powinien być identyczny na obu maszynach. Same powinny rozpoznać, którą stronę tunelu stanowią. Po wykonaniu powyższych czynności i uruchomieniu ipsec, między maszynami w sieci WLAN powinien powstać tunel, w którym cały ruch szyfrowany jest przy użyciu algorytmu AES (Advanced Encryption Standard) z 256-bitowym kluczem, zaś o integralność zadba algorytm SHA1.

I tak niewielkim nakładem pracy zbudowaliśmy bezprzewodową sieć komputerową wykorzystującą WEP oraz IPSec do szyfrowania komunikacji. Teraz możemy już spać o wiele spokojniej...

Polecam również zapoznanie się z materiałami dostępnymi w sieci:


Copyright 2oo5 by Dawid Stawiarski