web-dev-qa-db-ja.com

ssl aclを使用したhaproxyマルチホスト

それぞれの独自のssl証明書を持つサーバーの複数のホストに対してhaproxy(1.5dev19)でACLルールを使用するにはどうすればよいですか?

1つのIPアドレスにすべて複数のドメインを持つ3つのバックエンドがあります。

nodejs(http/https/ws/wss)

nginx(http/https)(Apacheのリバースプロキシ)

Apache(http)

私はそれらの前にhaproxyを置き、それがssl接続を提供できるようにしたいと思います。 haproxy aclでそれは可能ですか、それともhaproxyの前でスタッドのようなものを使用する必要がありますか?

何かのようなもの:

frontend http-in
    bind *:80

    acl Host_domain1 hdr(Host) -i domain1.lt
    use_backend nginx_web_http if Host_domain1

frontend http-in
    bind *:443

    acl Host_domain1 hdr(Host) -i domain1.lt
    use_backend nginx_web_https if Host_domain1

backend nginx_web_https
    mode http
    ssl crt /etc/ssl/domain1/ crt ./certs/ prefer-server-cipher
    option httplog
    option httpclose
    server nginx 192.168.2.101:8080 check

backend nginx_web_http
    mode http
    option httplog
    option httpclose
    server nginx 192.168.2.101:8080 check
6
zajca

Haproxyが着信リクエストごとにバックエンドごとのSSL証明書を指定できるとは思わない。むしろ、複数のドメイン名(SNI)を可能にする結合された証明書が必要になる。

SNIをhaproxyで使用するためのガイドは次のとおりです。実際には、すべての証明書はバックエンドインスタンスではなくhaproxyサーバーによってホストされています。 https://trick77.com/haproxy-and-sni-based-ssl-offloading- with-intermediate-ca /

このセクションの最後にある例も参照してください。 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-use-server

3
Mike Fiedler

実際にこれをお使いのバージョンのhaproxyで行うことができます。私はそれについてブログに書いた ここ

次に例を示します。

global
   log 127.0.0.1  local0
   log 127.0.0.1  local1 notice
   #log loghost   local0 info
   maxconn 4096
   # chroot /usr/share/haproxy
   user haproxy
   group haproxy
   daemon
   #debug
   #quiet

defaults
   log   global
   mode  http
   option   httplog
   option   dontlognull
   retries  3
   option redispatch
   maxconn  2000
   contimeout  5000
   clitimeout  50000
   srvtimeout  50000

# Host HA-Proxy web stats on Port 3306 (that will confuse those script kiddies)
listen HAProxy-Statistics *:3306
    mode http
    option httplog
    option httpclose
    stats enable
    stats uri /haproxy?stats
    stats refresh 20s
    stats show-node
    stats show-legends
    stats show-desc Workaround haproxy for SSL
    stats auth admin:ifIruledTheWorld
    stats admin if TRUE

frontend ssl_relay 192.168.128.21:443
    # this only works with 1.5 haproxy
    mode tcp
    option tcplog
    option socket-stats
    # option nolinger
    maxconn  300

    # use tcp content accepts to detects ssl client and server hello.
    # acl clienthello req_ssl_hello_type 1 -> seems to not work

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    use_backend ssl_testdomain_prod if { req_ssl_sni -i www.testdomain.nl }
    use_backend ssl_testdomain_stag if { req_ssl_sni -i test.testdomain.nl }

    default_backend ssl_testdomain_stag

backend ssl_testdomain_stag
   mode tcp
   #option nolinger
   option tcplog
   balance roundrobin
   hash-type consistent
   option srvtcpka

    # maximum SSL session ID length is 32 bytes.
    stick-table type binary len 32 size 30k expire 30m

    # make sure we cover type 1 (fallback)
    acl clienthello req_ssl_hello_type 1
    acl serverhello rep_ssl_hello_type 2

    # use tcp content accepts to detects ssl client and server hello.
    tcp-request inspect-delay 5s
    tcp-request content accept if clienthello

    # no timeout on response inspect delay by default.
    tcp-response content accept if serverhello

    # SSL session ID (SSLID) may be present on a client or server hello.
    # Its length is coded on 1 byte at offset 43 and its value starts
    # at offset 44.
    # Match and learn on request if client hello.
    stick on payload_lv(43,1) if clienthello

    # Learn on response if server hello.
    stick store-response payload_lv(43,1) if serverhello

    #option ssl-hello-chk

    server x_testdomain_stag 123.123.123.123:443


backend ssl_testdomain_prod
   mode tcp
   #option nolinger
   option tcplog
   balance roundrobin
   hash-type consistent
   option srvtcpka

    # maximum SSL session ID length is 32 bytes.
    stick-table type binary len 32 size 30k expire 30m

    # make sure we cover type 1 (fallback)
    acl clienthello req_ssl_hello_type 1
    acl serverhello rep_ssl_hello_type 2

    # use tcp content accepts to detects ssl client and server hello.
    tcp-request inspect-delay 5s
    tcp-request content accept if clienthello

    # no timeout on response inspect delay by default.
    tcp-response content accept if serverhello

    # SSL session ID (SSLID) may be present on a client or server hello.
    # Its length is coded on 1 byte at offset 43 and its value starts
    # at offset 44.
    # Match and learn on request if client hello.
    stick on payload_lv(43,1) if clienthello

    # Learn on response if server hello.
    stick store-response payload_lv(43,1) if serverhello

    #option ssl-hello-chk

    server x_testdomain_prod 123.123.111.111:443

この例は、WebサーバーバックエンドでSSLを終了することを意味します。私はhaproxy sslの終了でこれを実行しようとしていません。

それがあなたの望むものであれば、おそらくこの例はそれを機能させるのに役立ちます。

use_backendの代わりにuse_serverを使用する別の例があります here

8
Glenn Plas