Tunelowanie poczty (stunnel)
wersja 1.1
 

Spis treści

ChangeLog

1. W czym tkwi problem ?
2. Czy istnieje rozwiązanie ?
3. Podstawy

4. Co będziemy potrzebować
5. OpenSSL
6. Stunnel

7. Składamy wszystko do kupy
8. Odbiór poczty
9. Wysylanie poczty

Posłowie


ChangeLog

Zmiany od wersji 1.0:
- uaktualnienie dla wersji 4.xx stunnel, drobne poprawki


1. W czym tkwi problem ?

Hmmm... Skoro czytasz ten dokument, mam nadzieję, że nie muszę
tego wyjaśniać. Jeśli jednak tak nie jest, oto krótkie wprowadzenie:
za każdym razem, gdy odbierasz swoją pocztę z serwera, twoje hasło
oraz treść samego listu przesyłana jest do twojego komputera w
postaci.... tak, tak, niezaszyfrowanej. Po kabelku lecą po kolei
literki twojego hasła a następnie cały dokument. Zdziwiony ? Mam
nadzieję, że nie. Tego, co wynika z powyższego, nie muszę wyjaśniać.
Napiszę tylko, że w Sieci roi się od programów stworzonych tylko w
jednym celu: podsłuchiwanie. Program taki zainstalować można na
praktycznie każdym komputerze w sieci...
A od tego krok do nieszczęścia.


2. Czy istnieje rozwiązanie ?

Gdyby go nie było, nie miałbym o czym pisać. Prawdę mówiąc istnieje
kilka potencjalnych rozwiązań tego problemu i wszystkie one mają
zarówno swoje zalety, jak i wady. I tak na przykład weźmy protokół
POP3. Posiada on rozszerzenia, takie jak APOP czy Kerberos.
Jeśli chodzi o APOP, to krążą o nim nieciekawe opinie - jest to słabe
zabezpieczenie, które dodatkowo wymaga, aby zarówno nasz klient poczty
jak i serwer, z którym się łączy, także potrafiły go używać. Przykładem
serwera z "wbudowanym" APOPem jest SolidPOP3d, przykładowym klientem
jest natomiast Eudora.

Rozwiązanie, które tutaj przedstawiam wydaje się być
nalepszym obecnie sposobem zabezpieczenia.


3. Podstawy

Na czym polega tunelowanie ? Pisząc w skrócie, polega to na tym, że
twój klient poczty (np. Outlook Express :) komunikuje się z serwerem
poczty nie bezpośrednio, lecz poprzez bezpieczny protokół SSL.
Inaczej. Zamiast KOMPUTER<---->SERWER mamy KOMPUTER<--ssl-->SERWER.
Jeszcze inaczej: SSL jest protokołem, który leży w warstwie pomiędzy
aplikacjami (takimi jak np. telnet) a protokołem TCP/IP. Sam klient
poczty "nie zdaje sobie sprawy" z tego, że po drodze do serwera
cała informacja jest szyfrowana.

Może teraz parę słów o SSL. Jest to protokół, który zapewnia szyfrowanie
danych i uwierzytelnia serwery biorące udział w połączenniu TCP/IP.
Jako ciekawostkę dodam, że SSL dokonuje kompresji danych przed ich
zaszyfrowaniem.

W pracy tej opisuję, jak za pomocą SSL utworzyć szyfrowane połączenie
do odbioru poczty między klientem a serwerem. Zakładam, że naszym
serwerm poczty jest Linux (pop3 lub imap) a klientami, które z niego
korzystają są komputery M$ Windoze z programem Outlook Express.
Celem jest takie skonfigurowanie naszego serwerka, aby hasło osoby
odbierającej pocztę oraz sam dokument leciał po sieci w postaci
zaszyfrowanej. Teraz, gdy wszystko jest jasne, możemy zaczynać.


4. Co będziemy potrzebować

Hmm... W sumie potrzebne będą następujące rzeczy:
* OpenSSL (www.openssl.org)
* Stunnel (www.stunnel.org)
* Uprawnienia roota (we własnym zakresie :)
* Odrobina cierpliwości i zawziętości
* Podstawowa wiedza na temat Linuxa

