• email
  • facebook
  • linkedin
  • google+
  • pinteres

Stunnel hogyan

Az alábbiakban egy példán keresztül mutatom be, hogyan lehet Stunnelt, azaz titkosított adat csatornát beállítani két gép között, szerver és kliens oldalon is tanúsítvánnyal. Az stunnel remek eszköz, hogy egyik gépünkön, például egy szerveren található portot titkosítva hozzáférhetővé tegyünk egy másik gép számára, anélkül, hogy a nagyvilág felé is láthatóvá kellene tenni azt.

A példa a PostgreSQL 5432-es portját teszi elérhetővé a 12000-es porton. Ehhez készítünk egy kliens tanúsítványt is egy "kliensgep" nevű gép azonosítására. A leírás lépései Ubuntu Dapperen lettek kipróbálva, de más disztribúción is hasonlóképp kell működjenek kisebb vagy leginkább semmilyen átalakítással.

1.   Szerver oldal

Telepítendő csomag:

  • stunnel

Ha nincs még CA legfelsőbb szintű tanúsítványunk, akkor első lépésként azt kell elkészítenünk:

mkdir /opt/CA
cd /opt/CA

openssl genrsa -des3 -out nir.key 2048

openssl req -new -x509 -days 365 -key nir.key -out nir.crt

  Enter pass phrase for nir.key:
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [AU]:HU
  State or Province Name (full name) [Some-State]:.
  Locality Name (eg, city) []:Budapest
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:NiR Informatikai Megoldások Kft.
  Organizational Unit Name (eg, section) []:NiR Certificate Authority
  Common Name (eg, YOUR name) []:NiR Kft CA
  Email Address []:hostmaster@nir.hu

Ezt követően készítjük el az stunnel szerveroldali kulcsot, amit az előbb készített kulcs és tanúsítvány segítségével írunk alá:

cd /opt/CA

openssl genrsa -out stunnel.key 2048

openssl req -new -key stunnel.key -out stunnel.csr
  ...
  Organizational Unit Name (eg, section) [Software Development Team]:NiR Web Services
  Common Name (eg, YOUR name) []:mester.nir.hu
  Email Address []:hostmaster@nir.hu
  ...

openssl x509 -req -in stunnel.csr -out stunnel.crt -sha1 -CA nir.crt -CAkey nir.key -CAcreateserial -days 365

cat stunnel.key stunnel.crt > stunnel.pem
openssl gendh >> stunnel.pem

Ha kész, tesztelhetjük is!

A teszthez szerveroldalon a következőképp kell az stunnel-t indítani:

stunnel -p stunnel.pem -d 12000 -r 127.0.0.1:5432

A kliens oldalon pedig így:

stunnel -v2 -A nir.crt -c -d 127.0.0.1:5432 -r mester.nir.hu:12000

Majd próbáljuk ki, a kliensen látjuk-e a postgresql portot:

psql --host localhost --port 5432 template1 postgres

Persze előtte ne feledjük a tűzfalon kiengedni a 12000-es portot, de ésszel, csak kliensgép IP-jére!

2.   Kliens oldal

Telepítendő csomag:

  • stunnel

Következhet a klienstanúsítvány elkészítése és telepítése. Ha a majdani felhasználótól kapunk publikus kulcsot, akkor a készítés kihagyható, és csak be kell másolnunk a kapott tanúsítványt a megbízott cert-eket tartalmazó könyvtárba, majd linkelni a hash-ét. Ha ilyet nem kapunk, akkor nekünk kell elkészíteni, legegyszerűbben pl. az alábbi módon:

openssl req -x509 -newkey rsa:2048 -keyout kliensgep_key.pem -out kliensgep_cert.pem -days 365

  Country Name (2 letter code) [HU]:
  State or Province Name (full name) [.]:
  Locality Name (eg, city) [Budapest]:
  Organization Name (eg, company) [NiR Informatikai Megoldások Kft.]:
  Organizational Unit Name (eg, section) [Software Development Team]:
  Common Name (eg, YOUR name) []:kliensgep.nir.hu
  Email Address []:hostmaster@nir.hu

Csinálunk egy könyvtárat, ahova a szerveroldali tanúsítvány és a megbízott kliens cert-ek kerülnek, majd másoljuk be a megfelelő fájlokat, és linkeljük a kliens tanúsítvány hash-ét:

mkdir -p /etc/ssl/stunnel/trusted
cp stunnel.pem /etc/ssl/stunnel
cp kliensgep_cert.pem /etc/ssl/stunnel/trusted

cd /etc/ssl/stunnel/trusted

/usr/lib/ssl/misc/c_hash kliensgep_cert.pem
  37a5cd9a.0 => kliensgep_cert.pem

ln -s kliensgep_cert.pem 37a5cd9a.0

Végül a kliensoldali kulcsnak és tanúsítványnak elkészítjük az egybeillesztett változatát, erre lesz majd szükség a másik oldalon:

