Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 128, АВГУСТ 2009 г.

Серпом по аськамю Режем IM, Skype, P2P и все остальное

_ssh3r1ff- (ssh3r1ff@gmail.com)

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

Изучаем вопрос

Вообще говоря, процесс блокировки доступа пользователей к IM-сетям довольно прост: достаточно указать в пакетном фильтре пару правил, и клиент просто не сможет подключиться к серверу. Но такой метод помогает только в 90% случаев, остальные 10% приходятся на умников, знающих о том, что сегодня предлагается большое количество утилит и сервисов, задача которых - помочь задавленному админскими правилами пользователю вырваться на свободу. Для этого используется подключение через стандартный http-порт или шифрование соединения, что не позволяет просто взять и отбросить пакет или просмотреть его содержимое. Поэтому универсального решения, скорее всего, не будет никогда. Хотя это даже делает нашу работу интереснее. Вперед!

Так как мы пока не знаем, что конкретно искать, запускаем tcpdump без параметров:

$ sudo tcpdump -i eth0

А вот и наша аська:

21:33:55.687042 IP 10.10.10.10.33018 > 64.12.26.150.aol: . ack 11334 win 63920

Вывод нам дал, как минимум, два полезных параметра - IP-адрес сервера ICQ, к которому подключается клиент, и название протокола. Номер нужного порта можно узнать командой «grep aol /etc/protocols», запустив tcpdump с ключом '-n' или просто спросив у гугла. Мы ищем аську, поэтому пишем:

$ sudo tcpdump -i eth0 dst portrange 5190

Теперь в расставленные сети будет попадаться только то, что нужно. Аналогично отлавливаются данные и по остальным IM-сетям. Все клиенты ICQ, в том числе и рамблеровские, для подключения к серверу по умолчанию используют адрес login.icq.com и порт 5190. В асечных рекомендациях сказано, что в случае недоступности 5190 подключаться можно и к порту 443. Продолжаем исследование и смотрим, что мы можем узнать о домене:

$ host login.icq.com
login.icq.com is an alias for login.messaging.aol.com.
login.messaging.aol.com has address 64.12.161.153

Вывод показывает, что login.icq.com является псевдонимом для другого имени, и, подозреваю, далеко не единственным. Его также не мешает заблокировать в правилах. Как видишь, ситуацию с ICQ и многими другими сервисами немного усложняет наличие большого количества алиасов и подсервисов, поэтому приходится искать и прикрывать все возможные варианты. Еще одна полезная команда – dig – даст наиболее полную инфу по любому домену (dig login.icq.com).

В первом случае заблокировать доступ очень просто. Сначала режем по порту и затем для верности добавляем правило для домена, если кто-то захочет нас надуть (все примеры буду приводить для iptables, но при необходимости их легко можно переписать для любого другого пакетного фильтра):

iptables -A FORWARD -p TCP --dport 5190 -j DROP
iptables -A OUTPUT -d login.icq.com -j REJECT
iptables -A OUTPUT -d id.rambler.ru -j REJECT

Использование доменного имени с одной стороны более универсально, так как IP всегда может измениться, но с другой стороны – «в лет» найти все алиасы сложновато, поэтому нелишней будет блокировка и по адресу. Тем более, разработчики постоянно идут навстречу клиенту и предлагают сервисы вроде www.icq.com/icq2go, позволяющие общаться через веб-интерфейс. Хотя именно этот вариант легко блокируется, достаточно закрыть доступ к диапазону IP (он виден в выводе dig):

iptables -A OUTPUT -d 64.12.0.0/16 -j REJECT
iptables -A OUTPUT -d 205.188.0.0/16 -j REJECT

Но даже неискушенный юзверь найдет в интернете еще с десяток реализаций icq2go (а-ля www.meebo.com), предлагающих коннект к IM-системе в обход ограничений. Вот здесь уже придется повозиться.

