Tunele sieciowe
Wygoda, która związana jest ze zdalnym podłączeniem do Sieci współczesnej organizacji niesie ze sobą duże ryzyko przechwycenia niejawnych informacji. Można się opierać na bezpieczeństwie fizycznym dostępu do sieci firmowej, jednak taka koncepcja całkowicie nie ma zastosowania chociażby w sieciach bezprzewodowych.
Author: Daniel Suchocki
Source: Hakin9 06/2010 hakin9.org
Istnieją jednak nieskomplikowane rozwiązania zwiększające bezpieczeństwo przesyłu informacji firmowych zarówno w sieciach kablowych, jak również bezprzewodowych. Można zastosować technikę szyfrowania pakietów podczas transmisji pomiędzy komputerami. Ogólna zasada działania polega na zaszyfrowaniu pakietów w innych przejrzystych pakietach. Gwarantuje to nadawcy i odbiorcy informacji, że jedynie w miejscu docelowym będzie możliwe rozszyfrowanie i obejrzenie oryginalnego pakietu. Do szyfrowania transmisji można wykorzystać wiele narzędzi dostępnych w Internecie. Artykuł ten jest poświęcony przedstawieniu kilku przydatnych konfiguracji zwiększających bezpieczeństwo poprzez szyfrowanie połączeń w niezaufanych sieciach. Kilka przykładów będzie opartych o małe programy z niewielką konfiguracją, które będą zapewniały bezpieczeństwo i szyfrowanie mechanizmu transportowego. Zostaną również przedstawione sposoby przybliżające czytelnikowi tworzenie wirtualnych sieci prywatnych VPN.
Rozgrzewka
Większość programów i sposobów opisanych w tym artykule będzie korzystało z protokołu SSL. Jest to protokół stworzony przez firmę Netscape Communications Corporation i jego zadaniem jest transmisji danych. Opiera się na szyfrach asymetrycznych oraz certyfikatach standardu X.509, a jego główną zaletą jest fakt, że działa na warstwie TCP, dlatego można go łatwo zastosować do zabezpieczenia protokołów warstwy aplikacyjnej. Zanim zaczniemy budować sieci prywatne oparte o szyfrowanie transmisji musimy przygotować specjalne klucze (prywatne oraz publiczne). Do generowania kluczy, wniosków i certifikatów użyjemy najpopularniejszej biblioteki na świecie openssl. Jako środowisko do generowania potrzebnych plików użyjemy systemu Linux Debian, ale nic nie stoi na przeszkodzie, aby był to jakikolwiek inny system operacyjny. Na początek należy w wydać polecenie # apt-get install openssl, które zainstaluje potrzebne oprogramowanie. Aby wstępnie przygotować środowisko do generowania certyfikatów należy przejść do katalogu stworzonego przez aplikację ssl (domyślnie jest to katalog /etc/ssl), a następnie wydać polecenie:
# mkdir private certs crl oraz touch
index.txt: echo 00 >
serial
które stworzy katalogi private certs crl i wstępnie przygotują miejsce na przyszłe klucze. W pierwszej kolejności należy wygenerować klucz prywatny CA poleceniem:
# openssl genrsa –des3 –out provate/
cakey.pem 1024
następnie podać hasło do wygenerowanego klucza. W drugiej kolejności potrzebny będzie certyfikat CA, który generuje się poleceniem:
# openssl req –new –x509 –days 365
–key private/cakey.pem
–out cacert.pem
wykorzystując wcześniej stworzony klucz. Podczas tworzenia certyfikatu należy uzupełnić dane, o które zostajemy poproszeni. Dane dotyczą min. nazwy kraju, województwa, miasta, nazwę firmy, dla której jest generowany certyfikat oraz adres e-mail. Posiadając urząd CA można generować klucze oraz certyfikaty dla serwera VPN, którym będziemy się zajmować w późniejszym czasie oraz poszczególnych użytkowników z nim łączących. Generowanie klucza prywatnego dla serwera VPN odbywa się za pomocą polecenia:
# openssl genrsa –des3 –out provate/
server.pem 1024

