最終更新日: 2019年6月16日

WebロードバランサのSSL対応


1. environment / 環境

HAProxyがSSL対応としてコンパイルされている必要があります。 最近のパッケージであればSSL対応になっている筈です。 確認は次のコマンドで行えます。
# haproxy -vv
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org> 
 ::
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

 ::


2. Certificate / 電子証明書

SSLでの暗号化には、サーバ側であるHAProxyに電子証明書が必要になります。 また、ロードバランサであるHAProxy以下に設置されるWebサーバの数は複数台になる可能性があるので電子証明書は同一ドメインのすべてのサーバに対応できる「ワイルドカード・サーバ証明書」が望ましいといえます。(ex. *.example.jp)
電子証明書は、セコムdigicert等の公式認証局(CA)から正式なものを発行してもらうのが一般的です。
ただし、社内システムなどイントラネット内の限定的な環境である場合にはCAでは無く自社で証明書を作成してしまう方法(自己証明書 / オレオレ証明書とも云う)もあります。
ここでは、自己証明書を使って構築していきますが、公開用Webサイトのためのロードバランサであるならば、正式の証明書を入手するようにしてください。
自己証明書の作成方法

3. SSLの設定

WebロードバランサをSSLに対応させる場合、次の3つの方法が考えられます。

(1). SSLオフロード

SSLオフロードは、Webサーバとクライアントの間に設置されるロードバランサに電子証明書を付与して、クライアントとロードバランサ間をSSL暗号化します。
ロードバランサとWebサーバ間は、SSLではなく通常のHTTPでのデータのやり取りとなります。
この構成の特徴は。
という特徴があります。 その半面、
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
 ::

(2). SSLブリッジ

SSLブリッジでは、クライアントとロードバランサ間、ロードバランサとWebサーバ間をそれぞれ別のSSLセッションで接続することで、クライアントとWebサーバ間をSSL暗号化します。
この構成の特徴は。
という特徴があります。 その半面、
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
 ::


(3). SSLパススルー

SSLパススルーは、ロードバランサではSSLの処理を何も行わずに、そのままWebサーバへと接続させる方式です。SSLセッションは、クライアントとWebサーバ間をSSL暗号化します。
この構成の特徴は。
という特徴があります。 その半面、
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
 ::

参考: