Перехват и просмотр HTTPS трафика на прокси-сервере Squid 4.9

Рассмотрим как реализовать перехват пользовательских HTTPS-запросов в сеть интернет для дальнейшего анализа и учета их. Все ниже описанные действия производятся на Debian 9 Stretch с установленным прокси-сервером Squid 4.9.

 

Для работы с HTTPS трафиком необходимо, чтобы Squid был собран с следующими параметрами:

ПОДСКАЗКА. Как собрать из исходников Squid 4.9 с необходимыми параметрами, можно посмотреть из этой статьи.

 

Для просмотра HTTPS трафика, прокси-сервер Squid должен иметь свой собственный СА сертификат, который используется для подписывания динамически генерируемых сертификатов для серверов, к которым пользователи посылают запросы.

 

Выполним генерацию CA сертификата и назначим права доступа для него, выполним команды:

 

Конвертируем сертификат в формат для импорта на пользовательские системы:

ПОДСКАЗКА. Как скачать сертификат из Linux системы в Windows, можно посмотреть из этой статье.

Полученный сертификат необходимо установить в «Доверенные корневые сертификаты» на все пользовательские компьютеры, которые будут работать через прокси-сервер Squid. В доменной среде это проще всего сделать при помощи GPO (Group Policy objects).

 

Далее необходимо инициализировать каталог для хранения кэша имитированных сертификатов и указать разрешения на этот каталог для прокси-сервера Squid, выполним команды:

 

В файле конфигурации (/etc/squid/squid.conf) указываем следующие параметры:

 

Выше описанные параметры предполагают перехват всех запросов к HTTPS сайтам. Но как показала практика такой вариант настройки может наложить некие сложности в работе некоторых сайтов (прим. использование WhatsApp Web) и для реализации возможности указания сайтов исключения из перехвата HTTPS трафика, зададим следующие параметры:

ПОЯСНЕНИЕ. Указываем ACL (not_bump_sites) с указанием списка сайтов исключений (прим. /etc/squid/sites_not_bump.txt) и затем в обработке ssl_bump ничего не делаем с указанными в списке сайтами, а запросы к всем остальными сайтам мы перехватываем.

 

Перезапускаем Squid и проверяем работу:

 

На скриншоте выше видим что запрос к сайту https://yandex.ru был успешно перехвачен прокси-сервером, о чем свидетельствует имитированный сертификат и в лог-файле /var/log/access.log будут фиксироваться все действия на данном сайте.

В случае блокирования доступа какого либо сайта средствами прокси-сервера, будет корректно отрабатывать директива DENY_INFO. Пользователь при входе на заблокированный сайт будет видеть заглушку прокси-сервера, вместо не информативного сообщения о разрыве соединения…

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА

 

БесполезноСлабоватоПриемлемоОтличноПревосходно (Еще нет оценок)
Загрузка...