Rysunek 1. Podgląd konfiguracji programu Putty do ustawienia szyfrowanego tunelu z programem pocztowym
Mając klucz prywatny serwera należy stworzyć wniosek o wystawienie certyfikatu poleceniem:
# openssl req –new –key provate/
serverkey.pem –
out serverreq.pem
oraz wypełnić formularz, który zostanie wyświetlony podczas procedury tworzenia wniosku. Wygląda on identycznie jak poprzedni formularz podczas tworzenia certyfikatu CA. Kolejnym krokiem jest podpisanie wniosku przez CA poleceniem:
# openssl ca –notext –in
serverreq.pem
–out
servercert.pem
podając hasło do wcześniej wygenerowanego klucza prywatnego CA (cakey.pem). W analogiczny sposób należy stworzyć klucze oraz certyfikaty dla poszczególnych użytkowników, którzy będą mieli dostęp do łączenia się z firmą za pomocą tuneli VPN. Dobrym pomysłem jest ściągnięcie hasła z klucza prywatnego serwera poleceniem:
# openssl rsa –in provate/
serverkey.pem
–out provate/
serverkey.pem_
brak_hasla
Dzięki takiemu zabiegowi serwer VPN będzie startował jako usługa, nie prosząc za każdym razem o hasło, co znacznie zautomatyzuje pracę serwera. Jeśli tego nie zrobimy przy każdym restarcie serwera, będzie on czekał na podanie hasła podczas startowania usługi, przez co proces podniesienia maszyny nie dojdzie do skutku i stracimy z nią zdalną łączność. Nie zaleca się jednak ściągania haseł z kluczy użytkowników, gdyż w razie utraty komputera stanowią one zabezpieczenie przed dostępem do danych firmowych. Uzbrojeni w klucze publiczne i prywatne możemy przystąpić do konfiguracji programów i szyfrowania transmisji w sieci.
Coś na początek
Każdy administrator zdalnie zarządzający serwerami zna najbardziej popularny program SSH. Jednak nie każdy wie, że za pomocą tego narzędzia można stworzyć całkiem przyzwoity szyfrowany tunel. Jedynym mankamentem jest fakt, aby zestawić taki tunel z odległym serwerem, musimy posiadać na nim konto z możliwością zdalnego logowania. Jest to jeden z najprostszych implementacji szyfrowanych tuneli, dla których nie trzeba specjalnie przygotowywać plików konfiguracyjnych lub żmudnie spędzać godziny na czytanie różnorodnych poradników. Mimo prostoty jest to wygodny sposób zabezpieczania ruchu np. pocztowego, WWW czy każdego innego, który powinien zostać niewidoczny, aż do drugiego końca tunelu. Sama zasada pracy SSH jest stosunkowo prosta. Program przekazuje ruch, poprzez powiązanie z lokalnym portem, szyfrując go (ruch) i wysyłając na drugi koniec połączenia ssh. Następnie odszyfrowuje go i wysyła do wskazanego portu na komputerze zdalnym. Jednym z przykładów często wykorzystywanym jest stworzenie takiego połączenia na potrzeby komunikacji z programem pocztowym. Taki przypadek może zostać wykorzystany np. podczas częstych wyjazdów pracowników handlowych, którzy będąc podłączeni w sieciach nieznanych, muszą być na bieżąco w sprawach firmowych i odbierają pocztę np. w sieci hotelowej. Najczęściej tacy handlowcy mają skonfigurowane programy pocztowe typu np. Outlook czy Thunderbird, a ogólnie widomo, że takie programy pocztowe podczas połączenia wysyłają login i hasło jawnym tekstem, co w nieznanej nam sieci może doprowadzić do podsłuchania tych danych, a co to oznacza każdy z nas wie. Wiec idąc dalej tym przykładem stworzymy tunel, który będzie łączył się serwerem w firmie handlowca tak, aby pobrać pocztę, jednak aby cały ten ruch był niewidoczny i niemożliwy do podsłuchania. Aby zestawić taki tunel w systemie Linux, należy wydać polecenie:
# ssh nazwa_użytkownika@numer_ip_
serwera –L 34542:
127.0.0.1:110
Takim poleceniem zestawiliśmy tunel, podając nazwę użytkownika oraz numer IP lub nazwę serwera z lokalnym portem 34542 (opcja –L) z odległym serwerem z portem 110 (POP3). Na uwadze należy mieć fakt, iż w systemach unikowych próba uruchomienia usługi nasłuchującej na porcie niższym niż 1024 wymaga uprawnień administracyjnych (root). Każde zestawienie tunelu przez zwykłego użytkownika na porcie niższym niż 1024 zostanie zwrócone komunikatem Privileged ports can only be forwarded by root. Jeśli chcemy zestawić taki tunel z w systemie Windows należy użyć do tego dobrze znany program Putty. Odpada również ograniczenie używania wysokich portów, gdyż w systemie Windows można śmiało używać portów poniżej 1024 jako zwykły użytkownik. Rysunek 1. przedstawia wstępną konfigurację programu do ustawienia szyfrowanego tunelu. Po nawiązaniu połączenia zostanie zestawiony tunel pomiędzy portem 110 maszyny lokalnej (Windows) a portem 110 na maszynie zdalnej (Linux). Na Rysunku 2. przedstawiono podgląd zestawionego tunelu pomiędzy maszyną Windows i Linux łączącego porty 110. Bardziej estetycznie będzie zadbanie o to, żeby podczas połączenia tunel przeszedł w tło na serwerze i nie blokował konsoli. Taki wynik można uzyskać dzięki poleceniu:
# ssh –f –n nazwa_użytkownika@numer
_ip_serwera –L
34542:127.0.0.1:
110 sleep 600

