четверг, 16 апреля 2015 г.

Squid3 + Cisco: WCCPv2 HTTP/HTTPS transparent interception

Введение

Как показал более, чем четырехгодичный опыт эксплуатации Squid в инфраструктуре Cisco, наиболее оптимальное решение по перенаправлению трафика на прокси - это WCCP.

Как показал опыт, использование Policy Route, являясь наиболее простым методом, имеет существенные недостатки. Во-первых, это ощутимая загрузка процессора роутера. Во-вторых, в случае малейшей ошибки в конфигурации в ряде случаев образуется очень трудно обнаружимая роутинговая петля. И, в-третьих, в случае если по какой-либо причине хост прокси-сервера уходит в оффлайн, весь интернет-доступ прекращается. Помимо этого, на хосте прокси должен быть включен форвардинг, что в случае некоторых операционных систем бывает отдельной задачей.

WCCP позволяет решить все эти вопросы в одно действие. 

Загрузка CPU на современных роутерах падает до минимума, отключение прокси не приводит к прекращению доступа в интернет, можно строить отказоустойчивые конфигурации с множественными прокси (а также использовать иерархические кэш-структуры), форвардинг на прокси становится не обязательным, а доступ настраивается через extended ACL, что работает реально быстрее, снижая латентность инсталляции в целом.

Схема сетевой топологии


В данной схеме WCCP настраивается на внутреннем роутере, Cisco 2911, с установленным iOS 15.5(1)T.

Замечание: Первоначально данная конфигурация была написана и полностью протестирована на Cisco iOS 15.4(1)T и 15.4(3)M. В дальнейшем тестировалась вплоть до 15.6(2)T.

Конфигурация Cisco iOS


!
ip cef
ip wccp web-cache redirect-list WCCP_ACCESS
ip wccp 70 redirect-list WCCP_ACCESS
no ipv6 cef
!
!
!
interface GigabitEthernet0/1
ip address 192.168.200.2 255.255.255.0
ip wccp web-cache redirect out
ip wccp 70 redirect out
!
!

ip access-list extended WCCP_ACCESS
 remark ACL for HTTP/HTTPS
 remark Squid proxies bypass WCCP
 deny   ip host 192.168.200.3 any
 remark LAN clients proxy port 80/443
 permit tcp 192.168.0.0 0.0.255.255 any eq www 443
 remark all others bypass WCCP
 deny   ip any any
!
!


Замечание: ip wccp web-cache выполняет редирект только HTTP (80 порт). Для редиректа HTTPS необходимо создать динамический сервис 70.

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


# WCCPv2 parameters
wccp2_router 192.168.200.2
wccp2_forwarding_method l2
wccp2_return_method l2
wccp2_rebuild_wait off
wccp2_service standard 0
wccp2_service dynamic 70
wccp2_service_info 70 protocol=tcp flags=dst_ip_hash,src_ip_alt_hash,src_port_alt_hash priority=231 ports=443

# Cisco Routers uses hash (default), switches - mask
# If uses switch L3 (like 3750 or similar), uncomment next line.

#wccp2_assignment_method mask

Замечание: Важный момент касается использования методов взаимодействия прокси и роутера. Cisco на роутерах, как правило, поддерживает функциональность и router и switch. Что позволяет использовать для взаимодействия с прокси как GRE (на системах, где он поддерживается), так и L2 (даже в отсутствие свич-платы с конвергентными портами). В нашем случае используется L2, поскольку сетевой стек Solaris не поддерживает GRE нативно (на самом деле он GRE никак не поддерживает в десятой версии), а мы используем именно его как платформу прокси-сервера. Следует, однако, помнить, что L2 почти всегда - hardware accelerated и имеет меньший оверхед (он просто MAC-адреса переписывает, а не выполняет инкапсуляцию-декапсуляцию), что позволяет получить значительно бОльшую производительность и нагрузочную способность. GRE выполняется на процессоре циски, по-сути, софтверно, что приводит к повышенной нагрузке на процессор.

Полезная справочная таблица по сервисным группам WCCP в Cisco:


Заключение

Не забудьте, что прокси-сервер должен быть уже сконфигурирован для поддержки HTTPS (SSL Bump). Оригинальная статья была написана для Squid Wiki.

среда, 8 апреля 2015 г.

Squid 3: Антивирусное сканирование "на лету" с помощью ClamAV+squidclamav

Вообще, на Squid Wiki все четко и внятно описано. Для понимающих английский. ;)

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

Введение

Итак, нафига это надо.

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

