HAProxy в качестве обратного прокси-сервера для бэкэнда, уже включенного ssl, и терминатор SSL для бэкэнда, доступного через порт 80

У меня 4 сервера:

  • proxy_server,
  • $ BK_SERVER_001,
  • $ BK_SERVER_002 и
  • $ BK_SERVER_003

«proxy_server» имеет только Сервис с поддержкой HAProxy с этой конфигурацией: (см. строки, помеченные как ВАРИАНТ 1 И ВАРИАНТ 2)

# StackOverflow
global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3

defaults
        timeout connect 10s
        timeout client 30s
        timeout server 30s
    log global
    mode    http
    option  httplog
    option  dontlognull

# ***************** port 80 defs ************
frontend http_in
        mode http
        option httplog
        bind *:80       
        option forwardfor

        acl host_goose hdr(host) -i     www.example.edu
        redirect scheme https code 301 if !host_goose
        use_backend http_goose if host_goose

backend http_goose
        mode http
        server sonar $BK_SERVER_003:8080

# ***************** port 443 defs ************
frontend https_in
        mode tcp
        option tcplog

#       With this one, all works except sonar (OPTION 1)
#        bind *:443 

#       With this one, only works sonar (OPTION 2)
       bind *:443 ssl crt sonar.pem

        acl tls req.ssl_hello_type 1
        tcp-request inspect-delay 5s
        tcp-request content accept if tls

        acl host_server001 req.ssl_sni -i  opengrok.ci.example.edu
        acl host_server002 req.ssl_sni -i    gitlab.ci.example.edu
        acl host_server003 req.ssl_sni -i   jenkins.ci.example.edu
        acl host_server004 req.ssl_sni -i     nexus.ci.example.edu
        acl host_server005 req.ssl_sni -i   rancher.ci.example.edu
        acl host_server006 req.ssl_sni -i   reports.ci.example.edu
        acl host_server007 hdr(host) -i       sonar.ci.example.edu

        use_backend https_server001 if host_server001
        use_backend https_server002 if host_server002
        use_backend https_server003 if host_server003
        use_backend https_server004 if host_server004
        use_backend https_server005 if host_server005
        use_backend https_server006 if host_server006
        use_backend https_server007 if host_server007


#opengrok
backend https_server001
        mode tcp
        server server001 $BK_SERVER_001:28443
#gitlab
backend https_server002
        mode tcp
        server server002 $BK_SERVER_002:10443
#jenkins
backend https_server003
        mode tcp
        server server003 $BK_SERVER_001:7443
#nexus
backend https_server004
        mode tcp
        server server004 $BK_SERVER_001:8443
#rancher
backend https_server005
        mode tcp
        server server005 $BK_SERVER_002:9443
#reports
backend https_server006
        mode tcp 
        server server006 $BK_SERVER_001:4443 
#sonar
backend https_server007
        mode http
        server server007 $BK_SERVER_001:9000

Для ВАРИАНТА 2 HAProxy успешно публикует сервис «сонар» с использованием данного сертификата, однако остальные службы пытаются использовать этот сертификат. Поскольку для других сервисов уже включен SSL в соответствующих бэкэндах, у меня НЕТ их сертификатов.

Если я использую ВАРИАНТ 1, HAProxy успешно опубликует все уже-ssl-backend сервисы, кроме сервиса «сонар», потому что ему нужен сертификат, который у меня есть только на уровне proxy_server.

Возможно ли, чтобы все службы были защищены с помощью SSL, если (как я уже сказал) некоторые из них уже защищены, а некоторые другие будут защищены HAProxy с помощью только одного SSL что у меня есть доступ к услуге "сонар"? Как?

Также обратите внимание, что у меня нет доступа ssh к серверам $ BK_SERVER_xxx и что у меня все DNS указывают свои имена на «proxy_server».

0
задан 25 June 2019 в 07:30
1 ответ

Я не думаю, что вы сможете добиться того, что пытаетесь сделать: как вы видели, как только вы представляете сертификат, слушатель прекращает "слепое" проксирование зашифрованного трафика прямо к правильному бэкэнду и вместо этого пытается завершить все клиентские TLS-соединения, используя предоставленные сертификаты, безуспешно, если не может предоставить действительный сертификат для запрошенного домена.

Насколько я понимаю, у вас есть несколько простых альтернатив:
1. Настройте отдельный обратный прокси-сервер перед «сонаром» и любыми будущими службами, сертификат которых у вас действительно есть.
2. Купите групповой сертификат для * .ci.example.edu, чтобы использовать его во внешнем интерфейсе, и укажите сертификат CA, чтобы позволить HAProxy проверять сертификаты, представленные внутренними серверами.

Отредактировано для добавления: HAProxy с радостью позволяет вам определить несколько сертификатов приемника, чтобы вы могли легко прослушивать запросы для нескольких доменов с помощью единого внешнего интерфейса, если клиенты понимают, как выбирать среди представленных сертификатов - что и делает все современное и соответствующее стандартам программное обеспечение.

0
ответ дан 23 November 2019 в 23:17

Теги

Похожие вопросы