Rysunek 3. Podgląd konfiguracji programu Putty do ustawienia szyfrowanego tunelu z pulpitem zdalnym - I koniec tunelu (komputer firmowy)
Opcja –f nakazuje przejście w tło i tunel nie będzie zajmował zbędnego miejsca. Natomiast opcja –n informuje, aby proces nie wykonywał polecenia na zdalnym końcu tunelu, a jedynie przekazywał ruch. Dodatkowo zastosowano opcję sleep 600. Jest to zwykłe polecenie systemowe, które będzie nakazywało zestawienie tunelu na pewien określony czas, po czym proces zostanie wyłączony i tunel zniknie. Innym bardzo przydatnym sposobem wykorzystania SSH, który otwiera port po stronie serwera tak zwany remote forward. Dość często zdarza się sytuacja, iż nie zdążymy wykonać jakiś czynności w pracy na firmowym komputerze, a nie mamy za bardzo czasu, żeby siedzieć po godzinach. Być może znajdzie się parę sekund wieczorem. Dobrze by było wtedy coś dopisać – poprawić. Jednak polityka bezpieczeństwa sieci w firmie nie pozwala na przekierowanie portów na zewnątrz, a firewall firmowy jest tak skonfigurowany, że o pulpicie zdalnym możemy całkowicie zapomnieć. I w tym miejscu z pomocą przychodzi protokół SSH. Jedynym minusem tego sposobu jest fakt, iż musimy posiadać konto shellowe na pośredniczącym serwerze unikowym po to, żeby zestawić połączenie tunelowe i uzyskać połączenie pulpitu zdalnego z komputerem będącym za NAT-em. Na początek z komputera firmowego należy stworzyć połączenie z serwerem pośredniczącym. W tym celu posłużymy się wcześniej opisywanym już programem Putty. W zakładce Tunnels ustawiamy Source port na 12345 natomiast opcję Destination na 127.0.0.1:3389 i zaznaczamy opcję Remote. Opisaną konfigurację przedstawiono na Rysunku 3. Source port jest portem, który zostanie otwarty na serwerze pośredniczącym po nawiązaniu połączenia przez komputer firmowy. W tym miejscu należy podać dowolny port większy niż 1024 (wcześniej opisano zasadę przydzielania portów), natomiast Destination to końcówka naszego tunelu. Po poprawnym nawiązaniu połączenia zostanie ustawiony tunel pomiędzy portem 12345 interfejsu 127.0.0.1 (localhost), a usługą Windows zdalny pulpit. Schemat połączonego tunelu przedstawia Rysunek 4. Teraz należy zadbać o stworzenie drugiego odcinka tunelu pomiędzy serwerem pośredniczącym, a naszym komputerem domowym. W takim wypadku należy zaznaczyć opcję przekazywania lokalnego local forward pomiędzy lokalnym portem naszego komputera domowego, a już wcześniej wykorzystanym portem zdalnym na serwerze pośredniczącym 12345. W programie Putty należy jako Source port ustawić port np. 33389, natomiast w polu Destination wpisać 127.0.0.1:12345 oraz zaznaczyć opcję Local. W tym przypadku pole Source port oznacza lokalny port komputera, z którym będzie podłączony tunel, natomiast Destination jest to adres docelowy naszego tunelu. Opisaną konfigurację w programie Putty przedstawia Rysunek 5. Po zestawieniu połączenia SSH możemy połączyć się z komputerem firmowym poprzez usługę zdalnego pulpitu w systemie Windows (mstsc.exe), korzystając z adresu 127.0.0.1:33389, jak pokazano na Rysunku 6. Całość zestawionego tunelu przedstawiono na Rysunku 7. Dzięki prostemu rozwiązaniu można omijać (niektóre) firewalle firmowe i bez przeszkód logować się do komputerowych firmowych nawet po godzinach pracy. Kolejnym bardzo praktycznym przykładem wykorzystania narzędzia SSH jest sytuacja, która zapewne zdarzyła się niejednemu użytkownikowi. Załóżmy, że korzystamy z Internet wpięci w sieć osiedlową. Minusem takiego rozwiązania jest fakt comiesięcznego opłacania abonamentu i czasem zdarzy się nam zapomnieć lub przekroczyć termin zapłaty. Wtedy administrator blokuje nam ruch zewnętrzny na porcie 80 oraz np. 8080, dzięki czemu nasza przeglądarka przestanie z nami współpracować. Mając jednak dostęp do konta shellowego na serwerze linuksowym możemy stworzyć tunel, który ominie blokadę nałożoną przez administratora. Krótko mówiąc stworzymy z serwera SSH Proxy dla własnych potrzeb. Mogłoby się wydawać, że jest to niemożliwe, gdyż w poprzednich przypadkach końcami tunelu zawsze był jeden stały ustawiony port. Natomiast sieć WWW jest tak ogromna, że takie rozwiązanie nie może zostać wykorzystane. Jednak twórcy SSH stworzyli tunele dynamiczne dzięki czemu został rozwiązany problem i nie musimy się martwić o zestawianie kolejnych połączeń. Logujemy się za pomocą protokołu SSH, tak jak to robiliśmy w poprzednich przypadkach, jednak dodatkowo używamy przełącznika –D, który jest odpowiedzialny za implementowanie tuneli dynamicznych
# ssh nazwa_użytkownika@numer_ip_
serwera –D 8080

