I když by se mohlo zdát, že stunnel do seriálu o tunelování vyloženě patří, není tomu tak. Programy popisované v onom seriálu na jednom konci tunelu data přijmou, přenesou je na druhý konec a tam je zcela nezměněná dopraví k cíli.
Tunel vytvořený stunnelem má ale na jednom konci – buď na vstupu, nebo na výstupu – data zabalená v SSL. Pokud bychom jím chtěli realizovat tunel popsaný v seriálu, potřebovali bychom jednu instanci stunnelu, která data zabalí do SSL a pošle na druhý počítač, a druhou, která data z SSL opět vybalí a dopraví na místo určení. (Nebojte se, i na tento příklad dojde :-)
Stunnel je primárně určen pro přidání SSL šifrování k programům, které jej samy o sobě nepodporují. Pro jisté dva pány podotýkám, že sice většinou pracuje s OpenSSL knihovnou, ale obecně může fungovat i s jinými SSL knihovnami.
Módy stunnelu
Tak jako každý tunel, i stunnel má dva konce. Umístění jednoho se ovládá následovně:
- Je-li zadáno -d bez parametrů nebo není-li zadáno vůbec, bude prvním koncem standardní vstup a výstup příkazu stunnel.
- Je-li zadáno -d [host:]port, bude program poslouchat na zadaném portu. Je-li zadán i host, bude poslouchat na konkrétní IP. Příchozí spojení na tento port bude pak prvním koncem tunelu. Stunnel vytvoří tunel na druhý konec a bude poslouchat dál, takže v tomto módu může obsluhovat i více spojení najednou.
Druhý konec se určuje těmito volbami:
- -r [host:]port – stunnel se spojí na zadaný počítač a port. Není-li počítač zadán, spojí se na localhost.
- -l program [– programname [arg1 arg2 arg3…] ] spustí zadaný program a jeho standardní vstup/výstup budou druhým koncem. Program by měl být určen pro spouštění z inet démona (vstup a výstup nemají vlastnosti terminálu). Pokud programu chceme předat parametry, uvedeme dvě pomlčky, pak ještě jednou jméno programu a pak parametr(y). (To „druhé“ jméno programu je tam proto, že se programům předává jako nultý parametr jejich vlastní jméno. Shell používá jméno, kterým jsme program zavolali, stunnel nám ho umožňuje ovlivnit.)
- -L program [– programname [arg1 arg2 arg3…] ] spustí zadaný program a jeho standardní vstup/výstup budou druhým koncem. Vstup a výstup mají vlastnosti terminálu (inetd v tomto případě zaalokuje pty).
Který konec bude šifrován, se určuje parametrem -c. Pokud je zadán, bude první konec nešifrovaný, pak se data zašifrují a dopraví se na druhý konec. Není-li zadán, bude první konec šifrovaný – bude na něm očekáváno SSL spojení. Data jím přenášená se dešifrují a nešifrovaná dopraví na druhý konec.
Spojení zamozřejmě funguje obousměrně (z druhého konce na první), data tekoucí tímto směrem procházejí přesně opačným procesem než data tekoucí z prvního konce na druhý.
Certifikát
Pro serverový mód (volba -d) je vyžadován certifikát a odpovídající klíč. Ten se čte buď z /etc/ssl/certs/stunnel.pem, nebo se specifikuje pomocí volby -p soubor. Tento jediný soubor obsahuje jak certifikát, tak klíč k němu. Jak získat certifikát a klíč, jste se dozvěděli v seriálu o OpenSSL.
Klíč nesmí být chráněn passfrází. Soubor by měl vypadat takto:
-----BEGIN RSA PRIVATE KEY----- (klíč) -----END RSA PRIVATE KEY----- (prázdný řádek) -----BEGIN CERTIFICATE----- (certifikát) -----END CERTIFICATE----- (prázdný řádek)
Několik příkladů
Chceme-li ověřit funkčnost HTTPS serveru, můžeme zadat například:
stunnel -c -r muj.ssl.server:https
a na jeho vstup zadat:
GET / HTTP/1.0 (prázdný řádek)
Dostaneme HTML stránku.
Funguje to úplně stejně jako:
openssl s_client -connect muj.ssl.server:https
Máme-li pop3 server spustitelný z inet démona, můžeme jej zpřístupnit i přes pop3s následujícím příkazem:
stunnel -d pop3s -l /usr/sbin/pop3d -- pop3d
(Tento příklad předpokládá, že máme certifikát v souboru /etc/ssl/certs/stunnel.pem.) Stunnel se v tomto případě po spuštění odpojí od konzole a běží na pozadí.
Nechceme-li spouštět novou instanci pop3 démona pokaždé, když se někdo připojí, můžeme použít SSL démon v módu přesměrování:
stunnel -d pop3s -r pop3
Stunnel bude poslouchat na portu pop3s. Všechna SSL spojení na tento port budou pokračovat už nešifrovaně na pop3 port.
Nemá-li náš POP3 klient možnost SSL šifrování, můžeme spustit:
stunnel -c -d pop3 -r vzdaleny.pop3s.server:pop3s
Potom si můžeme maily ze vzdáleného pop3s serveru vyzvedávat připojením se na „pop3 server“ na lokálním počítači.
„Opravdový“ tunel
Nyní se dostaneme k tomu, jak pomocí openssl udělat „opravdový“ tunel, jaký byl popisován v seriálu o tunelování. Podívejte se na dva předchozí příklady. Pokud je zkombinujeme (stunnel spustíme na obou počítačích), dostaneme následující konfiguraci:
Na obou koncích tunelu jsou nyní ta samá data protokolu POP3.
Další možnosti
Příkaz stunnel má i další možnosti, z nichž bych vás na některé rád upozornil:
Stunnel standardně loguje svoje hlášky do systémového logu. Pokud tunel ladíme, může se nám hodit zadat parametr -f. Tím budou hlášky vypisovány na chybový výstup (stderr). Tento parametr má ještě jeden efekt: pokud bude program poslouchat na portu, nebude běžet na pozadí, ale zůstane na popředí a je ho možno shodit stiskem CTRL-C.
Jestliže chceme, aby stunnel běžel stále, je vhodné zajistit jeho spouštění a shazování skriptem v /etc/init.d. Stunnel vytváří soubor se svým process id standardně v adresáři /var/run, jméno souboru se odvozuje z parametrů stunnelu. K jeho shození můžeme využít buď tento soubor, nebo můžeme stunnel donutit vytvořit soubor jinde pomocí volby -P soubor/adresář.
Pokud budeme spouštět stunnel jako root, je vhodné jej z bezpečnostních důvodů spustit na jiného uživatele/skupinu. K tomu slouží volby -u uživatel a -g skupina. Výhodou je, že změna UID/GID proběhne až po vytvoření případného socketu, na kterém stunnel poslouchá, takže toto můžeme používat, i pokud má poslouchat na privilegovaném portu.
A nakonec po zadání stunnel -V vypíše stunnel svoji verzi a hlavně výchozí nastavení všech voleb.
To by bylo o stunnelu vše, další podrobnosti naleznete v manuálu. Těším se na shledání u dalšího zajímavého programu.