Любителей противоестественного секса с пингвинами я тоже хочу послать в означенном направлении. Катитесь в жопу, вьюноши-бледные-с-красными-глазами. Мир не ограничивается и не заканчивается на вашем самодельном дерьме, в нем есть и другие системы - хотите вы этого или не хотите. И так будет и впредь. Не вы ли кричите за свободу выбора и разнообразие? Ну так начните с себя, мать вашу.

Наша цель - коммунизм Наша цель - обеспечить возможно более полную проверку на вирусы/малварь по-возможности бОльшего количества трафика, вливающегося в нашу локальную сеть/сети. Нет, я пока не касаюсь SSL Bump - хотя  это, само собой, подразумевается (Да, теперь это возможно. Да, это возможно уже довольно давно. Нет, никто не виноват, что вы ленивые и вонючие тормоза, которым лень не то, что жопу оторвать, а кликнуть пару раз мышью или загуглить. Да, для полноценного SSL Bump вам надо быть не поганым линуксоёбом, ничего не умеющим, кроме как apt get и копипастить чужие конфиги, а также стонать на форумах красноглазых идиотов в поисках помощи от таких же ленивых недоумков, а некисло поработать напильником и понимать, наконец, как это, мать его, работает. Короче, вы, придурки, просто готовить его не умеете. Хотя я надеюсь, что вы не из таких и это не про вас писано, верно?).

Цензура все почикала. :)


Компиляция и конфигурирование C-ICAP

Итак, сперва вам нужно, разумеется, скомпилировать Squid с поддержкой C-ICAP (для версий 3.4.x, версии старше 3.5.x включают данную опцию по умолчанию):

./configure '--enable-icap-client'

Затем вам нужно скачать и скомпилировать собственно C-ICAP сервер:

# 32 bit
./configure 'CXXFLAGS=-O2 -m32 -pipe' 'CFLAGS=-O2 -m32-pipe' --enable-large-files --without-bdb --prefix=/usr/local


# 64 bit
./configure 'CXXFLAGS=-O2 -m64 -pipe' 'CFLAGS=-O2 -m64 -pipe' --enable-large-files --without-bdb --prefix=/usr/local


make/gmake


make/gmake install-strip


Само собой, надо позаботиться об автоматическом запуске сервиса C-ICAP в вашей операционке, так же, как и о запуске Squid (но не прямо сейчас!).

Прежде, чем запускать C-ICAP, надо позаботиться о редактировании его конфигурации (любители тупо копипастить конфиги сейчас подорвутся на мине :)):

PidFile /var/run/c-icap/c-icap.pid
CommandsSocket /var/run/c-icap/c-icap.ctl
StartServers 1
MaxServers 20
MaxRequestsPerChild 100
Port 1344
User squid
Group squid
ServerAdmin yourname@yourdomain
TmpDir /tmp
MaxMemObject 131072
DebugLevel 0
ModulesDir /usr/local/lib/c_icap
ServicesDir /usr/local/lib/c_icap
LoadMagicFile /usr/local/etc/c-icap.magic
ServerLog /var/log/i-cap_server.log
AccessLog /var/log/i-cap_access.log
Service echo srv_echo.so


Теперь его можно запустить и убедиться, что он работает.

Компиляция, конфигурирование и запуск ClamAV

ClamAV есть в большинстве репозиториев и может быть получен оттуда. Хотя его можно скомпилировать и из исходников (а, в ряде случаев, вам и придется его компилировать самим, например, если нужна 64-битная версия. При настройке clamd следует быть очень консервативным с опциями. Я не рекомендую использовать SafeBrowsing из-за проблем с производительностью и памятью, а также включать PUA из-за ложных срабатываний. Также позаботьтесь об обновлениях антивирусных баз - это надо делать часто. Я обычно обновляю их 24 раза в сутки. Замечание: ClamAV-демон (clamd) требует довольно много оперативной памяти, он использует около 200-300 мегабайт в минимальной конфигурации, это число может быть значительно выше во время глубокого сканирования больших архивов. Если необходимо,  вы можете поставить его на отдельном хосте с быстрым сетевым соединением до вашего прокси-сервера (эта опция действительна только при использовании squidclamav).

Позаботьтесь об автоматическом запуске clamd и freshclam (честно вам скажу, джентльмены - использовать cron можно, но как-то неаккуратненько).

Компиляция и конфигурирование squidclamav


# 32 bit
./configure 'CXXFLAGS=-O2 -m32 -pipe' 'CFLAGS=-O2 -m32 -pipe' --with-c-icap=/usr/local

# 64 bit
./configure 'CXXFLAGS=-O2 -m64 -pipe' 'CFLAGS=-O2 -m64 -pipe' --with-c-icap=/usr/local

make/gmake

make/gmake install-strip

Разумеется, разрядность вы выбираете в зависимости от разрядности C-ICAP, не забыли?

Теперь нужно подкорректировать конфигурацию самого squidclamav:

maxsize 5000000

# When a virus is found then redirect the user to this URL. Specify proxy web port
# which listen all redirects.
redirect http://your_proxy_fqdn:8080/cgi-bin/clwarn.cgi.en_EN

#squidguard /usr/local/bin/squidGuard

# Path to the clamd socket, use clamd_local if you use Unix socket or if clamd
# is listening on an Inet socket, comment clamd_local and set the clamd_ip and
# clamd_port to the corresponding value.
clamd_local /tmp/clamd.socket
#clamd_ip 192.168.1.5,127.0.0.1
#clamd_port 3310

# Set the timeout for clamd connection. Default is 1 second, this is a good
# value but if you have slow service you can increase up to 3.
timeout 1
logredir 1
dnslookup 0
safebrowsing 0

# Do not scan images
abort ^.*\.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico)(\?.*|$)
abortcontent ^image\/.*$

