Вопрос или проблема
Я хочу создать базовый 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 также, кажется, указывает на то, что это не следует делать.
Поэтому я задаюсь вопросом о следующем:
- Является ли описанная выше конфигурация небезопасной?
- Следует ли мне вместо этого настроить специальную точку входа с определенным портом для работы с ProxyProtocol?
Я также был бы очень рад, если бы мне предоставили пример .yaml файла (или фрагмента), который работает как базовый обратный прокси с a) ProxyProtocol на HTTPS и b) переадресацией с HTTP на HTTPS.
Ответ или решение
Понимание последствий безопасности при использовании общего порта для ProxyProtocol и реверс-прокси HTTP(S) в Traefik требует тщательного подхода, особенно учитывая потенциальные уязвимости, указанные в спецификациях ProxyProtocol. Основной проблемой является возможность злоумышленников подделывать IP-адреса подключений, поскольку ProxyProtocol позволяет передавать информацию о клиентском подключении через заголовки.
Основные аспекты безопасности
-
Необходимость отдельного порта: Использование одного и того же порта для трафика с ProxyProtocol и без него может привести к серьезным проблемам безопасности. Спецификация ProxyProtocol от HAProxy четко подчеркивает, что приемник должен быть настроен исключительно для получения соответствующего протокола. Подобное конфигурирование предотвращает попытки угадывания, присутствует ли заголовок протокола, и исключает возможность злоупотреблений.
-
Настройка доверенных IP-адресов: В примерах конфигурации показана настройка доверенных IP-адресов, которые могут использовать ProxyProtocol. Это критически важно, поскольку позволяет ограничить доступ к этому типу подключения только к известным и доверенным хостам.
-
Отдельные точки входа: Учитывая вышеупомянутые уязвимости, настоятельно рекомендуется организовать отдельные точки входа для трафика с ProxyProtocol. Это обеспечит уровень безопасности, необходимый для предотвращения нежелательного доступа и подделок данных.
Ответы на поставленные вопросы
-
Является ли описанная конфигурация небезопасной?
Да, описанная конфигурация потенциально небезопасна, если один и тот же порт используется для HTTP(S) и ProxyProtocol, поскольку это может позволить неопознанным источникам подделывать IP и порт подключения. -
Следует ли настроить отдельную точку входа?
Да, обязательно настройте отдельную точку входа для использования 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 в вашей инфраструктуре. Такая конфигурация повысит общую устойчивость вашей системы к атакам и обеспечит надежность проксирования.