Теория и практика сетевых атак
Данная статья представляет собой введение в теорию обнаружения сетевых атак. Кроме того, в ней представлен обзор одного из продуктов рынка систем обнаружения вторжений (IDS) - Snort, являющегося некоммерческим и, на мой взгляд, одним из лучших представителей IDS.
Итак, начнем с теории...
Обнаружение атак или вторжений можно разделить на 2 категории по факту и времени анализа. К первой можно отнести анализ информации, собранной за какой-либо конечный срок; ко второй - анализ в реальном времени. Отвергать одну из категорий - грубейшая ошибка администратора безопасности. Для точного анализа с принятием адекватных решений и действий на вторжение необходимо учитывать информацию, как получаемую в данный момент, так и уже имеющуюся. Т.е. подразумевается наличие опыта (набора или базы знаний) системы (хотя и администратор тоже должен быть не глупый).
Далее, после получения информации, производится ее анализ, который может сводиться либо к наложению фильтров (наиболее простой, хотя и в достаточной степени эффективный способ) либо анализ на основе интеллектуальной системы. Под наложением фильтров понимается сравнение массива или "базы" с заранее заложенными "регулярными
выражениями" (имеющими некоторый уровень определенности либо определенными полностью, и ранжированными по степени доверия или внимания) с данной информацией и выявление интересующих нас событий. А под интеллектуальной подразумевается система, способная на основе уже полученных ранее знаний (данные знания не "забиваются" в
систему, а абсорбируются в базу на основе алгоритмов системы - следует вывод, что чем лучше спроектированы алгоритмы абсорбции, тем выше уровень интеллектуальности, - хотя уровня искусственного интеллекта добиться вряд ли получится - так что без человека здесь,
увы, не обойтись - единственное, это только возможно свести к минимуму усилия им затрачиваемые) вычленять необычные события (в данном случае используется статистика событий).
Также данная система должна быть способна анализировать на будущее (так называемая экспертная система) - т.е. по ранее полученным данным и информации, получаемой в данный момент, строить предположения о дальнейшем развитии событий. Для накопления "знаний" интеллектуальными системами им необходимо время адаптации (обучения)
в данной среде, в течение которого происходит изучение и накопление событий в "базу знаний". (Вообще-то, на этапе обучения не плохо бы изолировать систему в среду с имитацией "нормальной работы", но имитация то как раз и является одним из сложных этапов - ведь одна ошибка может привести к полной неработоспособности системы в
дальнейшем.) Опять же при использовании только одного метода анализа мы рискуем что-либо упустить (один метод может дать анализ точнее чем другой). Например, отказ от использования фильтров может стоить того, что мы упустим какое-либо очевидное проявление атаки.
В последствии, в зависимости от результата анализа, система должна среагировать. В данном случае мы можем подразделить системы еще на 2 типа - активные и пассивные. Пассивные системы производят журналирование системы и сообщают о необычных проявлениях активности. Тогда как активные системы производят действия направленные на защиту от данной опасности или блокировку ее. Но активные системы не всегда оправдывают себя: например, системы, производящие блокировку какого-либо хоста при определении сканирования с его стороны, могут быть использованы злоумышленником
- он может преднамеренно (за счет спуффинга пакетов) ограничить доступ к хосту с такой системой.
Хотелось бы отметить, что при построении системы обнаружения сетевых атак необходимо рассматривать все возможности получения и анализа информации. Также, система
должна быть сбалансирована в зависимости от данной сети - ее топологии и расположения - что существенно влияет еще и на выбор средств обнаружения.
А теперь рассмотрим IDS Snort.
Данная система представляет собой анализатор событий сети в реальном времени, производящий как анализ трафика, так и запись пакетов сети. Она позволяет анализировать как содержимое так и состояние трафика. Snort может использоваться как снифер, логгер сетевых пакетов либо как система слежения за сетевой активностью. Нас интересует последнее, т.е. возможность обнаружения атак.
Итак, Snort можно охарактеризовать как систему, производящую анализ фильтрами (при большой базе знаний способен выявить практически все атаки - а кроме этого, он
(практически полностью) дает характеристику трафика - от пингов (даже ОС выдает), до попыток доступа к irc, icq и т.п.).
В файле конфигурации можно объявлять переменные, которые могут использоваться нами в дальнейшем. Общий вид такой - var ИМЯ_ПЕРЕМЕННОЙ значение. Обращаться к этой переменной можно потом так - $ИМЯ_ПЕРЕМЕННОЙ. <BR>Структура фильтра (правила) такова:
func proto src_ip/mask src_port_range -> dst_ip/mask dst_port_range (options)
Не буду особо вдаваться в подробности, а приведу лишь пример достаточной гибкости таких правил.
func -функция действия - alert, log, pass.
proto, src_ip/mask, src_port_range, dst_ip/mask, dst_port_range - протокол,
адрес_источника/ маска,порт(ы)_источника, адрес_назначения/маска,порт(ы)_назначения - соответственно.
вместо -> можно использовать <> для обозначения двусторонней передачи.
(options) - поле опций коих достаточное кол-во, где описываются фильтры состояния и содержания пакета. Опции имеют вид - имя_опции:значение
Вот, на мой взгляд, основные опции: msg -сообщение которое будет выводится в случае совпадения с данным фильтром.
flags - TCP флаги (S,F,A,U,P,R,0,1-reserved bit,2-reserved bit), можно использовать 0 если нет флагов.
ttl -время жизни пакета.
content - содержание пакета.
itype -номер типа icmp.
icode - номер кода icmp.
seq, ack - номер последовательности и подтверждения TCP.
id - идентификатор фрагмента.
logto - в какой файл производить журналирование
данного события.
ipopts - опции пакета.
Есть и другие (см. документацию).
Предположим мы хотим определять пакеты с установленными одновременно флагами SYN, FIN и RST. Вот так будет выглядеть данное правило:
alert tcp any any -> any any (msg:"А флаги то странные!"; flags: SFR;)
- все достаточно просто...
Кроме этого он способен (точнее один из его плагинов - Snort построен на основе системы плагинов, что позволяет нам добавлять новые средства анализа или реакций) следить за аномальным поведением в сети - выявлять подозрительную активность (некая интеллектуальная система) - так называемый Spade (лопатка). Она собирает статистику пакетов за определенный промежуток времени, и производит вычисление степени аномальности пакета (хотя, можно настроить чтобы данный плагин сообщал о каком либо проценте пакетов) и при превышении нормы начинает жаловаться... Кроме того, эти данные
интересно анализировать, и можно сделать выводы, когда ваша сеть наиболее загружена. :)
Также он способен реагировать в зависимости от результата анализа (совпадения с фильтрами) - может посылать RST-пакеты завершающие соединение как жертве, так и
атакующему (пока еще не реализована возможность запуска каких-либо скриптов или программ - есть повод написать плагин).
Это одна из опций - resp - может принимать значения:
rst_snd, rst_rcv, rst_all - посылает пакет завершения отправителю, получателю или
обоим сразу соответственно
icmp_net, icmp_host, icmp_port, icmp_all - посылает пакет недоступности сети, хоста, порта или все ответы сразу соответственно
Т.е. определим, например, переменную запрета данного соединения - var RESP_TCP_URG resp:rst_all
теперь напишем правило, которое в случае конекта к нам на порт 111 вырубало бы соединение.
alert tcp $ENEMY_NET any ->
$HOME_NET 111 (msg: "Kill connection to RPC!"; flags: S;
$RESP_TCP_URG)
Статья подошла к концу, и хотелось бы отметить, что благодаря Snort'у мной лично было выявлено множество попыток сетевых атак (на данный момент лидируют атаки против IIS они занимают первое место в моих рейтингах систем обнаружения ;). Но все-таки ограничиваться только лишь этим программным продуктом я бы не советовал... Для
получения эффективной и адекватной системы обнаружения атак необходимо использовать средства разностороннего анализа!!! (хотя хотелось бы иметь единое средство)...