Я настраиваю DMZ, которая имеет следующую схему:
Internet - Server A - Security Appliance - Server B - Intranet
В этой DMZ мне нужен прокси-сервер для http (s) соединений из интрасети в Интернет. Проблема в том, что весь трафик должен сканироваться устройством безопасности. Для этого мне нужно разорвать SSL-соединение на сервере B, проксировать его как простой http на сервер A через Security Appliance, а затем как https в Интернет. Затем между клиентом и сервером B и целевым сервером и сервером A происходит постоянное шифрование. Связь между сервером A и сервером B не зашифрована. Я знаю о рисках безопасности и о том, что клиент увидит предупреждение о неизвестном CA сертификата сервера B.
В качестве программного обеспечения я хочу использовать веб-серверы Apache на сервере A и сервере B.
В качестве первого шага я попытался настроить сервер B, чтобы он служил конечной точкой для шифрования SSL. Таким образом, он должен установить шифрование с клиентом (отвечая на HTTP CONNECT).
Listen 8443
<VirtualHost *:8443>
ProxyRequests On
ProxyPreserveHost On
AllowCONNECT 443
# SSL
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel debug
SSLProxyEngine on
SSLProxyMachineCertificateFile /etc/pki/tls/certs/localhost_private_public.crt
<Proxy *>
Order deny,allow
Deny from all
Allow from 192.168.0.0/22
</Proxy>
</VirtualHost>
С этим прокси-сервером проходит только запрос CONNECT и устанавливается зашифрованное соединение между клиентом и целью. К сожалению, нет возможности настроить mod_proxy_connect для расшифровки SSL-соединения. Есть ли возможность выполнить такое проксирование с помощью Apache?
То, что вы пытаетесь реализовать, - это официальный прокси-сервер SSL MITM («официальный», а не злоумышленник). Я не думаю, что Apache Httpd может это сделать (и повторно сгенерировать сертификат с правильным идентификатором на лету).
Есть продукты, которые это реализуют. Быстрый поиск приводит к этим ссылкам:
Я пришел к выводу, что это возможно, используя mod_rewrite и виртуальный хост, который служит обратным прокси. Соединение входит в прокси-сервер и перезаписывает URL-адрес виртуального хоста (на сервере B) + записывает исходный URL-адрес в заголовок HTTP. Виртуальный хост служит конечной точкой SSL и обратным прокси-сервером и пересылает незашифрованный запрос на сервер A (через устройство безопасности). Сервер A перезаписывает целевой URL-адрес на исходный и пересылает на него. Я попробую это сделать в следующие дни и сообщу вам, сработало ли это. Если нет, я расскажу об использовании для этого squid с sslbump.
Спасибо за ответ!