Не буду мучить детальным выводом tcpdump'а, скажу только, что Yahoo! Messenger использует TCP-порты: 5000-5001,5050,5100 и UDP-порты: 5000-5010, MSN - 1863, Jabber/Gtalk - 5222, 5223, IRC обычно 6667-6669, Мail-Агент работает по портам: 2041, 2042. Особо не раздумывая, сделай запрет на все! Помни, что некоторые сервисы (например, узкопрофильные IRC и т.п.) могут менять порты по умолчанию. Правила для этих сетей строим по аналогии с предыдущим. Например, для Yahoo Messenger:

iptables -A FORWARD -p TCP --dport 5000:5001 -j REJECT
iptables -A FORWARD -p TCP --dport 5050 -j REJECT
iptables -A FORWARD -p TCP --dport 5100 -j REJECT
iptables -A FORWARD -p UDP --dport 5000:5010 -j REJECT
iptables -A FORWARD -d cs.yahoo.com -j REJECT
iptables -A FORWARD -d scsa.yahoo.com -j REJECT

Из дополнительных мер можно посоветовать перенастроить свой DNS-сервер, чтобы пользователь вместо правильного адреса получал изначально нерабочий. К слову, анализ DNS-запросов в сети может дать не меньше информации к размышлению, чем отлов пакетов с tcpdump. Поскольку мой DNS-сервер крутится на OpenBSD, приведу пример для BIND 9.3.4:

$ sudo vim /var/named/etc/named.conf

logging {
// определяем канал - место назначения журнальных записей
channel queries_ch {
// задаем лог-файл (путь указывается относительно chroot-окружения), количество ротаций и его размер
file "/log/queries.log" versions 5 size 10m;
// устанавливаем уровень журналирования (нам подойдет debug, либо info)
severity debug;
// к каждой записи добавляем метки с категорией, уровнем журналирования и временным штампом
print-category yes;
print-severity yes;
print-time yes;
};
// фиксируем клиентские обращения
category queries { queries_ch; };
category resolver { queries_ch; };
};

Перезапускаем демон named и включаем журналирование DNS-запросов:

$ sudo rndc reload
$ sudo rndc querylog

Смотрим в логи:

$ sudo tail -f /var/named/log/queries.log
30-Jun-2009 16:22:15.036 resolver: debug 1: createfetch: ns.mail.ru A
30-Jun-2009 16:22:35.179 queries: info: client 192.168.1.21#64773: view internal: query: www.meebo.com IN A +
30-Jun-2009 16:22:35.868 queries: info: client 192.168.1.21#63341: view internal: query: js.meebo.com IN A +

В дальнейшем борьба будет вестись по принципу «увидел что-то новое в netstat/tcpdump/queries.log, проанализировал и добавил правило». В репозиториях дистрибутивов полно всяких полезных утилит. Например, iptstate выводит TOP-образную таблицу по соединениям. Чтобы упростить задачу, можно использовать фильтр портов или адресов:

$ sudo iptstate --dstpt-filter=5190

Так мы увидим все попытки подключения к асечному порту.

Перекрываем кислород средствами кальмара

Как только основные порты для связи с IM-сервером будут перекрыты, пользователи начнут подключаться через стандартный порт 80/443 или через прокси. Здесь iptables в том виде, в котором он есть, нам уже не поможет, но не забываем о существовании Squid'а – он работает на прикладном уровне и умеет анализировать передаваемую информацию. Надеюсь, к этому времени кальмар у тебя уже настроен, и все пользователи через него выходят в интернет (подробнее о настройке Squid смотри в летних номерах ][ за 2008 год). Сам принцип блокировок остается тем же - запрещаем доступ к определенным адресам. Итак, открываем squid.conf и дописываем:

$ sudo vim /etc/squid/squid.conf