O ile o trzy ostatnie rzeczy musisz zadbać sam, reszta dostępna jest
w Sieci. Za friko. Dlatego powienieneś ściągnąć ostatnie wersje ww.
programów. Poniżej podaje, w miarę dokładnie, etapy instalacji.
Powinienem jeszcze wyjaśnić, że poniższy opis dotyczy instalacji na
Linuxie Slackware, z kodów źródłowych (.tar.gz). Zwróć szczególną
uwagę na ścieżki dostępów, gdyż mogą one być u Ciebie trochę inne.
Oczywiście zmieniaj je na bieżąco.

I jeszcze jedna, naprawdę ważna uwaga. Jeśli po drodze coś nie zadziała,
nie idź dalej, dopóki problemu nie rozwiążesz.

Aby poskładać to wszystko u siebie do kupy, siedziałem... trzy dni.
Otóż dokumenty jak to zrobić, które ściągnąłem z Sieci znacznie różniły
się od siebie, w każdym brakowało czegoś istotnego. To jest główny powód, dla
którego napisałem tą pracę - mam nadzieję, że nie będziesz się z tym
męczył tak, jak ja. A teraz się uśmiechnij - ostatni raz ;)


5. OpenSSL

Po kolei. Najpierw instalujemy i konfigurujemy OpenSSL.
Dobra, jedziemy:

* ściągasz sobie Openssl....tar.gz. Najlepiej ostatnią wersję.

* rozpakowujesz ją, kompilujesz i instalujesz. Nie wiem dokładnie,
czy ma on jakieś szczególne wymagania co do bibliotek itp, bo
u mnie poszło to bez problemu. Jakby coś nie grało, rzuć okiem
do dokumentacji. Tak więc po rozpakowaniu w katalogu openssl:
./config
make
make test
make install

* u mnie (domyślnie) zainstalowało się w /usr/local/ssl.
Tam, w podkatalogu bin, znajduje się plik openssl. Należy wprowadzić
do zmiennej systemowej $PATH ścieżkę do tego podkatalogu. Ja to
zrobiłem edytując /etc/profile:
PATH=........:/usr/local/ssl/bin:..........
Nie wiem, czy nie trzeba się wylogować i zalogować, żeby toto zaczęło
działać. W każdym razie po ponownym zalogowaniu, gdziekolwiek byś
nie był, wpisujesz: opens [teraz naciskasz kilka razy tabulator] i jak
wyrzuci m.in. openssl, będzie o.k.

* do ścieżek z bibliotekami, trzba dopisać te ssl'a. Czyli:
edycja pliku /etc/ld.so.conf i dopisujesz linijkę:
/usr/local/ssl/lib
Zapisujesz zmiany i jako root wydajesz polecenie: ldconfig
Teraz jest ok. Do tej pory nie powinno być problemu.

* Dobra, teraz trzeba wygenerować naszemu komputerowi podstawowy
certyfikat, którym możemy podpisywać, uwierzytelniać inne
certyfikaty. Wybacz, jeśli się zamotałem, ale każdy normalny certyfikat
(czyli użytkowy: np. serwer pop3) musi być podpisany nienormalnym :)
certyfikatem, który zaraz sobie wygenerujemy.

Wchodzisz do /usr/local/ssl/misc/
Chwilowe odejście od tematu (ale i tak to zrób):
Żeby później, jak będziesz podpisywał certyfikaty np. dla serwerów
www, Ineternet Explorer się nie burzył, edytujesz plik CA.sh
i poprawiasz jedną z pierwszych linijek:
DAYS="-days 365"
na:
DAYS="-days 1825"
Dobra, zapiszujesz zmiany. Teraz możesz wygenerować swój klucz:
./CA.sh -newca
Wpisujesz mu dane użytkownika, komputera i tak dalej.

Na koniec hasło, które chroni twój klucz. Musisz je zapamiętać.
Teraz w katalogu /usr/local/ssl/misc/demoCA/ powstały:
cacert.pem - Twój certyfikat
a w jego podkatalogu private/:
cakey.pem - Twój klucz prywatny
Dobra, z ssl to by było na tyle. Na razie...


6. Stunnel

* Ściągasz, rozpakowujesz i:
./configure --sysconfdir=/etc
make
make install
Mam nadzieję, że nie będziesz miał z tym problemu.
Prawdziwe piekło rozpęta się teraz...

