Назад | Перейти на главную страницу

Добавление заголовка HTTP-запроса с помощью Squid

Я хочу разрешить своим пользователям входить в приложения Google только для моего домена. Я нашел решение, добавив HTTP-заголовок X-GoogApps-Allowed-Domains как описано в эта страница справки Google.

Я использую Squid, но не могу понять, как настроить Squid для этого. Как я могу добавить этот заголовок запроса с помощью Squid?

Можете ли вы с новым Squid 3.3, который поддерживает команду request_header_add. Для этого я использовал CentOS.

Мой Squid.conf:

acl CONNECT method CONNECT
visible_hostname MySERVER.local
acl local src 192.168.0.0/24
http_access allow local
ssl_bump client-first all
always_direct allow all
http_port 3128 ssl_bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/cert.pem
request_header_add X-GoogApps-Allowed-Domains "mycompany.com" all
cache_dir ufs /usr/local/squid/var/cache 8192 32 256

Для сертификатов SSL вам нужно сгенерировать с помощью openSSL:

openssl req -new -newkey rsa:1024 -days 36500 -nodes -x509 -keyout /usr/local/squid/etc/cert.pem -out /usr/local/squid/etc/cert.pem 

А для пользователей, которые не могут просматривать ошибки в браузерах, установите это как root, которому доверяют на каждом компьютере, или добавьте в свою Active Directory (в этом может помочь Google).

openssl x509 -in /usr/local/squid/etc/cert.pem -outform DER -out /usr/local/squid/etc/cert.der

В соответствии с Кальмар FAQ:

ACL Squid.conf

Модификация заголовка через ACL Squid ограничивается удалением заголовка или заменой совпадающего заголовка постоянной строкой.

Другими словами, вы не сможете добавлять произвольные заголовки запросов, просто используя ACL Squid. ACL Squid ограничивают вас удалением существующих заголовков или заменой существующих заголовков, но не позволяют добавлять новые заголовки. Единственный способ добавить новые заголовки - использовать ICAP-сервер вместе с Squid. Для получения дополнительной информации см. Раздел ICAP в FAQ по Squid.

Используя squid, вы:

  1. Настройка генерации динамического SSL-сертификата. Установите корневой сертификат в браузеры веб-клиентов.
  2. Настройте SSL Bump для перехвата прокси-трафика SSL / TLS.
  3. Использовать ACL к вставьте желаемый заголовок (ы).

Видимо можно сделать с помощью ICAP

Сервер: http://icap-server.sourceforge.net/irml.html

Клиент находится в squid3: http://ftp.meisei-u.ac.jp/mirror/squid/squid-3.0-RELEASENOTES.html#ss4.1

Конфиг сверху: (squid.conf)

icap_enable on
icap_service service_req reqmod_precache 1 icap://127.0.0.1:1344/request
icap_service service_resp respmod_precache 0 icap://127.0.0.1:1344/response
icap_class class_req service_req
icap_class class_resp service_resp
icap_access class_req allow all
icap_access class_resp allow all

Затем настройте сервер, чтобы определить, изменять ли заголовок или нет, в зависимости от домена назначения:

????+

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

Таким образом, вы можете сделать это с помощью комбинации веб-прокси и сервера ICAP. Я больше всего знаком с Squid Proxy и GreasySpoon для ICAP. Я использую Squid v3.2.1 и GreasySpoon 1.0.8.

  • Кальмар: http://www.squid-cache.org/
  • GreasySpoon: Несуществующий! :( Идея будет такой же на других серверах ICAP, только с другими имплементациями. Раньше он размещался на sourceforge, поэтому, возможно, Wayback Machine будет это. Точно сказать не могу.

Конфигурация Squid

В любом случае настройте Squid для работы в качестве стандартного кеша. Вот пример конфигурации. Для получения дополнительной информации о правильной настройке squid ознакомьтесь с обширной документацией. Раздел, который вас интересует для этого вопроса, - это # ICAP Configurations внизу.

cache_effective_user squid
cache_effective_group squid

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
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 81      # http - public
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

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access deny blocksites
http_access allow localnet
http_access allow localhost

http_access deny all

http_port 3128 transparent

# Leave coredumps in the first cache dir
core dump_dir /var/cache/squid

# ICAP Configurations
icap_enable on
icap_preview_enable on
icap_service service_req reqmod_precache bypass=0 icap://127.0.0.1:1344/reqmod
adaptation_access service_req allow all
icap_service service_resp respmod_precache bypass=0 icap://127.0.0.1:1344/respmod
adaptation_access service_resp allow all

Обратите внимание, что сервер ICAP, который я использовал, находился на том же хосте, что и прокси-сервер squid, поэтому я использовал 127.0.0.1. Если ваш прокси-сервер и ICAP находятся на разных хостах, обязательно замените loopback на IP-адрес или имя сервера другого сервера.

Конфигурация ICAP

Это легкая часть.

Опять же, я использую теперь несуществующий ICAP-сервер "Greasy Spoon". Я обнаружил, что это очень просто, и сделал то, что хотел, с минимальной головной болью. Кроме того, хотя доступны другие варианты, я использую возможности плагина Java.

В случае GreasySpoon я просто создал небольшой Java-скрипт (не javascript, хотя это возможно со многими серверами ICAP), который нацелен на HTTP-запрос, и добавил необходимый заголовок (обратите внимание, что первые комментарии предоставляют метаданные для GS-сервера. Наверное, другим не нужен):

//------------------------------------------------------------------- 
// ==ServerScript==
// @name            Add_Header
// @status on
// @description     
// @include        .*
// @exclude        
// @order           0
// ==/ServerScript==
// --------------------------------------------------------------------

public void main(HttpMessage httpMessage){
    // Add the "my-header" header with a value of "test.server.com"
    httpMessage.addHeader("my-header", "test.server.com");
}

Это добавляет элемент заголовка my-header в каждый запрос.

Использование Squid для добавления собственного заголовка очень сложно. Я попытался, но не смог, однако нашел другое решение для блокировки учетной записи потребителя, используя следующий метод:

  1. Скачать Burp Suit (автономный прокси, который может добавлять собственные заголовки).
  2. Прочтите эту статью, которую я написал: http://computech.in/2013/09/block-access-to-consumer-gmail-accounts-but-allow-google-apps/

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

Вам, вероятно, понадобится полноценный коммерческий веб-фильтр для такой работы - если только вы не хотите углубиться в развертывание собственных ICAP-материалов, как, кажется, предлагает @Richard Keller. Я работаю на Гладкостенный кто производит фильтр, который выполняет свою работу - если это действительно все, для чего он вам нужен (то есть никакой другой фильтрации), проверьте меня с продавцами, и мы сможем получить соответствующую лицензию. В интересах справедливости существуют конкурирующие продукты, которые также имеют эту функцию - YouTube также использует ее.