Безопасные последствия совместного использования порта для базового ProxyProtocol + HTTP(S) обратного прокси в Traefik.

Вопрос или проблема

Я хочу создать базовый DMZ обратный прокси с SSL-терминацией с использованием traefik v3. Прокси должен использоваться для локальных сервисов на HTTP(S), но также должен обрабатывать запросы извне, которые поступают от другого обратного прокси (NGINX). Для второй части я хотел бы использовать ProxyProtocol.
Я не могу найти хорошую документацию по безопасной реализации такой системы. Я знаком с документацией по точкам входа на документация по точкам входа в traefik, но я не знаю точно, как реализовать это на практике.

Я нашел несколько схожую реализацию ProxyProtocol на The OrangeOne Infrastructure Github:

...
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: web-secure
          scheme: https
    proxyProtocol:
      trustedIPs:
        - "{{ wireguard.cidr }}"
        - "{{ pve_hosts.internal_cidr }}"
        - "{{ tailscale_cidr }}"
  web-secure:
    address: :443
    http:
...
    proxyProtocol:
      trustedIPs:
        - "{{ pve_hosts.ingress.ip }}/32"
    forwardedHeaders:
      trustedIPs:
        - "{{ wireguard.server.ip }}/32"  # Это получено от подключающегося `proxy_protocol`
...

Что меня немного удивляет: Спецификация ProxyProtocol (из HAProxy) специально запрещает совместное использование портов между ProxyProtocol и портами без ProxyProtocol:

Приемник ДОЛЖЕН быть настроен для приема только протокола, описанного в этой спецификации, и НЕ ДОЛЖЕН пытаться угадать, присутствует ли заголовок протокола. Это означает, что протокол явно предотвращает совместное использование портов между публичным и приватным доступом. В противном случае это откроет серьезную брешь в безопасности, позволяя ненадежным сторонам подделывать адреса своих соединений. Приемник ДОЛЖЕН обеспечить правильную фильтрацию доступа, чтобы только надежные прокси могли использовать этот протокол.

Этот пост о использовании ProxyProtocol для NGINX также, кажется, указывает на то, что это не следует делать.

Поэтому я задаюсь вопросом о следующем:

  1. Является ли описанная выше конфигурация небезопасной?
  2. Следует ли мне вместо этого настроить специальную точку входа с определенным портом для работы с ProxyProtocol?

Я также был бы очень рад, если бы мне предоставили пример .yaml файла (или фрагмента), который работает как базовый обратный прокси с a) ProxyProtocol на HTTPS и b) переадресацией с HTTP на HTTPS.

Ответ или решение

Понимание последствий безопасности при использовании общего порта для ProxyProtocol и реверс-прокси HTTP(S) в Traefik требует тщательного подхода, особенно учитывая потенциальные уязвимости, указанные в спецификациях ProxyProtocol. Основной проблемой является возможность злоумышленников подделывать IP-адреса подключений, поскольку ProxyProtocol позволяет передавать информацию о клиентском подключении через заголовки.

Основные аспекты безопасности

  1. Необходимость отдельного порта: Использование одного и того же порта для трафика с ProxyProtocol и без него может привести к серьезным проблемам безопасности. Спецификация ProxyProtocol от HAProxy четко подчеркивает, что приемник должен быть настроен исключительно для получения соответствующего протокола. Подобное конфигурирование предотвращает попытки угадывания, присутствует ли заголовок протокола, и исключает возможность злоупотреблений.

  2. Настройка доверенных IP-адресов: В примерах конфигурации показана настройка доверенных IP-адресов, которые могут использовать ProxyProtocol. Это критически важно, поскольку позволяет ограничить доступ к этому типу подключения только к известным и доверенным хостам.

  3. Отдельные точки входа: Учитывая вышеупомянутые уязвимости, настоятельно рекомендуется организовать отдельные точки входа для трафика с ProxyProtocol. Это обеспечит уровень безопасности, необходимый для предотвращения нежелательного доступа и подделок данных.

Ответы на поставленные вопросы

  1. Является ли описанная конфигурация небезопасной?
    Да, описанная конфигурация потенциально небезопасна, если один и тот же порт используется для HTTP(S) и ProxyProtocol, поскольку это может позволить неопознанным источникам подделывать IP и порт подключения.

  2. Следует ли настроить отдельную точку входа?
    Да, обязательно настройте отдельную точку входа для использования ProxyProtocol. Это предотвратит совместное использование портов, что, в свою очередь, снизит риск горизонтальных атак.

Пример конфигурации .yaml для Traefik

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https

  https:
    address: ":443"
    http:
      tls:
        certResolver: myresolver

  proxyprotocol:
    address: ":8443"
    proxyProtocol:
      trustedIPs:
        - "192.168.1.0/24"
        - "203.0.113.0/24"

certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com
      storage: /etc/traefik/acme/acme.json
      httpChallenge:
        entryPoint: http

Заключение

Воплощение вышеуказанных рекомендаций путем установки отдельного порта (например, 8443) для точек входа с ProxyProtocol и настройки доверенных IP-адресов позволяет вам безопасно воспользоваться преимуществами Traefik v3 и стандартом ProxyProtocol в вашей инфраструктуре. Такая конфигурация повысит общую устойчивость вашей системы к атакам и обеспечит надежность проксирования.

Оцените материал
Добавить комментарий

Капча загружается...