// Указываем свой адрес
acl admin src 192.168.10.10
// aim/http - MIME-тип ICQ
acl aim_http rep_mime_type -i ^aim/http$
// Блокируем всех, кроме себя любимого
http_reply_access deny aim_http !admin
// Ну и чтобы наверняка, перекрываем доступ к серверам ICQ
acl ICQ-Mess dst 64.12.200.89/32 205.188.153.121/32 205.188.179.233/32 64.12.161.153/32 64.12.161.185/32
http_access deny ICQ-Mess !admin

Учитывая, что резать придется и другие IM-сети, а также бесплатные почтовики вроде mail.ru, проще для всех блокируемых адресов создать отдельный файл, подключив его в правиле:

acl im_nets src "/usr/local/etc/squid/icq_nets.acl"
http_acces deny im_nets !admin

Остается только почаще заглядывать в отчеты Sarg (анализатор лог-файлов Squid) и проверять, все ли лазейки прикрыты.

Допиливаем iptables

Все сделано правильно, нужные порты и адреса заблокированы, но хитрые пользователи все равно нашли способ обойти преграды. Снова возвращаемся на нижний уровень OSI к нашему iptables. Начиная с версии 2.6.14, в состав ядра включен модуль (ранее он был в patch-o-matic-ng), позволяющий заглянуть внутрь пакета и построить правило, опираясь на наличие/отсутствие определенных строк. Модуль называется string (xt_string). В большинстве современных дистрибутивов все необходимое уже есть, и пересобирать ничего не придется. Чтобы проверить, достаточно просмотреть список файлов в каталоге модулей:

$ ls /lib/modules/2.6.24-24-generic/kernel/net/netfilter/xt_string.ko

С его помощью задавать правила довольно просто:

$ sudo iptables -A FORWARD -m string --string "icq.com"
--algo kmp --to 65535 -j DROP

Теперь, если в пакете обнаружится соответствующая строка, в доступе будет отказано. Так же можно резать и все остальное, к чему не лежит душа начальства/админа. Например, пользователи любят на шару качать файлы на работе, посему блокируем Download Master:

$ sudo iptables -A FORWARD -m string --string --algo kmp
"DownloadMaster" -j REJECT

Подобным образом можно закрыть доступ к «Одноклассникам», «ВКонтакте» и прочим ресурсам. Параметр '--algo' обязателен, – он определяет алгоритм, который будет использован для проверки совпадения строк. Здесь возможны варианты - kmp (от Knuth-Pratt-Morris) или bm (от Boyer-Moore). В подробности работы алгоритмов вдаваться не буду, скажу только, что bm считается одним из наиболее быстрых среди алгоритмов сравнения в «простых» ситуациях. А kmp является усовершенствованным вариантом bm, оптимизированным для разбора сложных строк. Кстати, модуль string поддерживает и параметр '--hex-string', что позволяет производить поиск в бинарном формате.

К сожалению, это все, что можно сделать, используя стандартные возможности iptables. Далее необходимо обращаться уже к другим решениям.

Блокировки седьмого уровня

Существует несколько проектов, которые предоставляют больше возможностей по контролю трафика. Это l7-filter (l7-filter.sf.net), Zorp (www.balabit.com/network-security/zorp-gateway), IPP2P (ipp2p.org) и P2PWall (www.lowth.com/p2pwall). Последние два проекта, как видно из названия, специализируются на идентификации P2P-сетей. Задача Zorp (Modular Application Level Gateway) – защита приложений от направленных атак. Zorp представляет собой прозрачный прокси, который выступает посредником при работе клиента и сервера. Зная особенности протоколов и на основании настроек, он принимает решение о необходимости продолжения текущего соединения. Его главная фича - возможность проверки защищенных соединений (HTTPS, POP3S, IMAPS или SSH), что недоступно многим IDS. Версия GPL поддерживает только протоколы (HTTP/1.1, FTP, SSL, finger, whois и telnet), поэтому Zorp нас пока не интересует.

