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

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

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

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

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

Установка Squid и OpenSSL в Gentoo

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

sudo emerge -av openssl

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

nano /etc/portage/package.use

net-proxy/squid ssl-crtd ssl

Затем осталось установить Squid:

sudo emerge -pv squid

Установка Squid и OpenSSL в Ubuntu

Прежде чем будет выполнятся настройка HTTPS Squid, надо установить правильный прокси сервер и OpenSSL. Для Ubuntu и других дистрибутивов, основанных на Debian команда установки OpenSSL будет выглядеть вот так:

sudo apt install openssl

С Squid дела обстоят сложнее. Версия, которая есть в репозиториях не поддерживает работу с SSL. Поэтому придется собрать её вручную. Для этого сначала установите зависимости, необходимые для сборки:

sudo apt build-dep squid

Затем установите библиотеку для SSL:

sudo apt install libssl-dev

Создайте папку для сборки в домашней директории и перейдите в неё:

mkdir ~/squid_build && cd ~/squid_build

Скачайте в эту папку исходники Squid:

sudo apt source squid

В текущей папке появится ещё одна папка с исходниками, перейдите в неё.

Затем надо отредактировать файл debian/rules и добавить в него следующие флаги компиляции:

sudo vi debian/rules

--enable-ssl \
--enable-ssl-crtd \
--with-openssl

Эти опции надо вставить в переменную BUILD_CXX, она там одна такая. Затем останется только собрать и установить полученный пакет:

sudo debuild -d -uc -us

sudo dpkg -i ../squid*.deb

После установки вы можете убедится, что ваша версия Squid теперь поддерживает SSL выполнив:

squid -v | grep ssl

Настройка Squid

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

mkdir /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:

chown -R proxy:proxy /etc/squid/ssl

В файл конфигурации надо добавить такие настройки:

sudo vi /etc/squid/squid.conf

http_access allow all
http_port 3128
http_port 3129 intercept
https_port 3130 intercept 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_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
always_direct allow all
ssl_bump server-first all
ssl_bump none all
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/ssl_db -M 4MB

Путь /usr/lib/squid/security_file_certgen (ранее /usr/libexec/squid/ssl_crtd) указывать обязательно иначе будет ошибка. Директива http_access allow all разрешает все подключения к Squid, не используйте её в production версии она добавлена здесь для того, чтобы не засорять конфигурационный файл настройкой доступа и сосредоточится на SSL и прозрачном прокси. Первый порт для http_port - это обычный прокси, к нему можно подключится из браузера, следующие два, с ключевым словом intercept прозрачные, работают только с помощью редиректа в iptables.

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

rm -rf /var/lib/ssl_db

/usr/lib/squid/security_file_certgen -c -s /var/lib/ssl_db -M 4MB

chown -R proxy:proxy /var/lib/ssl_db

Сервис Squid должен обязательно иметь права на директорию /var/lib/ssl_db. Следующим шагом включаем ip_forwarding для разрешения проходящего трафика через узел:

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

Затем можно перезапускать Squid:

sudo systemctl restart squid

Прозрачный прокси Squid HTTPS настроен, осталось настроить редирект и браузер.

Настройка iptables

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

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

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

Если вы хотите тестировать прокси с локальным трафиком, то надо перенаправлять на Squid весь трафик, кроме трафика от Squid, это можно сделать такими правилами:

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 80 -j REDIRECT --to-port 3129

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 443 -j REDIRECT --to-port 3130

Настройка браузера

Сейчас большинство сайтов используют технологию HSTS для предотвращения MiTM атак, поэтому если вы хотите настроить Squid для фильтрации трафика в своей организации, вам следует добавить сертификат .der сгенерированный на предыдущем шаге в браузер. Рассмотрим на примере Firefox. Откройте Настройки -> Защита и приватность -> Просмотр сертификатов -> Центры сертификации:

Затем нажмите кнопку Импортировать и выберите файл squid.der, находящейся в директории /etc/squid/ssl. Отметьте галочки, что следует доверять этому сертификату.

Фильтрация трафика

Теперь откройте какой-либо сайт. Если всё сделано верно, то сайт откроется, но сертификат будет не его, а ваш:

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

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

Завершение

В этой статье мы разобрали как выполняется настройка HTTPS Squid 4. Как видите мы можем узнать какие страницы и изображения запрашивает пользователь, а этого более чем достаточно для нормального контроля трафика. Далее можно настраивать правила блокировки и фильтрации как это обычно делается для Squid.

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

13 комментариев

  1. Аватар Влад 16 августа, 2015 Ответить
    • Аватар admin 17 августа, 2015 Ответить
      • Аватар Влад 17 августа, 2015 Ответить
        • Аватар admin 21 августа, 2015 Ответить
  2. Аватар Влад 23 августа, 2015 Ответить
  3. Аватар Влад 23 декабря, 2015 Ответить
    • Аватар Николай 3 марта, 2016 Ответить
      • Аватар Влад 10 мая, 2016 Ответить
  4. Аватар Андрей 13 апреля, 2017 Ответить
  5. Аватар Vladimir 14 июня, 2019 Ответить
  6. Аватар фыва 30 октября, 2020 Ответить
  7. Аватар Pashko 12 ноября, 2020 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: