Разработка своей собственной системы обнаружения атак
В этой книге я не ставил цель рассказать о том, КАК разработать свою собственную систему обнаружения атак. Это непростая задача, с которой не под силу справиться неслаженному коллективу разработчиков. Однако объяснить, как создать простейшую систему обнаружения атак, все же необходимо. Это позволит если не построить надежную систему противодействия атакам, то хотя бы существенно повысить защищенность вашей сети, а также вашу собственную квалификацию.
Большее внимание я уделю построению классических систем обнаружения атак, из которых основной упор будет сделан на сетевые системы. Связано это с тем, что все системы (и обнаружения атак, и анализа защищенности), функционирующие на уровне конкретного узла, "привязаны" к тем или иным операционным системам, имеющим свою специфику. Различных ОС существует очень большое количество и разработка универсального механизма обнаружения атак не представляется возможным. Создание системы анализа защищенности, анализирующей сетевой уровень информационной системы, немного проще, т. к. все функционирование построено на использовании стандартных протоколов и вызовов, описанных в RFC. Однако, как было показано в главе 8, каждая система анализа защищенности предпочитает свой собственный способ дистанционной проверки уязвимостей, причем наиболее часто такие способы основаны на использовании языков Perl, Tcl, С. Но данная книга не является пособием по программированию, и поэтому освещение вопросов разработки таких систем также выходит за ее рамки. Можно только порекомендовать ознакомиться с [Freiss1-98], [NASL1-00], [CyberCopl-00] и другой документацией, в которой описываются примеры создания проверок для различных систем анализа защищенности. Зато я более подробно остановлюсь на классических системах обнаружения атак уровня сети.
Обращаясь к главе 6, можно выделить несколько основных компонентов (модулей) системы обнаружения атак, отвечающих за:
· "прослушивание" сетевого трафика и захват данных для последующего анализа;
· фильтрацию данных;
· распознавание атак;
· реагирование на обнаруженные атаки.
"Прослушивание" и захват сетевого трафика может быть осуществлено с помощью библиотеки libpcap (library for packet capture). Данная библиотека (http://www.tcpdump.org) разработана для множества ОС семейства Unix и позволяет захватывать (capture) и "прослушивать" (sniffing) все пакеты, передаваемые в разделяемых средах передачи данных (shared media). Много системы обнаружения атак для Unix используют библиотеку libpcap в своей работе (например, SHADOW, snort и NFR), а многие разработчики еще и оптимизировали ее для различных платформ, в т. ч. существует версия и для платформы Windows (http://netgroup-serv.polito.it/winpcap/).И хотя с помощью этой библиотеки невозможно построить действительно эффективную систему обнаружения атак, способную справляться с трафиком в высокоскоростных сетях, она может помочь сделать первый шаг в этом направлении. Альтернативой libpcap может быть библиотека libnet (http://www.packetfactory.net/Projects/libnet) или ее версия для Windows (http://www.eeye.com/HTML/tools/libnetnt.HTML).
Следующим компонентом является модуль фильтрации. Он также может быть реализован с помощью свободно распространяемых утилит. Например, ngrep (http://ngrep.sourceforge.net/) или TCPdump. Эти средства основаны на механизме захвата необработанных (raw) пакетов сетевого трафика и пропускании их через синтаксический анализатор "регулярных выражений", который ищет в трафике соответствие шаблону. Примером шаблона можно назвать: "/cgi-bin/phf", указывающий на попытку использования уязвимого CGI-сценария PHF. Создавая такую систему, вы анализируете известные атаки, пишете для них сигнатуры, и добавляете их в базу данных системы обнаружения атак. Поскольку в данной книге все случаи обнаружения атак представлены на примере журнала регистрации утилиты TCPdump, то в дальнейшем будет рассматриваться именно она.
Сразу необходимо оговориться, что можно не "изобретать велосипед" и задействовать уже имеющиеся наработки в данной области. Например, системы SHADOW, snort (http://www.snort.org) или libnids (http://www.packetfactory.net/
Projects/libnids/). Исходный код названных утилит и библиотек доступен в Internet. К ним можно "прикрутить" что-то, что решает ваши задачи, но основное ядро остается неизменным. По такому пути идут многие независимые разработчики. Например, к системе Snort существует очень много дополнительных утилит и сценариев, расширяющих ее функциональность. К их числу можно отнести:
· Snort-panel и IDScenter — графический интерфейс к системе Snort;
· Guardian — реконфигурация межсетевого экрана IPCHAINS в случае обнаружения атаки;
· Snort_stat — статистический анализ журнала регистрации Snort;
· Snort2HTML и SnortSnarf — генерация HTML-отчета на основе журнала регистрации Snort;
· RotateLogs и snort_log_rotate — резервирование и очистка журналов регистрации Snort.
· С полным списком всех утилит, раздвигающих границы применения Snort, можно ознакомиться по адресу http://www.snort.org/snort-files.htm.
Самые простые системы обнаружения атак просто подают на вход утилиты regexp события, полученные при помощи библиотеки libpcap, или используют TCPdump. Эффективность такой системы напрямую зависит от количества и качества регулярных выражений, которые и описывают обнаруживаемые атаки. Однако разработчики некоторых средств поступают еще проще — они просто сопоставляют сетевые пакеты с сигнатурами известных атак. Системы, базирующиеся на regexp и libpcap, имеют одно крупное преимущество — простоту модификации базы данных сигнатур. Изделия этого класса (например, система Snort) поддерживают большое количество сигнатур и являются самыми часто и своевременно обновляемыми. Кроме того, простота реализации приводит к тому, что указанные системы бесплатно (или почти бесплатно) доступны в сети Internet, и любой желающий может использовать их в своей сети. Аналогичным образом никому не возбраняется самостоятельно изменять исходный код и добавлять сигнатуры атак в эти системы, тем самым расширяя их функциональность.
Однако, несмотря на большое число сигнатур, системы на основе regexp и libcap не могут выявлять атаки, состоящие из нескольких пакетов или использующие фрагментированные пакеты. Кроме того, эти системы не могут обнаружить атаки, немного отличающиеся (даже одним битом) от тех сигнатур, которые занесены в базу данных. Например, 8 байтов "СЕ 63 Dl D2 16 Е7 13 CF" в потоке данных, передаваемых по протоколу UDP, с высокой вероятностью говорят об активности "троянца" Back Orifice с паролем, заданным по умолчанию. И даже при том, что 80% всех злоумышленников оставляют пароль, заданный по умолчанию, остальные 20% (наиболее квалифицированные) изменяют его. Такая модифицированная атака не будет замечена системой, построенной на применении регулярных выражений. Многие из этих систем не обрабатывают также фрагментированные пакеты. И злоумышленник мог бы обойти систему обнаружения атак, просто изменяя значение MTU на своем компьютере. Справедливости ради необходимо отметить, что и более сложные и дорогостоящие коммерческие системы обнаружения атак зачастую не контролируют фрагментированные сообщения.
Для описываемых систем очень велик процент ложных срабатываний (false positives), при котором анализируемый трафик определяется как атака, несмотря на то, что реальной атаки в этом трафике нет. Например, указанные 8 байтов для "троянца" Back Orifice не настолько необычны, чтобы их нельзя было встретить в обычном трафике. Рассматриваемые системы в этом случае просигнализируют о присутствии Back Orifice там, где его на самом деле нет.
Однако такие системы существуют, и технологии, заложенные именно них, используются при создании своей, пусть не столь мощной, как Realsecure Network Sensor или Cisco Secure IDS, системы обнаружения атак.
Итак, как же построить свою собственную систему обнаружения сетевых атак?