Rysunek 5. Podgląd konfiguracji programu Putty do ustawienia szyfrowanego tunelu z pulpitem zdalnym - II koniec tunelu (komputer domowy)
Jeśli chcemy dokonać takiego połączenia tunelowego w systemie Windows musimy użyć programu Putty, zaznaczyć opcję Dynamic oraz podać port 8080. Konfigurację w programie Putty przedstawia Rysunek 8. Po wydaniu tego polecenia na naszym komputerze zostanie otwarty port 8080, który musimy wykorzystać jako Proxy protokołu SOCKS, wpisując go w naszej przeglądarce w zakładce konfiguracji serwera pośredniczącego. Dzięki takiemu rozwiązaniu wszystkie dane przekazywane portem 8080 będą w pierwszej kolejności przesyłane tunelem do serwera SSH, a w kolejnym kroku do serwera docelowego, czyli tego, który zostanie podany w adresie przeglądarki. Jak widać protokół SSH, który na co dzień jest używany do całkowicie innych zadań może świetnie sprawdzić się jako budulec silnych szyfrowanych tuneli. Oprócz własnej implementacji i możliwości tworzenia połączeń protokół można wykorzystać jako dodatkowe zabezpieczenie podczas tworzenia tuneli za pomocą innego oprogramowania. Takim oprogramowaniem, z którym można połączyć SSH jest VTun. Jest to serwer tunelu, który działa w przestrzeni użytkownika wykorzystując standardowy sterownik tunelowania tun. Jest to dobre rozwiązanie, jeśli myślimy o zabezpieczeniu się szyfrowanym ruchem IP, przemieszczając się np. w sieciach bezprzewodowych. Program jest darmowy i uniwersalny, jeśli chodzi o systemy operacyjne. Obecnie działa pod Linuxem, BSD oraz Mac OS X. Zanim przystąpimy do pracy należy wyposażyć się w program VTun. Jest on obecny w większości systemów operacyjnych posiadających własne repozytoria oraz upewnić się, że w jądro systemu jest wbudowany sterownik tun. Jeśli sterownik został wkompilowany w jądro należy wydać polecenie (warto zadbać, aby i serwer i klient posiadali te same wersje jąder, aby wyeliminować błędne działanie sterownika tun):
# modprobe tun
Kolejnym krokiem jest przygotowanie konfiguracji na serwerze VTun oraz stacji klienckiej. Listing 1. przedstawia przykładową konfigurację po stronie serwera. Do najważniejszych opcji w pliku konfiguracyjnym należy ustawienie portu, na który ma nasłuchiwać usługa, typ interfejsu, jaki ma być wykorzystany podczas połączenia, oraz opcje ustawienia sieci, które posłużą do konfiguracji połączenia tunelowego. Listing 2. przedstawia przykładową konfigurację na stacji klienckiej. Plik konfiguracyjny nie różni się bardzo od poprzedniej konfiguracji z tą różnicą, że opcje ustawienia sieci (ifconfig pointo point) są ustawione odwrotnie oraz dodano opcję route. Tak wstępnie przygotowany program VTun jest gotowy do pracy. Na serwerze należy wydać polecenie:
# vtund –s
natomiast na stacji klienckiej:
# vtund –p <ip_lub_nazwa_klienta>
<ip_lub_nazwa_
serwera>
I to cała trudność. Właśnie ustawiliśmy szyfrowany tunel pomiędzy serwerem, a komputerem klienckim. Program VTun ustawił nową trasę domyślną, prowadzącą przez drugi koniec tunelu. Taka konfiguracja oznacza, że wszystkie procesy działające na stacji klienckiej dostępne będą pod adresem ustawionym w pliku konfiguracyjnym (200.123.123.33). Aby sprawdzić jak prezentuje się konfiguracja na nowym interfejsie wyfraczy wydać polecenie: # ifconfig tun0 oraz # route Aby zerwać połączenie i wyłączyć ustawiony tunel wystarczy zabić proces vtund, który działa na stacji klienckiej, po czym wszystkie ustawienia sieciowe wrócą do pierwotnych ustawień. Jak wcześniej zostało wspomniane, aby bardziej zabezpieczyć taki tunel można wykorzystać połączenie programu VTun z protokołem SSH. Nie trzeba za bardzo się wysilać, gdyż VTun wykona prawie całą robotę za nas, a za pomocą SSH przekierujemy jedynie port 5544 klienta do tego samego portu na serwerze. Aby przekserować port należy po stronie klienta wydać polecenie:
# ssh –f –N –c blowfish –C –L5544:
localhost:5544
numer_ip_serwera
oraz uruchomić program VTun poleceniem:
# vtund –p <ip_lub_nazwa_klienta>
localhost
Używając połączenia programu VTun oraz SSH dobrym pomysłem będzie zablokowanie ruchu z zewnątrz na porcie 5544 serwera dla niepowołanych gości. Aby tego dokonać, należy przekonfigurować zaporę filtrującą wydając poleceniem:
# iptables –A INPUT –t filter –i eth0
–p tcp –dport
5544 –j DROP
Tak ustawiony firewall pozwala na połączenia lokalne, więc przed zaakceptowaniem połączenia tunelowego za pomocą program VTun musi być włączony tunel SSH z serwerem. Jak widać ustawianie tuneli sieciowych za pomocą programu VTun jest dość prostym zadaniem, a w połączeniu z protokołem SSH można jeszcze bardziej wymusić bezpieczeństwo takiego zdalnego połączenia z odległą maszyną. Program SSH posiada także bardzo ciekawą opcję ProxyCommand. Jest ona stosunkowo rzadko używania, niektórzy nawet nie wiedzą o jej istnieniu, jednak dzięki niej możemy określić program, przez który będą przekazywane połączenia. Poprawne użycie tej opcji spowoduje, że SSH stworzy szyfrowany tunel i cały ruch będzie kierowany na standardowe wejście i wyjście programu. Idąc tym tropem dalej, możemy wykorzystać protokół SSH, program, który potrafi łączyć się z dowolnego rodzaju serwerem Proxy oraz sieć TOR-a do stworzenia całkiem interesującego tunelu. Wynikiem takiego połączenia będzie szyfrowane połączenie zapewniające całkowitą anonimowość osobie, która połączy się z jakimkolwiek zdalnym serwerem. Aby użyć ogromnej sieci serwerów wchodzących w skład sieci TOR-a, należy w systemie linuksowym wydać polecenie (Debian):
# apt-get install tor
Programem, który potrafi łączyć się z serwerem proxy jest np. connect.c dostępne pod adresem https: //savannah.gnu.org/maintenance/ connect.c. Po pobraniu programu ze strony w pierwszym kroku należy go skompilować poleceniem:
# gcc –o connect connect.c
Mając skompilowany program connect oraz zainstalowany program TOR, możemy przystąpić do uruchomienia szyfrowanego, anonimowego tunelu sieciowego. Aby uruchomić tunel należy wydać polecenie:
# ssh –o ProxyCommand=”/home/user/
connect –S
localhost:9050 %h
%p” <ip_serwera>
Oczywiście należy zwrócić uwagę, aby w miejsce localhost wpisać adres lub nazwę hosta, na którym pracuje TOR, jeśli nie jest on uruchomiony na komputerze lokalnym. Opcje %h oraz %p określają nazwę użytkownika oraz port, a program SSH zmieni je odpowiednio na takie jakie są aktualnie używane na komputerze lokalnym. Dzięki takiemu rozwiązaniu sposób przekazywania połączeń jest bardzo elastyczny. Najważniejszym krokiem jest fakt, że w poleceniu na końcu zawsze musi znaleźć się numer IP serwera, z którym ma zostać nawiązane połączenie. Dzięki takiemu rozwiązaniu ssh nie będzie musiało translatować nazwy serwera na adres IP przed przesłaniem tej informacji do programu connect. Gdyby do tego doszło całe połączenie nie miałoby sensu, ponieważ TOR nie chroni transmisji tłumaczenia nazw i przez to zdradzilibyśmy naszą lokalizację. Jednak ten słaby punkt sieci TOR jest nadrabiany pewną sztuczką. W pakiecie TOR-a znajduje się pewien program, który potrafi przetłumaczyć nazwę serwera na numer IP, przesyłając odpowiednie zapytanie DNS właśnie przez swoją sieć. Używanie programu jest bajecznie proste wystarczy podać jako parametr nazwę serwera z którym chcemy nawiązać połączenie oraz adres i port, na którym nasłuchuje nasz TOR:
# tor-resolve www.serwer.pl
localhost:9050
Dzięki temu poleceniu ujrzymy numer IP, który w dalszej kolejności możemy użyć do skonstruowania anonimowego tunelu. Opuszczając krainę możliwości bardzo popularnego programu SSH (który dla niektórych od dziś będzie posiadał znacznie większe możliwości) zajmiemy się tworzeniem tuneli za pomocą innych narzędzi stworzonych specjalnie na takie potrzeby. Bez wątpienia takim programem jest Stunnel. Jest on dostępny na licencji GNU i służy do tworzenia połączeń TCP z uwierzytelnianiem certyfikatów SSL X.509. Tak więc w tym przypadku przydadzą się nam klucze, które wygenerowaliśmy na samym początku. Program Stunnel wykorzystamy do stworzenia tunelu TCP, który umożliwi nam szyfrowany dostęp do aplikacji bazodanowej mieszczącej się w sieci wewnątrz organizacji. Instalacja programu jest dość prosta, gdyż znajduje się on w większości popularnych systemu Linux. Aby zainstalować Stunnel w systemie Linux Debian należy wydać polecenie:
# apt-get install stunnel
Jest jednak mała różnica, gdyż program Stunnel do poprawnego działania potrzebuje klucza prywatnego oraz certyfikatu w jednym pliku. Aby scalić dwa wcześniej przygotowane pliki w jeden, należy przejść do katalogu, który zawiera pliki i wydać polecenie:
# cat private/serverkey.pem_bezhasla
> private/
server.pem
# echo “ “ >>private/server.pem
# cat servercert.pem >> private/
server.pem
Pliki przygotowane w ten sposób można przegrać na komputer, który będzie pełnił rolę serwera do łączenia się w tunel z innymi jednostkami. W tym momencie istnieją dwa sposoby na dalszą konfigurację programu, gdyż należy sobie zadać pytanie czy będziemy potrzebowali certyfikatów i klucze dla klientów łączących się z usługa programu Stunnel? Odpowiedź na to pytanie jest proste. Wszystko zależy od konkretnego przypadku, w jakim chcemy użyć naszego szyfrowanego tunelu. Jeśli byłaby to usługa pozwalająca się łączyć z serwerem POP3, tak jak to było w przypadku z szyfrowanym tunelem SSH opisanym wyżej, to zapewne takie certyfikaty nie są nam potrzebne, nawet nie mają większego sensu. W naszym przypadku jednak wystawienie na widok publiczny aplikacji bazodanowej, której dostęp powinien być jak najlepiej zabezpieczony i ograniczony dla osób niepowołanych, takie certyfikaty powinny się znaleźć. Choćby z prostej przyczyny należy wziąć pod uwagę, że takie aplikacje mogą paść celem różnorodnych ataków typu np. SQL Injection. W naszym przykładzie połączymy się z sieci hotelowej z siecią firmową, w której wewnątrz pracuje aplikacja bazodanowa. Serwer, na którym nasłuchuje program Stunnel podłączony jest w jednej sieci wraz z serwerem bazodanowym. Posiadając już potrzebne klucze i certyfikaty oraz zainstalowany program Stunnel należy przejść do następnego kroku, czyli przygotowania konfiguracji serwera. Przykładową konfigurację po stronie serwera przedstawia Listing 3. Do najważniejszych opcji użytych w pliku konfiguracyjnym należą min. chroot – jest to opcja, określająca katalog, w którym uwięziony zostanie proces programu po inicjalizacji. Jest to doskonała metoda na uwięzienie użytkownika w określonym katalogu nawet w przypadku, gdy znajdzie on krytyczną lukę i wykorzysta ją, aby zaatakować serwer. Taki użytkownik nie będzie posiadał prawa wyjścia poza katalog, w którym został uwięziony. Kolejna ciekawą opcją jest opcja debug, która określa poziom szczegółowości logowania. Opcja output to nic innego jak określenie pliku, do którego mają odkładać się logi. Jeśli chodzi o drugą część pliku konfiguracyjnego to opcjami, które należałoby opisać jest na pewno opcja akcept, która jest odpowiedzialna za wskazanie portu, na którym będzie nasłuchiwał serwer Stunnel. Opcja connect określa adres IP oraz port przekazany po poprawnym połączeniu z serwerem Stunnel. Ostatnią ważną opcją jest verify, która odpowiada za weryfikacje certyfikatów (1 – weryfikuj, jeżeli został przedstawiony, 2 – weryfikuj certyfikat przez lokalne CA, 3 – weryfikuj z lokalnie zainstalowanym certyfikatem drugiej strony). Należy również pamiętać, aby umożliwić zaporze sieciowej przepuszczanie ruchu na określonym porcie. Jeżeli używany do ochrony iptables należy wydać polecenie:
# iptables –I INPUT –i eth0 –p tcp
–d
–dport 12345 –j
ACCEPT
Ostatnim krokiem jakim należy wykonać jest instalacja programu Stunnel na stacji klienckiej oraz przygotowanie pliku konfiguracyjnego. Przykładowy plik konfiguracyjny przedstawiono na Listingu 4. Po podłączeniu tunelu musimy pamiętać, aby zmienić adres IP serwera, na którym pracuje program bazodanowy. Należy zastąpić adres IP adresem 127.0.0.1. Dzięki prostemu programikowi Stunnel możemy uzyskać dostęp do dużych aplikacji ERP, CRM, a nawet wewnętrznych platform e-learningowych, które z zasady są stworzone, aby korzystać z nich wewnątrz organizacji. Taki tunel w bezpieczny i szyfrowany sposób pozwoli nam na dostęp do danych z każdego miejsca na świecie. Stworzony tunel obrazuje Rysunek 9. Aby nie przechylać wartości artykułu wyłącznie na stronę systemów UNIX, jako kolejny program, który doskonale sprawdza się w połączeniach szyfrowanych tuneli jest Hamachi. Hamachi umożliwia stworzenie sieci wymiany plików pomiędzy komputerami bez względu czy znajdują się za NAT-em. Dzięki specjalnej technologii możliwe jest nawiązanie połączenia z komputerami z wewnętrznym adresem IP lub tymi, które mają zainstalowany firewall. Program poprzez ustawienie haseł strzeże dostępu do stworzonej sieci dzięki czemu wymiana plików jest dość bezpieczna. Obsługa programu jest bajecznie prosta, a dodatkowo pracę ułatwia kurs obsługi który wyświetla się wraz z pierwszym uruchomieniem. Użytkownik uzyska z niego wszystkie niezbędne informacje. Każdy komputer podłączony do sieci ma swój unikalny adres hamachi, nick oraz klucz dostępu. Dodatkowo należy zwrócić uwagę na szybkość działania aplikacji. Po zainstalowaniu aplikacji pojawi się nam okno programu przygotowane do włączenia za pomocą przycisku w górnej części. Główne okno programu przedstawia Rysunek 10. Po załączeniu programu uzyskamy nasz unikatowy numer IP oraz będziemy mogli stworzyć nową sieć lub podłączyć się już do istniejącej. Aby podłączyć się do istniejącej sieci musimy znać jej nazwę oraz hasło broniące dostępu do niej. Po podłączeniu się do sieci zobaczymy jej nazwę oraz wszystkich innych użytkowników do niej podłączonych. Rysunek 11. przedstawia okno programu Hamachi podłączone do sieci. Teraz komputery odległe od siebie o tysiące kilometrów mogą wymieniać się między sobą plikami tak, jakby były w jednej sieci lokalnej. Program Hamachi jest wykorzystywany obecnie na setki równych sposobów. Używają go gracze, którzy łączą się w wielkie sieci i trenują swoje zmagania w grach sieciowych, używają go administratorzy, którzy dzięki tak prostej konstrukcji są w stanie zarządzać swoimi serwerami poprzez np. protokół RDP (pulpit zdalny), jak również wykorzystywany jest przez zwykłych użytkowników to prostej wymiany zdjęć czy plików tekstowych. Jeśli chodzi o małe aplikacje do tworzenia tuneli z szyfrowaną transmisją to mamy ogromne pole do popisu. W artykule znalazły się jedynie wybrane sposoby oraz programy, gdyż miejsce na tekst jest ograniczone. Ale szyfrowane tunele to nie tylko małe programiki. Dzięki zaawansowanym oprogramowaniom można tworzyć duże sieci firmowe łączące swoich pracowników, a nawet filie czy inne ogromne korporacje w jedną całość oczywiście zważając w dalszym ciągu na bezpieczeństwo transmisji danych wewnątrz tego wirtualnego świata.
Coś większego
Do budowy dużych sieci z szyfrowaną transmisją danych można wykorzystać darmowy projekt o nazwie OpenVPN. OpenVPN działa w parciu o protokół SSL, czyli będą nam potrzebne klucze, które zostały stworzone na początku artykułu. Został on stworzony przez Jamesa Yonana i obecnie jest silnie rozwijany przez gronu ludzi z całego świata. Posiada ogromną zaletę dzięki, której jest szanowany i chętnie wybierany przez użytkowników – jest dostępny i konfigurowalny na wszystkich platformach takich jak Linux, Windows 200/XP, OpenBSD, FreeBSD NetBSD, Mac OS oraz Solaris. OpenVPN realizuje tunelowanie za pomocą działającego w systemie operacyjnym wirtualnego urządzenia TUN/TAP. Dzięki temu możliwe jest stworzenie w systemie wirtualnego interfejsu sieciowego, który jest wykorzystywany przez OpenVPN do utworzenia połączenia między klientem a serwerem. Cały ruch sieciowy nie jest wysyłany i odbierany przez interfejs wirtualny, tylko przez program, który działa w przestrzeni użytkownika. Gdy dane trafiają do interfejsu wirtualnego przekazywane są do procesu openvpn, który w pierwszej kolejności je szyfruje, a następnie wysyła do procesu openvpn, działającego na drugim końcu szyfrowanego tunelu. Gdy informacja trafi już na drugi koniec tunelu do procesu openvpn lokalnej maszyny zostają odszyfrowane i przekazane na interfejs wirtualny, gdzie są traktowane jak każda inna informacja, która trafia na interfejs fizyczny. Sposób i droga pakietu wędrującego między wirtualnym interfejsem, a fizycznym przedstawia Rysunek 12. OpenVPN oferuje bardzo wydajny i skalowalny tryb pracy serwera zarówno z jednym, jak i wieloma klientami, wykorzystując tutaj zasadę serwera DHCP, przypisując i pilnując adresacje swoich klientów. Konfiguracja programu OpenVPN nie jest stosunkowo trudnym zadaniem. Większość systemów z rodziny *UNIX posiada źródła tego oprogramowania w swoich repozytoriach, natomiast dla systemów z rodziny Windows istnieją darmowe odpowiedniki w postaci instalacyjnych pików exe. Do przedstawienia zasady działania oraz konfiguracji połączeń VPN zbudujemy sieć firmową, wewnątrz której pracują komputery z różnymi systemami operacyjnymi. Wewnątrz sieci pracuje serwer VPN oparty o system Linux Debian. Z zewnątrz czterech handlowców (klientów VPN) z systemem Windows XP, Linux Fedora, FreeBSD oraz Mac OS X będą chcieli podłączyć się do sieci wewnątrz firmy, aby funkcjonować tak jakby byli obecni na swoich stanowiskach. Przykładowy schemat łączenia się klienta z odziałem firmy za pomocą tunelu VPN przedstawiono na Rysunku 13. Budowę naszych tuneli rozpoczniemy od instalacji i konfiguracji serwera VPN. Aby zainstalować program OpenVPN na serwerze Linux Debian, należy wydać polecenie apt-get install openvpn. System automatycznie dowiąże potrzebne oprogramowanie do stabilnej pracy. Przed rozpoczęciem konfiguracji programu należy przegrać do katalogu z konfiguracją programu OpenVPN uprzednio przygotowane pliki (certyfikat i klucz prywatny serwera, certyfikat wystawcy CA, plik dh1024.pem). Mając przygotowane klucze i certyfikaty dla serwerów i użytkowników (zrobiliśmy to na początku artykułu) można przejść do konfiguracji samego oprogramowania OpenVPN. Następnie należy przygotować plik konfiguracyjny serwera VPN. Przykładowy plik konfiguracji programu OpenVPN po stronie serwera został przedstawiony na Listingu 5. Tak przygotowany plik jest wystarczający do prawidłowej pracy serwera VPN. Ważne, aby nie zapomnieć o prawidłowym skonfigurowaniu zapory sieciowej, która powinna przepuszczać transmisje na porcie, który został wskazany w pliku konfiguracyjnym. Na uwadze należy mieć także fakt, iż klasa adresowa, z której będą przydzielane adresy IP użytkownikom łączącym się tunelami VPN, musi być inna niż adresacja używana wewnątrz sieci firmowej. Wynika to z działania protokołu IP, gdyż router VPN nie może mieć takich samych klas IP na dwóch różnych interfejsach (fizycznej karcie eth0 oraz wirtualnej tun0). Routing między sieciami będzie możliwy dzięki opcji push „route 192.168.0.0 255.255.255.0″. Plik konfiguracyjny należy umieścić w głównym katalogu program OpenVPN, a usługę uruchomić poleceniem openvpn –config /etc/ openvpn/plik_konfiguracyjny.conf. Następnie zajmiemy się instalacją i konfiguracją oprogramowania OpenVPN po stronie klienta. Zasada działania programu jest na każdym systemie operacyjnym taka sama, jedyna różnica polega na etapie samej instalacji. Aby zainstalować OpenVPN należy wydać polecenie:
# yum install openvpn
Wszystkie ważne biblioteki zostaną dowiązane automatycznie. Aby zainstalować program w systemie FreeBSD, mamy dwie możliwości. Można pobrać port lub zainstalować sam pakiet. Dla przykładu zainstalujemy program używając opcji port:
# cd /usr/ports/security/openvpn
# configure
# make
# make install
# make clean
Instalacja w systemie Windows jest bajecznie prosta. Program instalacyjny stworzy i skonfiguruje wszystko co potrzebne do prawidłowej i bezkonfliktowej pracy. System zostanie wyposażony w biblioteki OpenSSL, biblioteki LZO, sterownik TUN/TAP oraz oczywiście w sam program OpenVPN. Instalacja w systemie Mac OS X dzięki Tunnelblick jest tak samo prosta jak w systemie z rodziny Windows. Wystarczy pobrać plik z witryny Tunnelblick. Po otwarciu obrazu należy kliknąć dwukrotnie na plik z rozszerzeniem .mpkg. Teraz należy stworzyć plik konfiguracyjny po stronie użytkownika, który będzie klientem VPN. Każdy plik po stronie klienta bez względu na system operacyjny będzie wyglądał identycznie. Przykładowy plik konfiguracyjny programu OpenVPN po stronie klienta przedstawiono na Listingu 6. Do katalogu, w którym zainstalowano program OpenVPN należy przegrać certyfikat oraz klucz prywatny użytkownika, jak również plik konfiguracyjny klienta i certyfikat urzędu CA. W systemie Mac OS X należy jeszcze dokończyć nasze wcześniejsze operacje. Po zakończeniu instalacji (kliknięcie w plik z rozszerzeniem .mpkg), należy przejść do folderu Applications i odnaleźć plik o nazwie Tunnelblick, po czym go uruchomić. Program Tunnelblick poprosi nas o utworzenie pliku konfiguracyjnego i otworzy okno, do którego będziemy mogli skopiować nasze ustawienia. Plik zostanie zapisany w katalogu ~/Library/openvpn. Tutaj także skopiujmy przygotowane pliki kluczy i certyfikatów. Ostatnim krokiem jest odnalezienie w menu ikonki przedstawiającej tunel i kliknąć Connect. Jeśli wszystko zrobiliśmy dobrze program powinno działać prawidłowo, łącząc się automatycznie z naszym serwerem. Aby nawiązać połączenie w systemie Windows, należy kliknąć w ikonę programu w pasku zadań prawym przyciskiem myszy i wybrać opcje Connect. Na ekranie pojawi się okno dialogowe nawiązywania połączenia szyfrowanego z serwerem VPN. Przykładowe okno dialogowe zostało przedstawione na Rysunku 14. Jeśli połączenie zostało poprawnie nawiązane powinien pojawić się wirtualny interfejs oraz możliwość pingowania adresu, który został wpisany w pliku konfiguracyjnym serwera. Wszystko można zaobserwować wpisując w oknie cmd komendę ipconfig / all. Aby wywołać program OpenVPN w systemie Linux, przechodzimy do katalogu, w którym zapisaliśmy plik konfiguracyjny i wydajemy polecenie:
# openvpn plik_konfiguracyjny.ovpn
Jeśli program ma problemy w połączeniu lub w prawidłowej pracy, należy sprawdzić ustawienia ip_forward. Opcja musi być ustawiona na 1. Aby to uczynić musimy wydać polecenie:
# echo 1 > /proc/sys/net/ipv4/ip_
forward
Na koniec, aby wywołać połączenie z klienta system FreeBSD należy wydać polecenie:
# kldload bridge
# kldload if_tap
# openvpn –config plik_
konfiguracyjny.ovpn
Podsumowanie
Dzięki prostemu rozwiązaniu stosowania szyfrowanych tuneli transmisji, ruch sieciowy jest całkowicie niewidoczny dla potencjalnych intruzów podsłuchujących lokalną sieć współczesnej organizacji, co odwzorowuję się znacznie bezpieczniejszą wymianą danych między mobilnymi pracownikami, a odziałem firmy. Zadaniem artykułu było przedstawienie kilku z kilkuset różnych metod jak za pomocą prostych rozwiązań można zwiększyć bezpieczeństwo firmy i zminimalizować utratę poufnych, często strategicznych informacji współczesnego przedsiębiorstwa.
_______________
Daniel Suchocki
Ekspert kryminalistyki informatycznej, jest dyrektorem laboratorium kryminalistyki informatycznej w firmie ProCertiv, uczestnik wielu konferencji na temat bezpieczeństwa, wykładowca tematyki cyberprzestępczości, interesuje się ściśle pojętym bezpieczeństwem systemów głównie z rodziny Linux. Kontakt z autorem: d.suchocki@procertiv.pl
Listing 1. Przykładowa konfiguracja programu VTun po stronie serwera
options {
port 5544;
ifconfig /sbin/ifconfig;
route /sbin/route;
syslog auth;
default {
compress no;
speed 0;
}
home {
type tun;
proto tcp;
stat yes;
pass
up {
ifconfig "%% 200.123.123.32 pointtopoint 200.123.123.33";
program /sbin/arp "-Ds 200.123.123.33 %% pub";
program /sbin/arp/ "-Ds 200.123.123.33 eth0 pub";
route "add -net 10.10.0.0/16 gw 200.123.123.33";
};
down {
program /sbin/arp "-d 200.123.123.33 -i %%";
program /sbin/arp/ "-d 200.123.123.33 -i eth0";
route "del -net 10.10.0.0/16 gw 200.123.123.33";
};
}
Listing 2. Przykładowa konfiguracja programu VTun po stronie klienta
options {
port 5544;
ifconfig /sbin/ifconfig;
route /sbin/route;
default {
compress no;
speed 0;
}
home {
type tun;
proto tcp;
keepalive yes;
pass
up {
ifconfig "%% 200.123.123.33 pointtopoint 200.123.123.32 arp";
route "add gw ";
route "del default";
route "add default gw 200.123.123.32";
};
down {
route "del default";
route "del gw ";
route "add default gw ";
};
}
Listing 3. Przykładowa konfiguracja
programu STunnel po stronie serwera
chroot = /var/run/stunnel
pid = /stunnel.pid
setuid = stunnel
setgid = stunnel
debug = 3
output = /var/log/stunnel.log
[sql]
accept = 12345
connect = 192.168.1.25: 3050
cert = /etc/stunnel/server.pem
CAfile = /etc/stunnel/cacert.pem
verify = 2









































