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.