L7-filter позволяет Netfilter идентифицировать пакет на прикладном уровне данных, основываясь на его содержимом, и классифицировать пакеты по их назначению, без привязки к номеру порта. В настоящее время поддерживаются протоколы HTTP и FTP; P2P сети (Kazaa, BitTorrent, eDonkey2000, FastTrack); IM-системы (AIM/Jabber/IRC/MSN); VoIP/Skype; VPN; игры (Battlefield, CS, Doom3, WoW); файлы (exe, mp3) и даже черви вроде Code Red и Nimda.

Проект предлагает две версии l7-filter:

  • Kernel version - развивается уже давно и хорошо протестирована; немного сложна в установке, не очень дружит с SMP-процессорами и позволяет использовать только самые простые регулярные выражения;
  • Userspace version - находится в ранней стадии развития, обладает большими возможностями по фильтрации, так как поддерживает весь спектр команд GNU grep (возможно, в будущем будет поддерживаться только эта версия).

Несмотря на то, что версия userspace стабильна в работе, ее не рекомендуют использовать на критических системах и для блокировки трафика. Ниже рассмотрим установку kernel-варианта l7-filter, который затем дополним IPP2P.

Для успешного проведения сборки в твоей системе должны быть установлены пакеты build-essential, iptables, iptables-dev и linux-source. Берем настройки текущего ядра, которые будем использовать как базовые, и копируем их в /usr/src/linux:

$ sudo cp /boot/config-`uname -r` /usr/src/linux/.config

Получаем архив с патчами для ядра с сайта l7-filter (либо с прилагаемого к журналу диска), распаковываем его и переходим в каталог с сырцами ядра:

$ tar xzvf netfilter-layer7-v2.21.tar.gz
$ cd /usr/src/linux

В архиве несколько патчей для разных версий ядер и iptables. Нужно выбрать вариант для своего ядра (в настоящее время есть патчи только до 2.6.28):

$ sudo patch -p1 < ../netfilter-layer7-v2.21/for_older_kernels/kernel-2.6.22-2.6.24-layer7-2.18.patch

Аналогично патчим iptables:

$ cd ../iptables
$ iptables -v
iptables v1.3.8
$ sudo patch -p1 < ../netfilter-layer7-v2.21/iptables-1.3-for-kernel-2.6.20forward-layer7-2.21.patch
$ sudo chmod +x extensions/.layer7-test

Собираем iptables:

$ make KERNEL_DIR=/usr/src/linux
$ sudo make install

Теперь конфигурируем и компилируем ядро:

$ sudo make menuconfig

Переходим в «Networking - Networking option - Network packet filtering framework(Netfilter) - Core Netfilter Configuration», где активируем «Connection tracking flow accounting» и «Layer 7 match support». На этой же вкладке активируется модуль string, о котором говорилось выше, поддержка Netfilter отдельных протоколов (FTP, H323 и пр.) и другие полезные функции.

Ставим фильтры протоколов; фактически они просто копируются в каталог /etc/l7-protocols:

$ tar xzvf l7-protocols-2009-05-28.tar.gz
$ cd l7-protocols-2009-05-28/
$ sudo make install

После перезагрузки можно проверить работу фильтра. Команда «iptables -m layer7 --help» выдаст список параметров. Например, чтобы заблокировать BitTorrent, AIM и Skype, пишем:

iptables -A FORWARD -m layer7 –l7proto bittorrent -j DROP
iptables -A FORWARD -m layer7 –l7proto aim -j DROP
iptables -A FORWARD -m layer7 –l7proto skypetoskype -j DROP
iptables -A FORWARD -m layer7 –l7proto skypeout -j DROP

Далее блокируем по аналогии: ищем в списке название протокола и баним.

Ставим IPP2P

Сейчас рассмотрим установку IPP2P - проекта, который специализируется на P2P-сервисах. Как и l7-filter, он является надстройкой над Netfilter/iptables, с которым легко интегрируется. Его функциональность расширяется за счет добавления новых правил. Для идентификации протокола IPP2P использует подготовленные шаблоны. Кроме блокировки трафика, IPP2P можно использовать для его маркировки, например, чтобы задавать меньший приоритет или канал.