cat kliensgep_key.pem kliensgep_cert.pem > kliensgep_full.pem

Ezzel a fájllal egyetlen kényelmetlenség lesz: jelszóval védett, így minden indításnál meg kell adjuk majd a .key fájl létrehozásakor megadott jelszót. Ha ez nem szeretnénk, akkor még az iménti lépés előtt hozzunk létre a kulcsból egy jelszóval nem védett változatot:

cp kliensgep_key.pem kliensgep_key.pem.bak
openssl rsa -in kliensgep_key.pem.bak -out kliensgep_key.pem

3.   Indítás Stunnellel 3-al

Ezek után csak el kell indítanunk az stunnel-eket.

A szerveren:

stunnel -v3 -a /etc/ssl/stunnel/trusted -p /etc/ssl/stunnel/stunnel.pem -d 12000 -r 127.0.0.1:5432

A kliensen:

stunnel -v2 -A nir.crt -p kliensgep_full.pem -c  -d 127.0.0.1:5432 -r mester.nir.hu:12000

A /etc/init.d/stunnel szkripttel kényelmesebben indíthatjuk majd. Erre egy példa:

#!/bin/sh
STUNNEL="/usr/sbin/stunnel"

case "$1" in
  start)
        echo -n "Starting stunnel services: "
        stunnel -v3 -a /etc/ssl/stunnel/trusted -p /etc/ssl/stunnel/stunnel.pem -d 9000 -r 127.0.0.1:5432 -D warning
          #-o /var/log/stunnel.log
        echo
        ;;
  stop)
        echo -n "Stopping stunnel services: "
        killall `basename ${STUNNEL}`
        echo
        ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

exit 0

Ezt szolgáltatásként is telepíthetjük:

update-rc.d stunnel defaults 80 15

Ha már nem kéne, így törölhetjük:

update-rc.d -f stunnel remove

4.   Indítás Stunnel 4-el

A fenti módszernél kényelmesebb, ha 4-es Stunnelt használunk.

Telepítendő csomag:

  • stunnel4

Ez a csomag indító szkriptet is feltesz, így azzal sem kell foglalkoznunk. A konfiguráláshoz pedig a /etc/stunnel/ használjuk majd -- ebbe kerülnek az egyes stunneljeinkhez való konfigurációs fájlok, amelyből egy mintát maga a telepítő is felrak. Több stunnel esetén tehát több fájlunk lehet, *.conf kiterjesztéssel, ezek mindegyike külön processzként futó stunnel példány beállítására szolgál.

Konfigurációs fájlunk a szerver oldalon így fog festeni (a tanúsítvány fájlokat a korábbi beállítás szerinti helyen hagytam, az egyszerűség kedvéért):

cert = /etc/ssl/stunnel/stunnel.pem

chroot = /var/run/stunnel4/
setuid = stunnel4
setgid = stunnel4
pid = /stunnel4.pid

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

verify = 3
CAfile = /etc/ssl/stunnel/trusted/kliensgep_cert.pem

[psql]
accept  = 12000
connect = 5432

Ezzel a módszerrel a hash elkészítésének lépését kihagyhatjuk.

Trükköznünk akkor kell, ha több tanúsítványt szeretnénk egy port (egy konfiguráción keresztüli) eléréséhez biztosítani. A stunnel alapértelmezés szerint chroot-ol, azaz saját zárt területtel rendelkezik a fájlrendszeren. A konfigurációs fájl CApath elemének beállításával adhatjuk meg, hogy hol tartjuk a megbízható tanúsítványokat és a hash-eiket (mint a előző módszernél a /etc/ssl/stunnel/trusted könyvtárban). Viszont, és itt jön a lényeg, a CApath értéke relatív a chroot-hoz. Azaz, ha annak az értéke /var/run/stunnel4/, akkor abba át kell másolnunk a trusted könyvtárat, és így megadnunk a CApath helyét. Például:

CApath = /var/run/stunnel4/trusted

A beállításokat megadó fájl a kliensoldalon:

cert = /etc/ssl/mester/defiant_stunnel.pem
;esetleg:
sslVersion = SSLv3

chroot = /var/run/stunnel4/
setuid = stunnel4
setgid = stunnel4
pid = /stunnel4.pid

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

client = yes

CAfile = /etc/ssl/mester/nir.crt

[psql]
accept  = 127.0.0.1:5432
connect = mester.nir.hu:12000

Ha mindezzel megvagyunk, az elindításhoz és leállításhoz innentől kezdve használhatjuk a /etc/init.d/stunnel4 indítószkriptet. Ehhez még egy apróságot kell elvégeznünk: telepítés után stunnel indítása még ki van kapcsolva, hogy a szkript működjön ehhez a /etc/default/stunnel4 fájlban állítsuk át az ENABLED értéket 1-re.

Új konfigurációs fájlokat létrehozva új stunneleket definiálhatunk, a szkript ezeket is elindítja majd. Ilyenkor azonban figyeljünk arra, hogy eltérő PID fájlokat adjunk meg.