Прозрачный прокси для https в Squid

5

Протокол HTTPS был разработан для обеспечения безопасного соединения между браузером пользователя и удаленным веб сервером. Для этого все данные проходящие через соединение шифруются таким образом что их может расшифровать только получатель с помощью специального ключа. Изначально в стандартном протоколе HTTP не было предусмотрено защиты информации и HTTPS был разработан для обеспечения безопасности пользователей на сайтах финансовых организаций, банков и государственных учреждений.

В наше время все больше и больше сайтов используют HTTPS для обеспечения конфиденциальности своих пользователей. Нет никаких сомнений в том что шифрование это хорошая вещь для безопасности, но оно также создает ряд проблем для контролируемых сетей, часто используемых в офисах. Основной проблемой есть то что кроме пользователя и сервера никто не может видеть и тем более фильтровать зашифрованные данные. Для решения этой проблемы можно использовать прозрачную фильтрацию HTTPS в Squid с помощью расширения ssl bump.

Как это работает

Когда пользователь пытается открыть сайт iptables перенаправляет запрос на наш прокси Squid. Обязательно чтобы трафик от пользователей проходил через машину с настроенным iptables и squid. Если используется протокол HTTPS, прокси сервер устанавливает шифрованное соединение с запрашиваемым сервером выдавая себя за браузер, а затем на основе собственного корневого сертификата подписывает новый ssl сертификат для запрашиваемого доменного имени и отправляет его браузеру пользователя выдавая себя за сервер. Таким образом устанавливается два шифрованных соединения и прокси получает полный доступ к проходимому трафику.

Установка Squid и Openssl

Я буду описывать все на основе дистрибутива Gentoo, но в других дистрибутивах повторить все будет не сложно, отличаются только команды установки и еще несколько мелочей.

Для работы с ssl сертификатами в системе должен быть установлен пакет openssl, если еще нет, установите:

sudo emerge -av openssl

Теперь squid нужно собрать с поддержкой ssl и динамической генерации сертификатов, а это соответственно опции: —enable-ssl —enable-ssl-crtd, поэтому:

nano /etc/portage/package.use

net-proxy/squid ssl-crtd ssl

В других дистрибутивах необходимо будет собрать собственную версию squid, скачав исходники и включив нужные опции в с помощью configure.

Устанавливаем:

sudo emerge -pv squid

Подготовка системы

Сначала создадим папку для хранения сертификатов, например в /etc/squid/ssl:

mkdir /etc/squid/ssl

chown -R squid /etc/squid/ssl

Теперь генерируем корневой сертификат собственного CA (Центра сертификации) на основе которого будут подписываться сертификаты для сайтов:

 $ cd /etc/squid/ssl

$ sudo openssl genrsa -out /etc/squid/ssl/squid.key
$ sudo openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
$ sudo openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem

Генерируем корневой сертификат который затем нужно будет добавить в браузер:

sudo openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der

Настроим конфигурационный файл squid:

http_port 3128 transparent
https_port 3129 transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
always_direct allow all
ssl_bump server-first all
ssl_bump none all
sslcrtd_program /usr/libexec/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

Путь /usr/libexec/squid/ssl_crtd указывать обязательно иначе будет ошибка.

Дальше нужно пересоздать базу данных сертификатов:

rm -rf /var/lib/ssl_db

$ /usr/libexec/squid/ssl_crtd -c -s /var/lib/ssl_db

$ chown -R squid /var/lib/ssl_db

Squid должен обязательно иметь права на директорию /var/lib/ssl_db.

Включаем ip_forwarding для разрешения проходящего трафика через узел:

echo 1 >> /proc/sys/net/ipv4/ip_forward

Запуск и фильтрация

Запускаем прокси-сервер:

sudo /etc/init.d/squid start

Проверить прослушиваются ли оба порта можно командой:

netstat -nap | grep 312

tcp6 0 0 :::3128 :::* LISTEN
tcp6 0 0 :::3129 :::* LISTEN

Перенаправляем весь проходящий через узел трафик с целевыми портами http и https на squid:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

$ iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3129

Если все настроено правильно наш прозрачный прокси для https заработает и в логе /var/log/squid/access.log мы увидим кода и зачем ходит пользователь:

tail -f /var/log/squid/access.log

439471662.652 706 192.168.1.3 TCP_MISS/200 30189 GET https://www.linux.org.ru/ - ORIGINAL_DST/178.248.233.6 text/html
1439471662.663 0 192.168.1.3 TAG_NONE/200 0 CONNECT 74.125.143.95:443 - HIER_NONE/- -
1439471662.816 144 192.168.1.3 TCP_MISS/200 6080 GET https://www.linux.org.ru/tango/combined.css? - ORIGINAL_DST/178.248.233.6 text/css
1439471662.825 0 192.168.1.3 TAG_NONE/200 0 CONNECT 178.248.233.6:443 - HIER_NONE/- -
...
1439471662.969 137 192.168.1.3 TCP_MISS/200 4924 GET https://www.linux.org.ru/tango/img/opensource-logo.png - ORIGINAL_DST/178.248.233.6 image/png
1439471663.131 155 192.168.1.3 TCP_MISS/200 7998 GET https://www.linux.org.ru/tango/img/gnu-logo.png - ORIGINAL_DST/178.248.233.6 image/png

Завершение

Как видите мы можем узнать какие страницы и изображения запрашивает пользователь, а этого более чем достаточно для нормального контроля трафика. Остался последний штрих. Нашего ssl сертификата нет в списке доверенных сертификатов браузера, поэтому при попытке открыть https сайт пользователь получит предупреждение о недостоверном ssl сертификате. Для того чтобы это устранить нужно добавить сертификат в браузеры всех пользователей. Для добавления сертификата в Chrome откройте настройки браузера, нажмите кнопку показать дополнительные настройки, пролистайте в низ и нажмите кнопку управление сертификатами:

В открывшимся окне перейдите на вкладку Центры сертификации и нажмите кнопку импорт:

Останется выбрать файл сертификата в формате der, ввести пароль и нажать кнопку готово.

Иногда важно отдохнуть, расслабиться, посмотреть на природу. На десерт сегодня, красивое видео — путь на вершину:

Источник: losst.ru