Учитывая, что все у нас уже подготовлено, описание установки много места не займет. Забираем с DVD-диска архив с исходными текстами ipp2p-0.8.2.tar.gz, накладываем патч ipp2p-0.8.2-kernel-2.6.22.patch и пробуем установить:

$ sudo make

Скорее всего, в ответ получим ошибку «ipp2p-0.8.2/Makefile:36: You need to install iptables sources and maybe set IPTABLES_SRC». В инструкции по установке сказано, что скрипту нужно правильно указать на каталог, в котором находится заголовочный файл iptables.h. В нашем случае это – /usr/src/iptables. Открываем Makefile и правим:

$ sudo nano Makefile

IPTABLES_SRC = $(wildcard /usr/src/iptables)
#CFLAGS = -O3 -Wall

Повторяем попытку. Если ядро ранее не собиралось, например, ты решил обойтись без l7-filter, то перед сборкой IPP2P следует установить исходники и ввести «make oldconfig && make prepare» (иначе процесс сборки IPP2P завершится неудачей). По окончании компиляции переносим libipt_ipp2p.so в каталог с библиотеками iptables:

$ sudo cp libipt_ipp2p.so /usr/lib/iptables

Загружаем модуль:

$ sudo cp libipt_ipp2p.so /lib/iptables
$ sudo cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4/netfilter
$ sudo modprobe ipt_ipp2p
$ sudo bash -c "echo ipt_ipp2p >> /etc/modules"

Все готово! Смотрим список параметров:

$ sudo iptables -m ipp2p --help

И блокируем все, что не нужно:

iptables -A FORWARD -m ipp2p --edk --kazaa --gnu --bit
--apple --dc --soul --winmx --ares -j DROP

Заключение

После описанных действий лазеек в сети не останется, хотя это не должно усыплять твою бдительность. Правильным будет запретить доступ к USB/CD/DVD, а также проконтролировать, какие программы установлены на компьютерах пользователей, и заблокировать возможность самостоятельной их установки.

MIPKO Employee Monitor

Представим такую ситуацию: политикой компании разрешено использовать ICQ только менеджеру по продажам, но он целый день болтает в аське с друзьями, вместо того, чтобы разводить клиентов на заказы. При помощи программ, описанных в статье, это определить нельзя. Поэтому возможен и альтернативный подход - наблюдение. На рабочем месте устанавливается программа, которая перехватывает все вводимые сообщения, контролирует запуск приложений и работу в интернете. Начальство в этом случае получает отчеты по всем действиям пользователя, включая снимки рабочего стола, и может оценить эффективность работы сотрудника. Пример такой программы - MIPKO Employee Monitor (www.mipko.ru). Она разработана российской компанией, имеет локализованный интерфейс и довольно проста в использовании. Программа может быть запущена в скрытом режиме. В этом случае отследить ее работу штатными системными средствами невозможно.

Цепкий захват

По умолчанию l7-filter просматривает лишь первые 10 пакетов или 12 Кб каждого соединения, чего обычно более чем достаточно. При необходимости можно указать свое значение, прописав его в /proc/net/layer7_numpackets:

$ sudo sh -c "echo 16 > /proc/net/layer7_numpackets"

Пример блокировки ICQ для packet filter

$ sudo vim /etc/pf.conf
table <ICQDests> const { 64.12.0.0/16, 205.188.0.0/16 }

block out log quick on $ext_if proto { tcp, udp }
from any to <ICQDests>
block out log quick on $ext_if proto { tcp, udp }
from any to any port { 4000, 5190 }

INFO

  • Подробнее о настройке Squid можно прочитать в номерах ][ за май-июль 2008 года.
  • Чтобы заставить Netfilter глубже заглянуть внутрь пакетов, необходимо установить патч l7-filter.

WWW

Содержание
ttfb: 7.9360008239746 ms