# Do not scan text files
abort ^.*\.((m?|x?|s?)htm(l?)|css|js|xml|php|json)(\?.*|$)
abortcontent ^text\/.*$
abortcontent ^application\/x-javascript$

# Do not scan streamed videos
abortcontent ^video\/x-flv$
abortcontent ^video\/mp4$

# Do not scan flash files
abort ^.*\.swf$
abortcontent ^application\/x-shockwave-flash$

# Do not scan sequence of framed Microsoft Media Server (MMS) data packets
abortcontent ^.*application\/x-mms-framed.*$

# White list some sites
whitelist .*\.clamav.net
whitelist .*\.avast.com
whitelist .*\.symantec.com
whitelist .*\.symantecliveupdate.com
whitelist .*\.kaspersky.*
whitelist .*\.drweb.com
whitelist .*\.mcafee.com
whitelist .*\.estnod32.ru
whitelist .*\.fsecure.com
whitelist .*\.sophos.com
whitelist .*\.avg.com

whitelist .*\.download.windowsupdate.com
whitelist .*\.download.microsoft.com
whitelist .*\.update.microsoft.com

whitelist .*\.cdn.mozilla.net
whitelist .*\.googlevideo.com
whitelist .*\.youtube.com

Обратите внимание на следующее. Некоторые типы контента нет смысла проверять и впустую грузить сервер, так же, как и некоторые сайты. Это сильно ускоряет работу вашего антивируса, и, как следствие, работу прокси в целом. Дополните списки по необходимости.

Добавьте следующую строчку в c-icap.conf файл:

Service squidclamav squidclamav.so


Теперь можете перезапустить c-icap сервис. Да, и не забудьте создать символическую ссылку на соответствующий вашему языку clwarn.cgi.xx_XX файл (где xx/XX - код вашего языка) в директории cgi-bin вашего веб-сервера прокси (либо просто скопируйте туда соответствующий файл - хотя это не по-админски ;)).


Конфигурирование Squid

Осталось немного. :)

Добавьте в конфигурацию вашего Squid (подразумевается версия не ниже 3.4.10) следующую секцию:

# -------------------------------------
# Adaptation parameters
# -------------------------------------
icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_encode off
icap_client_username_header X-Authenticated-User
icap_preview_enable on
icap_preview_size 1024
icap_service service_avi_req reqmod_precache icap://localhost:1344/squidclamav bypass=off
adaptation_access service_avi_req allow all
icap_service service_avi_resp respmod_precache icap://localhost:1344/squidclamav bypass=on
adaptation_access service_avi_resp allow all


Теперь можно запустить Squid и проверить cache.log на предмет ошибок.

Тестирование 

Подключитесь к вашей сети как клиент, использующий прокси, и зайдите на EICAR. Тестовые файлы должны вызывать четкое срабатывание антивируса и редирект на страницу-заглушку squidclamav.

Производительность (заключение)

Опыт использования данной конфигурации показал достаточно высокую скорость проверок. В сравнении с другими конфигурациями, данная конфигурация самая быстрая (исключая лишь аналогичную комбинацию с eCAP). Все же следует избегать слишком перегрузочных конфигураций clamd, высокозагруженные прокси должны использовать clamd, размещенный на отдельных хостах. Так же не следует злоупотреблять тотальными проверками и стараться не проверять возможно бОльшее число доверенных сайтов. Разумеется, вы будете постоянно искать компромисс между безопасностью и скоростью.

