HAProxy w zastosowaniach - SSL

Fri 11 November 2011 by admin

Najprościej w tym miejscu napisać, że HAProxy SSLa po prostu nie wspiera. Na stronie projektu, krótka wzmianka dlaczego zaniechano wsparcia:

Having SSL in the load balancer itself means that it becomes the bottleneck

Jak sobie zatem poradzić z tematem SSL ?

Remedium na ten problem są rozwiązania, które dostarczą HAProxy odszyfrowany strumień danych. Jednym z takich narzędzi jest popularny stunnel, służący do tunelowania ruchu TCP za pomocą protokołu SSL. Kilka lat wcześniej mocno wykorzystywany jako wsparcie do aplikacji serwerowych, które natywnie nie obsługiwały szyfrowania. W celu dostosowania go do współpracy z HAProxy musimy zaaplikować patch, który ,,nauczy'' stunnel'a podawania w nagłówku HTTP pola X-Forwarded-For. Całość zaś konfiguracji przedstawia się następująco:

[foo.bar.pl]
cert = /etc/pki/stunnel/foo.crt
key = /etc/pki/stunnel/foo.key
accept = 443
connect = <HAProxy_IP>:<HAProxy_Port>
xforwardedfor = yes
TIMEOUTclose = 0

warte wspomnienia jest pole connect, w któym podajemy informację o parametrach połączenia z serwerem HAProxy. Odpowiadająca konfiguracja HAProxy w naprostszej postaci:

frontend ssl <HAProxy_IP>:<HAProxy_Port>
 reqadd HTTPS:\ on
 default_backend www

ukłonem w stronę programistów jest dodanie nagłówka HTTPS, który informuje, że serwowane requesty de facto są zaszyfrowane.  Niestety przy połączeniu z stunnel nie możemy skorzystać z opcji keepalive po stronie klienta.  Dopiero w rozwojowej linii 1.5 otrzymujemy implementacje protokołu PROXY, który umożliwia m.in.

The new PROXY protocol was implemented in order to permit stunnel to forward transport-level information to haproxy, such as the protocol, source and destinations of an incoming connection, so that haproxy can make use of that everywhere internally (acls, logs, transparent, ...) instead of stunnel's address. The main advantage over the x-forwarded-for patch is that it now supports keep-alive and is not limited to HTTP anymore. When combined with the UNIX socket, it can make haproxy and stunnel integrate seamlessly and reliably, provided that this patch is applied to stunnel.

Specyfikacja protokołu PROXY:

http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt

Alternatywą dla rozwiązania stunnel jest narzędzie stud, projekt ściślej związany z HAProxy choć nie tak dojrzały jak stunnel. Więcej informacji:

https://github.com/bumptech/stud

Ciekawe zestawianie stunnel vs stud pod kątem wydajności znajduję się:

http://blog.exceliance.fr/2011/09/16/benchmarking_ssl_performance/

Oba rozwiązania zarówno stunnel jak i stud posiadają mechanizmy umożliwiające łatwe skalowanie poprzez dodawanie kolejnych instancji. Czasochłonne operacje ustanawiania sesji SSL (handshaking), której wynikiem jest ustalony klucz symetryczny są przechowywane shared cache, która dodatkowo jest replikowana pomiędzy instancjami stud lub w przypadku stunnel'a pomiędzy stunnel'em a sessiond.


Comments