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

Протокол 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 откройте настройки браузера, нажмите кнопку показать дополнительные настройки, пролистайте в низ и нажмите кнопку управление сертификатами:

ssl1

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

ssl2

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

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

Creative Commons License
Статья Прозрачный прокси для https в Squid распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Ваше имя тоже может быть здесь. Начните писать статьи для Losst. Это просто! Смотрите подробнее как начать писать статьи - Пишите для нас

Оцените статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (Пока оценок нет)
Загрузка...

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

  1. Влад Август 16, 2015 Ответить
    • admin Август 17, 2015 Ответить
      • Влад Август 17, 2015 Ответить
        • admin Август 21, 2015 Ответить
  2. Влад Август 23, 2015 Ответить
  3. Влад Декабрь 23, 2015 Ответить
    • Николай Март 3, 2016 Ответить
      • Влад Май 10, 2016 Ответить
  4. Андрей Апрель 13, 2017 Ответить

Ответить

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

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