В некоторых случаях узким местом может стать сервер C-ICAP, в такой ситуации вам, возможно, придется скорректировать процессные параметры сервиса. Также учтите тот факт, что сервис C-ICAP загружает CPU значительно сильнее, чем собственно Squid, поэтому вам необходимо помнить о том, что проверки должны начинаться и завершаться как можно быстрее.

Из этих соображений минимизируйте контент, который следует проверять. И, разумеется, никогда не следует проверять аудио- или видео-потоки. :)

понедельник, 6 апреля 2015 г.

Вакханалия блокировок или тюрьма с одной стеной

В последнее время я только и вижу в новостях bullshit, подобный вот этому.

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

Оставив в покое политику - каждый вправе выбирать собственную дорогу в ад - я снова и снова задаюсь вопросом, насколько вменяемы в интеллектуальном отношении люди, которые принимают подобные решения.

Начнем с того (и я уже говорил об этом), что правительства всех стран в принципе прохлопали ушами момент, когда - чисто теоретически - можно было взять новую информационную среду под контроль.

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

Но дело в том, что by design интернет изначально строился как сеть, способная функционировать в условиях атомной войны. Я не думаю, что любое правительство мира, каким бы оно ни было, оказалось сильнее и страшнее атомной войны. Скорее, жалким и интеллектуально ущербным. Раз оно надеется что-то там заблокировать.

Золотые мои, поздняк метадзе. Вы даже WiFi проворонили, не успев и не сумев на него наложить лапу. Кванмён построить слабо оказалось. Да и век сейчас на дворе далеко не 19й.

Как практик, я имею сказать вам (да-да, господины Ксензов и Ампелонский, вы тоже недоумки) следующее.

Более-менее надежную блокировку в состоянии обеспечить я. Да, я лично. Имея в распоряжении (и при полном доступе) инфраструктуру сети с одним-единственным провайдером.

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

Начинает доходить, нет?

Если бы лично мне поставили задачу заблокировать доступ к твиттеру/ютубу/гуглу на государственном уровне для собственных граждан (потому что кишка тонка сделать это на общемировом уровне, сечете?), я бы подошел к задаче следующим образом.

Взял бы под полный административный контроль ВСЕ точки выхода из страны. Абсолютно все, включая сети передачи данных, кабельное и спутниковое ТВ, телефонию - абсолютно всю, перлюстрировал бы ВСЮ почту (включая посылки и письма на бумаге), ВСЕ ввозимые и вывозимые электронные устройства и носители информации. А также запретил бы выезд из страны, а международные коммуникации ЛЮБОГО рода взял бы под полный контроль, прослушку и перлюстрацию. КНДР в масштабе 100 к 1. 

Оценили масштабы задачи? Хотите жить в такой стране, правда? :)

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

Столкнувшись с таким фейком в качестве главы государства - что бы лично я сделал?

Немедленно уволил к чертовой матери и с волчьим билетом все надзорные ведомства. Как растратчиков государственных средств. Пусть молятся своим богам, если я их не посадил бы пожизненно - за растрату государственного бабла в особо крупных размерах. Но сперва я бы попытался физически уничтожить разработчиков Tor и принял бы уголовную статью для любого гражданина, имеющего на своей машине доказанный факт использования этого ПО. Пожизненную статью - государственная измена. Либо смертная казнь - по выбору. Здравствуй, Северная Корея! Здравствуй, Иран! Здравствуй, Саудовская Аравия!

А когда я осознал бы, что я превратил страну в тюрягу образца 17 века, я прекратил бы совать свой нос туда, где я в принципе ничего сделать не способен. Я чуть позже могу объяснить, как в нетоталитарной стране в три счета обходится ЛЮБАЯ так называемая блокировка. Если страна физически не за железным занавесом со 100% контролем любых коммуникаций. И если гражданин физически оборудован функционирующим головным мозгом. 

Кстати, спросите, как это делают граждане КНР - страны, обладающей несравненно бОльшими ресурсами контроля и репрессий.

Ну, дошло? Или еще раз повторить?

Повторяю. Полные блокировки - прерогатива системных администраторов бизнес-центров. Даже не крупных транснациональных компаний (читать выше до просветления). Все остальные - гуляют с песнями.

Компрене ву?

PS. Чтобы людям с одной извилиной и IQ=85 стало окончательно понятно, объясню смысл сказанного одной фразой. То, что вы пытаетесь сделать, сильно напоминает попытку поставить в чистом поле тюрьму с одной стеной. Всего одной. Доходчиво?