# haproxy -vv
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <[email protected]>
::
Built with OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
Running on OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
::
SSLでの暗号化には、サーバ側であるHAProxyに電子証明書が必要になります。 また、ロードバランサであるHAProxy以下に設置されるWebサーバの数は複数台になる可能性があるので電子証明書は同一ドメインのすべてのサーバに対応できる「ワイルドカード・サーバ証明書」が望ましいといえます。(ex. *.example.jp)
電子証明書は、セコムやdigicert等の公式認証局(CA)から正式なものを発行してもらうのが一般的です。
ただし、社内システムなどイントラネット内の限定的な環境である場合にはCAでは無く自社で証明書を作成してしまう方法(自己証明書 / オレオレ証明書とも云う)もあります。
ここでは、自己証明書を使って構築していきますが、公開用Webサイトのためのロードバランサであるならば、正式の証明書を入手するようにしてください。
☞ 自己証明書の作成方法
WebロードバランサをSSLに対応させる場合、次の3つの方法が考えられます。
SSLオフロードは、Webサーバとクライアントの間に設置されるロードバランサに電子証明書を付与して、クライアントとロードバランサ間をSSL暗号化します。
ロードバランサとWebサーバ間は、SSLではなく通常のHTTPでのデータのやり取りとなります。
この構成の特徴は。
- SSLの処理がWebサーバから分離され、Webサーバへの負荷が低減できる。
- Webアプリケーション側で、SSL化に伴う検証が必要ない
という特徴があります。 その半面、
- ロードバランサはWebサーバよりも処理能力が高いものの、ロードバランサ側でSSLの処理性能が求められる。(ハードウェアでのSSL暗号化などの検討)
- ロードバランサとWebサーバ間は暗号化されないので、セキュリティ上の懸念となる可能性がある。
SSLオフロードの設定は /etc/haproxy/haproxy.conf の以下の部分を変更します。
::
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend haweb
bind *:80
bind *:443 ssl crt /etc/haproxy/haproxy_server.pem
option forwardfor
default_backend back_web
::
#---------------------------------------------------------------------
backend back_web
# balance roundrobin
balance source
server web1 192.168.10.31:80 check
server web2 192.168.10.32:80 check
server web3 192.168.10.33:80 check
::
SSLブリッジでは、クライアントとロードバランサ間、ロードバランサとWebサーバ間をそれぞれ別のSSLセッションで接続することで、クライアントとWebサーバ間をSSL暗号化します。
この構成の特徴は。
- クライアントとWebサーバ間で暗号化されるので、セキュリティ上の安全性が高い。
という特徴があります。 その半面、
- ロードバランサはWebサーバのセッション維持に注意が必要。(アプリケーションでの動作確認を綿密に行う必要がある)
- SSL暗号化についてはWebサーバの負荷軽減にならない。
SSLブリッジの設定は /etc/haproxy/haproxy.conf の以下の部分を変更します。
::
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend haweb
bind *:80
bind *:443 ssl crt /etc/haproxy/haproxy_server.pem
option forwardfor
default_backend back_web
::
#---------------------------------------------------------------------
backend back_web
# balance roundrobin
balance source
server web1 192.168.10.31:443 check ssl verify none
server web2 192.168.10.32:443 check ssl verify none
server web3 192.168.10.33:443 check ssl verify none
::
SSLパススルーは、ロードバランサではSSLの処理を何も行わずに、そのままWebサーバへと接続させる方式です。SSLセッションは、クライアントとWebサーバ間をSSL暗号化します。
この構成の特徴は。
- クライアントとWebサーバ間で暗号化されるので、セキュリティ上の安全性が高い。
- SSLセッションは容易に維持できる。
という特徴があります。 その半面、
- パケットが暗号化されているため、ロードバランサでURIを使ったアクセス制御はできない。
- X-Forwarded-forヘッダをロードバランサで与えられないため、Webサーバ側ではアクセス元IPアドレスとしてロードバランサのIPしか取得できない。
SSLパススルーの設定は /etc/haproxy/haproxy.conf の以下の部分を変更します。 この設定では、SSLをtcpモードでバックエンドのサーバと接続するようにしています。
::
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend haweb
bind *:80
option forwardfor
default_backend back_web
::
frontend haweb_ssl
bind *:443 ssl crt /etc/haproxy/haproxy_server.pem
mode tcp
option forwardfor
default_backend back_web_ssl
::
#---------------------------------------------------------------------
backend back_web
# balance roundrobin
balance source
server web1 192.168.10.31:80 check
server web2 192.168.10.32:80 check
server web3 192.168.10.33:80 check
::
backend back_web_ssl
# balance roundrobin
balance source
mode tcp
server web1 192.168.10.31:443 check
server web2 192.168.10.32:443 check
server web3 192.168.10.33:443 check
::
参考: