воскресенье, 31 мая 2015 г.

Squid 3: Ошибки на странице HTTPS при использовании SSL Bump

Даже в обычной практике интернет-сёрфинга можно сравнительно часто видеть ошибки безопасности на зашифрованных страницах: Содержимое частично не защищено.

Наиболее часто, в случае прямого соединения клиента с интернетом, это происходит либо в результате сбоев или не слишком аккуратной настройки веб-серверов, либо в случае наличия по дороге скрытого прокси или системы DPI.

Однако недавно пришлось столкнуться с подобной ситуацией по причине функционирования собственного прокси.

Итак, детали.

При наличии прозрачного (transparent) прокси-сервера (Squid 3.4) с функционирующим редиректором, имеющим, в частности, блок-лист, режущий рекламу, было замечено необычно высокое количество ошибок защиты HTTPS на страницах YouTube. Причем на стороне браузера не было видно незашифрованных элементов.

Тщательное исследование конфигурации привело к конфигурации редиректора:

category adv {
domainlist "BL/adv/domains"
redirect "http://cthulhu.localdomain:8080/Transparent.gif"
}

category adv2 {
domainlist "yoyo/domains"
redirect "http://cthulhu.localdomain:8080/Transparent.gif"
}


Так как SSL Bump функционирует, вся реклама Ютуба, включая ту, которая находится под HTTPS, редиректится на HTTP сервер прокси и блокируется согласно спискам доменов.

Соответственно, клиентский браузер неожиданно получает незашифрованный элемент-заглушку прокси-сервера (вследствие чего она не бросается в глаза как небезопасный элемент).

Решение было самоочевидно и напрашивалось.

Так как на сервере уже был настроен и функционировал SSL Bump, а также имелся корневой сертификат (самоподписной, разумеется) с приватным ключом, причем сертификат был уже распределен по клиентским станциям, идея тривиальна: подписать этим сертификатом сертификат веб-сервера прокси (с его локальным именем хоста), настроить TLS/SSL и переписать блокирующие редиректы целиком под HTTPS.

# Apache server certificate with Squid's CA
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
openssl x509 -req -sha256 -days 3650 -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt


Настраиваем Apache:

LoadModule ssl_module libexec/mod_ssl.so
....
Listen 4443

<virtualhost>
ServerName cthulhu.localdomain
SSLEngine on
SSLCertificateFile "/usr/local/squid/etc/server.crt"
SSLCertificateKeyFile "/usr/local/squid/etc/server.key"
</virtualhost>

SSLCipherSuite HIGH:!aNULL:!MD5
SSLCompression on


Открываем порт на файрволе прокси:

# Restrict access to Web server
pass in quick proto tcp from 192.168.0.0/16 to cthulhu port=4443 flags S keep state keep frag group 200


Проверяем конфигурацию и перезапускаем файрвол и Apache. Проверяем, что порт 4443 слушается (кстати, не вздумайте на веб-сервере прозрачного прокси слушать 443 порт - поймаете зацикленное перенаправление).

Теперь корректируем конфигурацию редиректора:

category adv {
domainlist "BL/adv/domains"
redirect "https://cthulhu.localdomain:4443/Transparent.gif"
}

category adv2 {
domainlist "yoyo/domains"
redirect "https://cthulhu.localdomain:4443/Transparent.gif"
}


и убеждаемся, что все работает, зайдя на Ютуб. Действительно, незашифрованных ссылок стало значительно меньше. Но полностью они не ушли, к сожалению. Чтобы свести их количество до разумного минимума, просмотрим и скорректируем и другие часто встречающиеся редиректы, которые мы блокируем. Например, трекеры:


category tracker {
domainlist "BL/tracker/domains"
redirect "http://cthulhu.localdomain:8080/cgi-bin/blocked?clientaddr=%a&url=%u&targetgroup=%t"
}


меняем на:


category tracker {
domainlist "BL/tracker/domains"
redirect "https://cthulhu.localdomain:4443/cgi-bin/blocked?clientaddr=%a&url=%u&targetgroup=%t"
}


Теперь мы можем это делать совершенно спокойно без всяких условий, так как сертификат сервера подписан уже известным клиентам корневым сертификатом.

В принципе, на этом можно было бы и успокоиться. Но у меня наконец-то дошли руки - раз уж я все равно SSL настроил :) - затащить под HTTPS, наконец, cachemgr.cgi.

Вообще говоря, это следовало сделать с самого начала. Но было влом. :)

Как мы это делаем? Всегда правой:

httpd.conf:

LoadModule rewrite_module libexec/mod_rewrite.so
...
<Directory "/opt/csw/apache2/share/cgi-bin">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule cachemgr.cgi$ https://%{SERVER_NAME}:4443/cgi-bin/cachemgr.cgi
</Directory>


Вот и все, folks! ;)