* Tam, gdzie rozpakowałeś stunnel, w podkatalogu tools/ znajduje sie plik:
stunnel.cnf
Kopiujesz go do /usr/local/ssl/certs/
Na jego podstawie będzie wygenerowany certyfikat dla stunnela.
Teraz wchodzisz tam i piszesz:
openssl req -new -nodes -out req.pem -keyout key.pem -config stunnel.cnf
Wpisujemy jeszcze raz odpowiednie dane gdy zapyta: najważniejsze jest to,
żeby w miejscu gdzie pyta o FQDN (Common Name) wpisać mu DNSową nazwę
Twojego serwera pocztowego, np. poczta.serwer.pl

* Utworzył pliki: key.pem (dajesz mu `chmod 0600 key.pem`).
Drugi plik to req.pem i jest on wykorzystany do podpisania key.pem.

* Kopiujemy req.pem do /usr/local/ssl/misc/, ale zapisujemy go jako
newreq.pem. Teraz tam wchodzisz i wydajesz polecenie:
./CA.sh -sign
Teraz go podpisze i zapyta o hasło.
Powstanie plik: newcert.pem
Dobra. Mamy podpisany certyfikat.
Jeśli wytrwałeś do tego momentu, jesteś wielki. Już niedługo koniec.

* Przenosimy newcert.pem z powrotem do /usr/local/ssl/certs/.
Tworzymy plik pusty, o nazwie: stunnel.pem (np. touch stunnel.pem)
i dajemy mu chmod 0600. Jesteśmy w /usr/local/ssl/certs.
Teraz:
cat key.pem >> stunnel.pem
echo "" >> stunnel.pem
cat newcert.pem >> stunnel.pem
Zostawiamy tylko plik stunnel.pem, pozostałe z nich kasujemy.
Dobra, najgorsze mamy za sobą. Teraz będzie z górki.


7. Składamy wszystko do kupy

Jak to wszystko zmusić do działania ? Ano tak:
- do pliku /etc/services dopisujesz:

pop3s 995/tcp
imaps 993/tcp

i zapisujesz zmiany. Jeśli już tam jest taki wpis, nie robisz nic.

Teraz poprzenosimy trochę plików a następnie napiszemy sobie od
podstaw plik stunnel.conf.
  • najpierw plik stunnel.pem (przed chwilą go stworzyłeś) przenosisz
    do /etc/stunnel/
    mv /usr/local/ssl/certs/stunnel.pem /etc/stunnel/
  • następnie tworzysz katalog /var/run/stunnel/ oraz nadajesz mu
    prawa dla usera nobody i grupy nogroup
    mkdir /var/run/stunnel
    chown nobody.nogroup /var/run/stunnel/
  • na końcu kopiujesz swój plik CA do /etc/stunnel
    cp /usr/local/ssl/misc/demoCA/cacert.pem /etc/stunnel/
Teraz jesteś gotowy, aby napisać swój plik stunnel.conf. Zrobisz
to od podstaw a przy okazji wyjaśnią się rzeczy, które przed chwilą
wykonałeś. Jedziemy:

Na początek przechodzisz do /etc/stunnel/ i tworzysz pusty
plik stunnel.conf:
cd /etc/stunnel/
touch stunnel.conf


