Протокол 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.
Иногда важно отдохнуть, расслабиться, посмотреть на природу. На десерт сегодня, красивое видео - путь на вершину:
Здравствуйте!
В и-нете пишут что:
—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