Всего комментариев: 25 Комментировать

  1. Виталий /

    что то ругается все равно (
    NONE/400 3620 NONE error:invalid-request — HIER_NONE/- text/html

    а можете показать полностью конфиг как у вас выглядит?

    1. Жаконда / Автор записи

      А в логах /var/log/squid/cache.log что пишут !?

      Полностью выкладывать нет смысла, т.к. там дефолтный с описанием работы с HTTPS трафика:

      acl nosslintercept dstdomain «/etc/squid/sites_nosslintercept.txt»

      http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squidca.pem

      acl step1 at_step SslBump1
      ssl_bump peek step1
      ssl_bump splice nosslintercept
      ssl_bump bump all

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

      Где в ACL у меня описываются сайты которые не нужно перехватывать..

      1. Виталий /

        все заработало, но только когда я прописал прокси сервер у настройках браузера.
        почему так или так оно и должно было работать?

        1. Жаконда / Автор записи

          Сложно сказать не зная что и как вы там у себя реализовываете.. Но заработало и слава богу 🙂

          1. Виталий /

            Четко по инструкции))) и больше ничего не делал.

            а у вас работает как прозрачный прокси или тоже ручками настраивали в браузере?

          2. Жаконда / Автор записи

            Ну у меня так же реализована Kerberos аутентификация пользователей, а такой метод не поддерживает прозрачное подключение.
            Поэтому я так же как и вы прописывал подключение к прокси на клиентских машинах.

  2. Сталин /

    Вопрос, позвольте, коль тема свеженькая.
    Кеширование некоторых объектов (тех же картинок с одноклассников и прочей ахинеи) приходящих по https реализованы в последних версиях сквида?

    Спасибо.

    1. Жаконда / Автор записи

      Так как ssl-bump делает https видимым как http, то да кеширование картинок и всего там вам еще надо будет осуществлятся.

  3. Ybrc /

    а вот этот сертификат в windows добавляем в доверенные корневые центры сертификации, а как быть если в компании есть Linux станции, как быть в этой ситуации?

    Заранее спасибо!

    1. Жаконда / Автор записи

      Debian по идее так:

      cp certuficate.crt /usr/local/share/ca-certificate
      update-ca-certificates

      1. Ybrc /

        Спасибо большое!!!!
        ты супер!!!!

        Вопрос только один остался, получается прокси сервер не работает в прозрачном режиме и нужно на всех компах прописывать в браузере прокси?

        1. Жаконда / Автор записи

          Не за что 🙂

          Прописывать нужно только в том случае если используется Kerberos SSO аутентификация.

          1. Ybrc /

            у меня AD 2012 по поводу Kerberos SSO аутентификация честно не могу сказать ((((((

            но у меня работает инет по твоей инструкции только через принудительное прописывание в браузере (

            может что то упустил из еще каких то настроек?

            У меня сквид стоит ни как роутер, а как машина внутри сети но настроенная как роутер (форвординг пакетов) + с заворотом портов 80 и 443 на 3128 и 3129

          2. Жаконда / Автор записи

            Тогда надо в Squid пропиши:

            http 3128 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squidca.pem

            А почему не заворачивать с 80,443 на один 3128 !?

          3. Ybrc /

            супер ) получилось!
            Спасибо большое!

  4. Ybrc /

    поторопился я (

    как только включаю intercept сразу все падает (
    error:invalid-request в логах пишет

    1. Жаконда / Автор записи

      Ох сложно сказать, по идее должно работать. На днях буду разбирать WCCP, соответственно он предполагает прозрачный режим работы. Проверю на себе прозрачный режим работы.

  5. Unix_day /

    Подскажите пожалуйста. Настроил squid4 на работу с «HTTPS». Создал ключ для debiana и открытый ключ, установил его в браузер и сайты открываются, но в логах /var/log/squid/cache сыпятся вот такие ошибки, подскажите пожалуйста куда копать:

    Error negotiating SSL connection on FD 41: error:00000001:lib(0):func(0):reason(1) (1/-1)

    kid1| ERROR: negotiating TLS on FD 43: error:00000000:lib(0):func(0):reason(0) (5/-1/104

    SSL bump rules
    ssl_bump peek DiscoverSNIHost

    ssl_bump splice NoSSLIntercept

    ssl_bump bump all

    в конфиге squid установлен следующий параметр:

    http_port 10.168.70.119:3129 ssl-bump
    cert=/etc/squid/ssl/squidCA4.pem
    generate-host-certificates=on
    dynamic_cert_mem_cache_size=16MB

  6. Unix_day /

    Error negotiating SSL connection on FD 41: error:00000001:lib(0):func(0):reason(1) (1/-1) kid1| ERROR: negotiating TLS on FD 43: error:00000000:lib(0):func(0):reason(0) (5/-1/104
    Нашел, что эти ошибки возможно вызваны не squida, а OPENSSL, но как их исправить пока не ясно, никто не сталкивался с этими ошибками?

    1. Жаконда / Автор записи

      Покажите полный конфиг, может что прояснит ситуацию.

      1. Unix_day /

        #
        # Recommended minimum configuration:
        #

        # Example rule allowing access from your local networks.
        # Adapt to list your (internal) IP networks from where browsing
        # should be allowed
        acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 «this» network (LAN)
        acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
        acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
        acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
        acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
        acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
        acl localnet src fc00::/7 # RFC 4193 local private network range
        acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

        acl SSL_ports port 443
        acl Safe_ports port 80 # http
        acl Safe_ports port 21 # ftp
        acl Safe_ports port 443 # https
        acl Safe_ports port 70 # gopher
        acl Safe_ports port 210 # wais
        acl Safe_ports port 1025-65535 # unregistered ports
        acl Safe_ports port 280 # http-mgmt
        acl Safe_ports port 488 # gss-http
        acl Safe_ports port 591 # filemaker
        acl Safe_ports port 777 # multiling http
        acl CONNECT method CONNECT

        #HTTPS filter ON

        sslcrtd_program /usr/lib/squid/security_file_certgen -s /etc/squid/ssl/ssl_db -M 16MB
        sslcrtd_children 50 startup=10 idle=10

        #QUICK ACL

        acl NoSSLIntercept ssl::server_name_regex «/etc/squid/accesses/ssl_white_domain_reg»

        acl DiscoverSNIHost at_step SslBump1

        #
        # Recommended minimum Access Permission configuration:
        #
        # Deny requests to certain unsafe ports
        http_access deny !Safe_ports

        # Deny CONNECT to other than secure SSL ports
        http_access deny CONNECT !SSL_ports

        # Only allow cachemgr access from localhost
        http_access allow localhost manager
        http_access deny manager

        # We strongly recommend the following be uncommented to protect innocent
        # web applications running on the proxy server who think the only
        # one who can access services on «localhost» is a local user
        #http_access deny to_localhost

        #
        # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
        #

        # Example rule allowing access from your local networks.
        # Adapt localnet in the ACL section to list your (internal) IP networks
        # from where browsing should be allowed
        http_access allow localnet
        http_access allow localhost

        # And finally deny all other access to this proxy
        http_access deny all

        #sslproxy_cert_error allow allow_certs

        always_direct allow all
        sslproxy_cert_error allow all
        sslproxy_flags DONT_VERIFY_PEER

        # Squid normally listens to port 3128

        # SSL bump rules
        ssl_bump peek DiscoverSNIHost
        ssl_bump splice NoSSLIntercept
        ssl_bump bump all

        http_port 10.168.70.119:3129 ssl-bump \
        cert=/etc/squid/ssl/squidCA4.pem \
        generate-host-certificates=on \
        dynamic_cert_mem_cache_size=16MB

        # HEADERS in logs
        strip_query_terms off
        #log_mime_hdrs on

        # Запрещаем отображение версии прокси-сервера и имени
        httpd_suppress_version_string on
        visible_hostname PROXYSERVER

        # DNS settings
        dns_nameservers 10.168.71.12
        dns_nameservers 10.168.71.2

        # DEBUG
        #debug_options 10,11
        #debug_options ALL,1 33,2 28,9

        forwarded_for off
        header_access Via deny all

        # Uncomment and adjust the following to add a disk cache directory.
        #cache_dir ufs /var/cache/squid 100 16 256

        # Leave coredumps in the first cache dir
        coredump_dir /var/cache/squid

        error_directory /usr/share/squid/errors/ru

        #
        # Add any of your own refresh_pattern entries above these.
        #
        refresh_pattern ^ftp: 1440 20% 10080
        refresh_pattern ^gopher: 1440 0% 1440
        refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
        refresh_pattern . 0 20% 4320

  7. Unix_day /

    вот с такими параметрами создавал сертификат:
    openssl req -new -newkey rsa:2048 -sha256 -days 36500 -nodes -x509 -extensions v3_ca -keyout squidCA4.pem -out squidCA4.pem

    1. Жаконда / Автор записи

      1 — Рекомендую выполнить все как у меня в статье написано, это точно рабочий вариант.
      2 — С правами на /etc/squid/ssl/ssl_db (создана ли она вообще) и на сертификат у вас все в порядке ?

  8. Unix_day /

    Выполнил все по Вашей статье .Пока полет нормальный, тех ошибок больше нет. Вопрос, насчет размера кэша для имитированных сертификатов, тут рекомендовано 4MB. Как Вы считаете будет ли этого достаточно для 170 пользователей или есть смысл увеличивать этот кэш или оставить как есть.
    /usr/lib/squid/security_file_certgen -c -s /var/lib/ssl_db -M 4MB
    Огромное Вам спасибо. Приятно осознавать, что есть специалисты готовые помочь в непонятных ситуациях.
    Еще один интересный момент, если прокси включен и я пытаюсь отправить сюда коммент, то появляется страница Forbidden
    You don’t have permission to access /wp-comments-post.php on this server.

    1. Жаконда / Автор записи

      Спасибо!

      По размеру кеша, я бы посмотрел как оно будет работать, если будут проблемы, то увеличить, делается благо это быстро.

      По поводу второго, так бывает что некоторые сайты некорректно работать начинают когда происходит подмена сертификата, в моем случае я столкнулся с работой личных кабинетов некоторых банковских сайтов, их пришлось добавить в исключение от просмотра https трафика.

Оставить ответ

девять + три =

© IT-блог Жаконды All Rights Reserved.
Яндекс.Метрика