Главная >> Инструкции >> Прозрачный прокси для HTTPS в Squid

Прозрачный прокси для 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.

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

24 комментария к “Прозрачный прокси для HTTPS в Squid”

  1. Здравствуйте!
    В и-нете пишут что:
    —enable-ssl-crtd - генерацией сертификатов занимается отдельный процесс, а не сам прокси сервер. Т.е. эта опция не обязательна? Правда тут не понятно, тогда что делать с пересозданием базы сертификатов? Или всё таки это опция обязательна?
    Какой именно сертификат нужно добавить в браузер?

    Ответить
    • Здравствуйте, опция --enable-ssl-crtd обязательна если нужна динамическая генерация сертификатов, то-есть если вы хотите фильтровать трафик со всех сайтов. В браузер нужно добавить сертификат сгенерированый командой: openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der . Что-то я упустил это в статье, нужно доработать.

      Ответить
      • Гм, многие говорят что достаточно --enable-ssl. Просто пробовал оба способа (с --enable-ssl и --enable-ssl, --enable-ssl-crtd). Результат был одинаков, а в частности, браузеры (IE и FF) постоянно предупреждают что сертификат не верный и предлагают не ходить по сайтам это напрягает. Сертификат им подсовывал, не вразумляет их это. Ещё момент, сертификат squid "выдаёт" на ip-адрес, хотя и строка типа этой ssl_bump server-first all есть в конфиге. Пробовал на системе Ubuntu Server 14.04.3 x64, squid3 v3.3.8 из репозитория, вернее из этого ppa https://launchpad.net/~notartom/+archive/ubuntu/squid-ssl. Потом сам скомпилировал уже с --enable-ssl, --enable-ssl-crtd с убунтовской репы. Всё одно, к сожалению. Прописал снова прокси в браузерах. Да, кстати, накладно в браузерах прокси прописывать (если много пользователей), с другой стороны, тут нужно опять же всем сертификат скормить, снова накладно :).

        Ответить
        • Наконец-то дошли руки перепроверить все еще раз в своей системе, и разобрался, работает. Чтобы squid генерировал сертификат не на ip адрес нужно убрать строчку ssl_bump client-first all. Тестировал на Gentoo, squid v3.5.6 собранный из официальных репозиториев с флагами ssl и ssl-crtd, браузер Chromium 43. В на все сайты которые я пробовал заходит без вопросов, в том числе Gmail.

          Ответить
  2. Да работает, но теперь ipv6 трафик обходит прокси. И ещё, не работает в связке с privoxy (privoxy+squid3), https трафик просто не проходит.

    Ответить
  3. Ага гогда пользователей 200-500 там не побегаешь к каждому забить сертификат в браузер, баян в общем очередные костыли...

    Ответить
  4. Друзья, подскажите директива sslcrtd_program /usr/libexec/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

    вот это путь /usr/libexec/squid/ssl_crtd

    У меня нет такого пути. Где его взять? какой командой.?

    Ответить
  5. при попытке добавить прозрачность, например
    http_port 3128 intercept
    после команды
    squid -k reconfigure
    сквид приходит в нерабочее состояние
    как только уберу все intercept
    сразу начинает работать.
    Может у вас есть идеи ка это исправляется?

    Ответить
    • Вы наверняка убираете http port, добавляя к нему intercept, http port обычный нужен в конфиге обязательно, иначе ошибка при запуске.

      Ответить
  6. Уважаемые пользователи linux, не пинайте сильно, пытаюсь разобраться в Ubuntu и пакете squid. Установлен ubuntu 18.04 и я не как не могу собрать squid с поддержкой https. Дайте пожалуйста дельную статью или инструкцию как это сделать. Спасибо за ответ.

    Ответить
  7. Ребят, не читал коменты, поэтому не знаю, есть ли уже ответ.
    После попытки установить пакет .deb вылезет ошибка.
    Нужно набрать:
    sudo apt install -f
    И заново установить пакет .deb

    За статью отдельное спасибо.
    Squid устанавливается и работает на Ubuntu 20.04 server

    Ответить
  8. доброго
    подскажите как порезать скорость с помощью delay_access на squid 4.13?

    на 3.5 все отлично работает, но этот же конфиг не режет в версии 4,13

    ОС Debian 11 SQuid 4.13 не работает
    ОС Centos7 Squid 3.5 все замечательно работает

    Ответить
  9. Подскажите пожалуйста, что делать с подобной ошибкой?
    Может был у кого опыт
    ]: 2023/08/22 17:57:46| ERROR: Directive 'sslproxy_flags' is obsolete.
    ]: 2023/08/22 17:57:46| FATAL: No valid signing certificate configured for HTTPS_port [::]:3130
    ]: FATAL: No valid signing certificate configured for HTTPS_port [::]:3130
    ]: 2023/08/22 17:57:46| Squid Cache (Version 5.2): Terminated abnormally.

    Ответить
    • Если на знаешь параметров, то можно ошибиться, как я и не понимать, что происходит.
      И в статье тоже можно было бы как-то обозначить, что это всё одна строка
      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

      Ответить

Оставьте комментарий