Budowa bezpiecznej sieci WLAN (WEP + IPSec)

in

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