HAProxy - ACL на основе клиента CN в режиме TCP - PullRequest
0 голосов
/ 06 декабря 2018

Я использую HAProxy в режиме TCP с TLS (аутентификация на основе сертификата клиента).Моя конфигурация вставлена ​​ниже.Моя цель состоит в том, чтобы перенаправить SSH-соединение на правильный сервер на основе представленного сертификата клиента.Этот пример говорит о SSH, но в будущем у меня есть различные сервисы, которые мне, возможно, придется защищать таким образом.Любая помощь приветствуется.

Обратите внимание, что в режиме HTTPS вы можете извлечь клиентский CN, используя что-то подобное, и использовать переменную в заголовке для ACL.Однако, поскольку я нахожусь в режиме TCP, я не уверен, как сделать что-то подобное.

http-запрос set-header X-SSL-Client-CN% {+ Q} [ssl_c_s_dn (cn)]

Однако я не уверен, каксделать что-то подобное при работе в режиме TCP.

  frontend Frontend_server
  mode tcp
  option tcplog
  log global
  bind X.X.X.X:8000 ssl crt /etc/certs/server.pem ca-file /etc/certs/ca.crt verify required
  acl ACL_SRV1 ??????? -m str -f /etc/SRV1/cn.list
  acl ACL_SRV2 ??????? -m str -f /etc/SRV2/cn.list  
  acl ACL_SRV3 ??????? -m str -f /etc/SRV3/cn.list
  log-format %ci:%cp\ [%t]\ %ft\ %b/%s\ %ST\ %B\ %tsc\ %ac/%fc/%bc/%sc\ %sq/%bq\ {%[ssl_c_verify],%{+Q}[ssl_c_s_dn],%{+Q}[ssl_c_i_dn]

  use_backend SRV1 if ACL_SRV1
  use_backend SRV2 if ACL_SRV2
  use_backend SRV3 if ACL_SRV3

backend SRV1
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV1 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000
backend SRV2
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV2 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000
backend SRV3
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV3 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000

1 Ответ

0 голосов
/ 06 декабря 2018

В режиме tcp TLS не заканчивается в HAProxy, но завершение TLS выполняется на сервере за haproxy.Этот сервер, конечно, должен быть известен, прежде чем какие-либо данные могут быть отправлены или отправлены на сервер.Это означает, что решение о том, какой сервер выбрать, может быть принято только для первых данных от клиента в рукопожатии TLS (ClientHello), но не для более поздних данных, которые уже требуют ответа от сервера.

Но, клиентские сертификатыотправляются только клиентом, если сервер явно запрашивает их.Это означает, что для получения сертификата клиента от клиента сервер должен установить связь с клиентом, что означает, что соединение с сервером уже должно быть установлено.Это, конечно, означает, что решение о том, какой сервер использовать, не может быть принято на основе сертификата клиента, поскольку сертификат клиента известен слишком поздно при подтверждении связи TLS.

Единственный способ принять такое решение на основе клиентасертификат будет завершать TLS уже на балансировщике нагрузки.

...