Протокол HTTPS был разработан для обеспечения безопасного соединения между браузером пользователя и удаленным веб сервером. Для этого все данные проходящие через соединение шифруются таким образом что их может расшифровать только получатель с помощью специального ключа. Изначально в стандартном протоколе HTTP не было предусмотрено защиты информации и HTTPS был разработан для обеспечения безопасности пользователей на сайтах финансовых организаций, банков и государственных учреждений.
В наше время все больше и больше сайтов используют HTTPS для обеспечения конфиденциальности своих пользователей. Нет никаких сомнений в том что шифрование это хорошая вещь для безопасности, но оно также создает ряд проблем для контролируемых сетей, часто используемых в офисах. Основной проблемой есть то что кроме пользователя и сервера никто не может видеть и тем более фильтровать зашифрованные данные. Для решения этой проблемы можно использовать прозрачную фильтрацию HTTPS в Squid с помощью расширения ssl_bump.
Содержание статьи
- Как это работает?
- Установка Squid и OpenSSL в Gentoo
- Установка Squid и OpenSSL в Ubuntu
- Настройка Squid
- Настройка iptables
- Настройка браузера
- Фильтрация трафика
- Завершение
Как это работает?
Когда пользователь пытается открыть сайт 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
Затем осталось установить 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
Эти опции надо вставить в переменную 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
Путь /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 для разрешения проходящего трафика через узел:
Затем можно перезапускать 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.
Иногда важно отдохнуть, расслабиться, посмотреть на природу. На десерт сегодня, красивое видео - путь на вершину:
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали












Здравствуйте!
В и-нете пишут что:
—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.
Да работает, но теперь ipv6 трафик обходит прокси. И ещё, не работает в связке с privoxy (privoxy+squid3), https трафик просто не проходит.
ipv4 тоже сможет обойти, это из-за включения форвардинга, непонятно зачем он тут
В новых (3.5.8 и выше) появился способ без подмены сертификатов.
Можете ли подсказать данный способ?
На habrahabr.ru (не сочтите за рекламу) была статья.
Ага гогда пользователей 200-500 там не побегаешь к каждому забить сертификат в браузер, баян в общем очередные костыли...
для этого есть GPO
Друзья, подскажите директива sslcrtd_program /usr/libexec/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB
вот это путь /usr/libexec/squid/ssl_crtd
У меня нет такого пути. Где его взять? какой командой.?
не пытайтесь это повторить. человек сам плавает в squid и iptables
при попытке добавить прозрачность, например
http_port 3128 intercept
после команды
squid -k reconfigure
сквид приходит в нерабочее состояние
как только уберу все intercept
сразу начинает работать.
Может у вас есть идеи ка это исправляется?
Вы наверняка убираете http port, добавляя к нему intercept, http port обычный нужен в конфиге обязательно, иначе ошибка при запуске.
Уважаемые пользователи linux, не пинайте сильно, пытаюсь разобраться в Ubuntu и пакете squid. Установлен ubuntu 18.04 и я не как не могу собрать squid с поддержкой https. Дайте пожалуйста дельную статью или инструкцию как это сделать. Спасибо за ответ.
В начале статьи написано, как можно собрать Squid с https для Ubuntu.
Правильно, вы забыли "-"
Готовые скрипты для автоматической сборки: https://docs.diladele.com/howtos/build_squid_on_ubuntu_20/index.html
Возможно, придётся подогнать под свои потребности.
Ребят, не читал коменты, поэтому не знаю, есть ли уже ответ.
После попытки установить пакет .deb вылезет ошибка.
Нужно набрать:
sudo apt install -f
И заново установить пакет .deb
За статью отдельное спасибо.
Squid устанавливается и работает на Ubuntu 20.04 server
доброго
подскажите как порезать скорость с помощью delay_access на squid 4.13?
на 3.5 все отлично работает, но этот же конфиг не режет в версии 4,13
ОС Debian 11 SQuid 4.13 не работает
ОС Centos7 Squid 3.5 все замечательно работает
Подскажите пожалуйста, что делать с подобной ошибкой?
Может был у кого опыт
]: 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.
При рестарте
FATAL: Bungled /etc/squid/squid.conf line 4: https_port 49172 intercept ssl-bump generate-host-certificates=on
Если на знаешь параметров, то можно ошибиться, как я и не понимать, что происходит.
И в статье тоже можно было бы как-то обозначить, что это всё одна строка
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