Umieszczasz w nim następujące rzeczy (plik ten może zawierać komentarze
rozpoczynające się od # (hash), więc od razu wyjaśniam co jest do czego):

# najpierw plik zawierający certyfikat CA:
CAfile = /etc/stunnel/cacert.pem

# teraz Twój plik z kluczem dla stunnel
cert = /etc/stunnel/stunnel.pem

# włączamy logowanie (przynajmniej na początek) dla naszego programu
debug = 7
output = /var/log/stunnel.log

# potem katalog, w którym zostanie "zamknięty" stunnel (chroot)
chroot = /var/run/stunnel/

# następnie plik, w którym trzymany będzie PID programu:
# jest to ścieżka względna - do chroot (poprzedniego parametru):
pid = /stunnel.pid

# następnie użytkownik i grupa na prawach kogo działać będzie stunnel
setuid = nobody
setgid = nogroup

To jest koniec konfiguracji "głównej". Zaraz dodamy usługi, a teraz parę
słów wyjaśnień nt. chroot. Otóż program stunnel uruchamia się w swoim
własnym, "wirtualnym" systemie plików. Nawet gdyby w programie została
znaleziona dziura, intruz utknie w /var/run/stunnel/, gdyż ten katalog
będzie widziany przez stunnel jako / (root). Dodatkowo program działa jako
użytkownik nobody co dodatkowo osłabi potencjalnego napastnika.

Dobra, wracamy do edycji stunnel.conf i dodajemy bezpieczny
odbiór poczty - POP3s i IMAPs od razu (możesz dodać tylko jeden
jeśli Twój serwer nie używa dwóch):

[pop3s]
accept = 995
connect = 110

[imaps]
accept = 993
connect = 143

Tutaj nie ma co wyjaśniać - w nawiasie jest nazwa usługi z /etc/services,
accept to port, na którym stunnel nadsłuchuje dla niej a connect to
właściwy port, dla którego robi tunelowanie.

Przypominam, że POP3/IMAP powinny działać normalnie na Twoim serwerku.
A zaraz będą działać dodatkowo jako POP3s i IMAPs...
A teraz chwila prawdy - uruchomienie stunnela. Po prostu
wpisz (jako root) polecenie: stunnel
I od razu obejrzyj sobie /var/log/stunnel.log - ten właśnie plik
odpowie na (prawie) wszystkie Twoje pytania.
Jeśli wszystko jest ok, po wydaniu polecenia netstat -a powinieneś
zobaczyć oczekujące na połączenie odpowiednie porty (995/993).

Jeszcze raz powtarzam: plik z logami odpowie na Twoje pytania.


8. Odbiór poczty

Chyba już czas na to, aby tą całą machinę wprawić w ruch...
Ale trzasnąłem gadkę :). Dobra. Sprawa wygląda tak:
Napiszę tutaj o konfiguracji Outlooka, który potrafi dogadać się
poprzez SSL. Tutaj oczywista uwaga: jeśli używasz innego programu
do odbioru poczty (to znaczy twoi użytkownicy. Od początku nie
podejrzewałem Cię o używanie M$ Windoze), musisz sprawdzić czy umożliwia
on odbiór poczty przez SSL. Nie wszystkie to potrafią... Wracamy do Outlooka:

* jeśli komputery odbierały do tej pory pocztę przez nieszyfrowaną, wystarczy
zmienić tylko jedną rzecz:
Tools-->Accounts-->Mail-->Properities
i klikasz na zakładce "Advanced" i zaznaczasz tam
Secure SSL Connection. Znajdziesz to.

* jeśli nie odbierały poczty, to konfigurujesz nowe konto normalnie,
a na koniec zazanczasz to, co napisalem wyżej.


9. Wysyłanie poczty

Na początek podziękowania dla Zbyszka Kosno, który zaproponował mi
dodanie tego punktu do niniejszej pracy. Muszę się przyznać, że
nie miałem okazji tego wypróbować. Dostałem jednak potwierdzenie od
SzAmO (thx!), że wszystko działa jak należy. Oto opis:
Do pliku /etc/services dopisujesz:

ssmtp 465/tcp

i zapisujesz zmiany.
Aby umożliwić zaszyfrowane przesłanie poczty na serwer
do /etc/stunnel/stunnel.conf należy dopisać:

[ssmtp]
accept = 465
connect = 25


Pozostaje tylko w Outlooku, w miejscu opisanym wyżej, dodatkowo postwić
"ptaszek" przy szyfrowanym wysyłaniu poczty (w razie potrzeby wpisać port 465).

No i wypadałoby wywołanie stunnel wrzucić do jakiegoś pliku startowego...


Posłowie

Jest to pierwsza wersja tego dokumentu i zawiera pewnie
jakieś błędy/niedoróbki/potknięcia itp. Będę bardzo wdzięczny
za wszelkie uwagi, komentarze, poprawki, wyrazy wdzięczności.
Z góry przepraszam za powyższe i mam nadzieję, że będziecie mnie
informować w których miejscach coś nie gra.
Jako (częściowe) wytłumaczenie przedstawiam fakt, że większość tej
pracy powstawała w późnych godzinach nocnych.

Ostatnia wersja tego dokumentu znajduje się pod niżej wymienionym adresem.
Kontakt ze mną: linio@terramail.pl
Wesprzyj finansowo autora - kliknij tutaj


 
===============================
Henryk Liniowski, Poznań 2002
http://linio.terramail.pl
===============================