28.12.2004

Фильтры грубой и тонкой очистки трафика

Статья вытаскивает на ваше обозрение два способа фильтрации трафика в сети. Первый способ использует не совсем обычную фильтрацию входящих пакетов по IP адресам источника, по сути, реализует защиту от спуфинга, второй - фильтрацию пакетов в локальной сети или DMZ используя технологию PVLAN.

Батранков Денис, denisNOSPAMixi.ru

Статья вытаскивает на ваше обозрение два способа фильтрации трафика в сети. Первый способ использует не совсем обычную фильтрацию входящих пакетов по IP адресам источника, по сути, реализует защиту от спуфинга, второй - фильтрацию пакетов в локальной сети или DMZ используя технологию PVLAN.

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

Введение. О фильтрации вообще.

Вы только посмотрите на формат заголовка IP пакета (эта структура взята из исходников WinPCap)

typedef struct ip_header{
u_char	ver_ihl;	// Version (4 bits) 
                           + Internet header length (4 bits)
u_char	tos;		// Type of service 
u_short tlen;		// Total length 
u_short identification; // Identification
u_short flags_fo;	// Flags (3 bits) + Fragment offset (13 bits)
u_char	ttl;		// Time to live
u_char	proto;		// Protocol
u_short crc;		// Header checksum
ip_address	saddr;	// Source address
ip_address	daddr;	// Destination address
u_int	op_pad;		// Option + Padding
}ip_header;

сколько полей требуют проверки на правильность уже на входе в сеть. Очевидно, у каждого поля существует множество значений которое определено в cтандарте RFC как имеющие какой-то смысл. И очевидно, что существует множество значений, которые не определены нигде, являются бессмысленными, и мы даже не можем предположить как эти значения будут восприняты хостом-получателем. Если у пакета хоть одно поле неправильное, то и весь он неправильный и он не должен засорять нашу сеть. Однако в настоящее время во многих сетях это не так. С такими пакетами разбирается на каждом хосте своя система защиты от атак (IPS). Я предлагаю не ждать, когда такие пакеты прибудут на хост получателя, а убивать их уже на входе в сети. Причем фильтровать и блокировать трафик мы можем последовательно начиная от канального и заканчивая уровнем приложений (в рамках модели ISO OSI). Это позволит разгрузить сеть и защитить от атак, которые пользуются тем, что мы "закрываем глаза" на неправильные пакеты.

Эта идея не нова. Намек на то, какие пакеты в вашей сети могут быть неправильными, содержится в правилах систем обнаружения атак. Системы обнаружения атак уже давно проверяют все поля пакетов и собирают статистику для анализа найденных неправильных пакетов, которую можно просмотреть и принять меры к наиболее назойливым. Мне больше всего нравится Snort, поскольку в нем все открыто для расширения возможностей. Это позволяет изменять стандартные правила или писать свои, анализировать статистику при помощи ACID и даже можно добавлять правила на блокирование IP адресов при помощи SnortSam в почти любой из известных на данное время FW: Cisco PIX, MS ISA, Checkpoint FW-1, Watchguard Firebox и встроенные в Linux и FreeBSD FW.

Однако, не ограничивая общности можно сказать, что у тех людей, которые пользуются какими бы то ни было системами обнаружения атак, например Сisco NetRanger, RealSecure(Proventia) или Snort, есть мечта: когда же наконец они прекратят генерировать ложные алерты. У меня, по крайней мере, есть такая мечта, поскольку у меня в четырех внешних сетках класса C постоянно происходит что-то новое, хотя типы информационных потоков уже давно устаканились. Я уже не получаю многие алерты типа BAD-TRAFFIC Unassigned/Reserved IP protocol, BAD TRAFFIC Non-Standard IP protocol, BAD-TRAFFIC loopback traffic, BAD-TRAFFIC same SRC/DST, BAD-TRAFFIC tcp port 0 traffic, не потому что я отключил эти правила, а потому что я заблокировал этот "плохой трафик" сразу же на входе. К сожалению, на сегодняшний день приходится игнорировать различные события, зная, что это обычная ложная тревога и заблокировать я это не могу, поскольку любой провайдер не должен блокировать трафик клиенту каким бы он ни был: опасным или просто бесполезным. Но уж "неправильный" трафик я себе блокировать позволяю: неправильные адреса, неправильные флаги, неправильные или опасные порты.

Понятно почему есть системы IDS, которые показывают администратору какой трафик является плохим, но нет программ, которые бы автоматически фильтровали трафик на входе и выходе ваших сетей так, чтобы Snortу было не на что было ругаться. Проблема в ложных алертах. Есть много правил у того же Snort, которые должны не просто детектировать нестандартное поведение, а сразу же его блокировать. Например логично заблокировать трафик который удовлетворяет условию BAD-TRAFFIC ip reserved bit set, то есть те пакеты у которых неправильно выставлен резервный бит. (Кстати, вспомните ли вы сходу какой firewall сможет проверить такое условие и заблокировать такой пакет? ;-) ) С другой стороны есть и алерты о полезности которых можно поспорить. Например, недавно стоящие у меня в сети eMule стали виновниками алертов BACKDOOR typot trojan traffic.

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

Фильтр грубой очистки. Защита от спуфинга IP адресов.

Поскольку я пишу не книгу, а статью, то я сегодня докопаюсь лишь до одного поля IP пакета: source address. Известно, что там находится IP адрес источника пакета. И, насколько мне известно, в технологии Cisco SAFE советуют фильтровать это поле согласно RFC 2827 и 1918 для защиты от IP спуфинга. Давайте разберемся какие точно адреса мы должны блокировать. (Поле адреса получателя (destination address) должно быть в пределах выделенного вам адресного пула, поэтому тут рассуждать не о чем.)

Итак мы знаем, что начиная с 1 января 1983 года было введено понятие IP адреса 4 версии, который представляет из себя 32 битное число, которое мы обычно записываем в виде 4-х десятичных чисел, разделенных точкой. Существует организация Internet Assigned Numbers Authority (IANA), которая распределяет адреса во всем Интернет. Существуют четыре Regional Internet Registries (RIR) распределенных по миру: APNIC (Asia Pacific Network Information Centre) , ARIN (American Registry for Internet Numbers) , LACNIC (Latin American and Caribbean IP address Regional Registry), RIPE NCC, которые распределяют адреса между Internet Service Providers (ISP). И наконец существует табличка на сайте IANA, в которой записано какой блок адресов кому отдан.

Если попытаться классифицировать адреса, то кроме (изучаемых уже сейчас в школе) классов А,B,C,D,E мы обнаруживаем что существуют специальные адреса, определяемые не только RFC 1918, но и RFC 3330, и которые не должны быть использованы в Интернет.

1. Приватные адреса - зарезервированы под использование в локальных сетях согласно RFC 1918.

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255
2. Адреса получаемые при автоматическом назначении IP адреса самому себе при отсутствии DHCP сервера и согласно RFC 3330 тоже не должны выходить за пределы локальной сети.

  • 169.254.0.0 - 169.254.255.255
3. Loopback адреса используемые для проверки работы TCP стека. Используются каждым хостом только для самого себя.

  • 127.0.0.0 - 127.255.255.255

4. Тестовый диапазон - должен использоваться в документациях и примерах кода.

  • 192.0.2.0–192.0.2.255
5. Multicast адреса не могут стоять в поле источника. Только в поле получателя пакета, поскольку используются для обращения к группе хостов.

  • 224.0.0.0 - 239.255.255.255
6. Зарезервированные и невыделенные никому адреса. Эти адреса перечислены все на той же табличке на сайте IANA. На 12 декабря 2004 года в резерве следующие блоки

  • 0.0.0.0 - 2.255.255.255
  • 5.0.0.0 - 5.255.255.255
  • 7.0.0.0 - 7.255.255.255
  • 23.0.0.0 - 23.255.255.255
  • 27.0.0.0 - 27.255.255.255
  • 31.0.0.0 - 31.255.255.255
  • 36.0.0.0 - 37.255.255.255
  • 39.0.0.0 - 39.255.255.255
  • 41.0.0.0 - 42.255.255.255
  • 49.0.0.0 - 50.255.255.255
  • 73.0.0.0 - 79.255.255.255
  • 89.0.0.0 - 126.255.255.255
  • 173.0.0.0 - 187.255.255.255
  • 189.0.0.0 - 190.255.255.255
  • 197.0.0.0 - 197.255.255.255
  • 223.0.0.0 - 223.255.255.255
  • 240.0.0.0 - 255.255.255.255

Последний список впечатляет. И мы еще жалуемся, что нам не хватает адресов. И это я еще объединил несколько блоков адресов, если они находились рядом в списке.

7. Есть еще один класс адресов, который не может быть в поле sources. Это ваши собственные адреса. Те адреса Интернет, которые выделены вам и только вам провайдером. Очевидно, что никто кроме вас не имеет права пользоваться ими и вы должны блокировать любые попытки прислать пакет с адресом источника из вашего пула адресов. Тем более, что подстановка вашего адреса в поле sources может использоваться для реализации различных атак. Например, в атаке Land, посылается SYN-пакет с адресом отправителя, совпадающим с адресом получателя.

Итак, оказалось что существует достаточно большое множество адресов, которых не может быть в поле sources наших IP пакетов. Как правило, если в sources прописан один из перечисленных выше адресов, то это либо неправильно работающая у вышестоящего провайдера маршрутизация (выпускающая наружу неправильные адреса), либо возможная DOS атака. Именно поэтому я предлагаю заблокировать все перечисленные выше адреса на входе вашего маршрутизатора.

Суммируя вышесказанное, мы получаем достаточно приличный список адресов отправителя, который мы должны блокировать. Например, если вы используете маршрутизатор Cisco то access-list будет выглядеть следующим образом:

ip access-list extended complete_bogon

Используем именованный расширенный список доступа

deny ip 0.0.0.0 1.255.255.255 any

IANA Reserved

deny ip 2.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 5.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 7.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 10.0.0.0 0.255.255.255 any

RFC 1918

deny ip 23.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 27.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 31.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 36.0.0.0 1.255.255.255 any

IANA Reserved

deny ip 39.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 41.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 42.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 49.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 50.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 73.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 74.0.0.0 1.255.255.255 any

IANA Reserved

deny ip 76.0.0.0 3.255.255.255 any

IANA Reserved

deny ip 82.0.0.0 1.255.255.255 any

IANA Reserved

permit 88.0.0.0 0.255.255.255 our_net

разрешим доступ с адресом 88/8 в нашу сеть (чтобы не заблокировать ниже)

deny ip 88.0.0.0 7.255.255.255 any

IANA Reserved

deny ip 96.0.0.0 31.255.255.255 any

IANA Reserved и Loopback

deny ip 169.254.0.0 0.0.255.255 any

автоназначенные адреса

deny ip 172.16.0.0 0.15.255.255 any

RFC 1918

deny ip 173.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 174.0.0.0 1.255.255.255 any

IANA Reserved

deny ip 176.0.0.0 7.255.255.255 any

IANA Reserved

deny ip 184.0.0.0 3.255.255.255 any

IANA Reserved

deny ip 189.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 190.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 192.0.2.0 0.0.0.255 any

Адреса для тестов.

deny ip 192.168.0.0 0.0.255.255 any

RFC 1918

deny ip 197.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 198.18.0.0 0.1.255.255 any

IANA Reserved

deny ip 201.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 222.0.0.0 1.255.255.255 any

IANA Reserved

deny ip 223.0.0.0 0.255.255.255 any

IANA Reserved

deny ip 224.0.0.0 31.255.255.255 any

Multicast и затем IANA Reserved

deny ip our_net any

блокируем наши адреса на входе

permit ip any our_net

разрешаем все остальное

our_net я обозначил ваш блок адресов. Например, он может выглядеть как 194.194.194.0 0.0.0.255 согласно правил написания access-listов.

Неважно где будет реализован этот метод фильтрации на вашем пограничном маршрутизаторе, межсетевом экране или даже на сервере, но самое главное что атакующий лишается возможности использовать адреса из несуществующих сетей. Хочу заметить, что если вы пользуетесь Cisco IOS последних версий (12.2 и выше), то вам не нужно этот access-list делать самому. Такой же access-list формируется простой (казалось бы) командой auto secure.

Команда auto secure делает ВСЁ за специалиста по компьютерной безопасности! Все что наработано на сегодняшний день по защите маршрутизаторов Cisco делается этой одной командой. Вы, конечно, должны представлять что она делает, когда вводите ее, но эта команда сделает все, даже если у вас нет никаких сертификатов и образования в этой области. :( Я вообще когда узнал про возможности auto secure решил, что вот и пришла пора бросать заниматься безопасностью и пойти утюги продавать - там и зарплата, говорят, больше и высшее образование не нужно. ;-) Зачем теперь специалисты, если все делается одной командой.

Однако у этого метода есть минус: вам нужно постоянно отслеживать изменения в таблице на сайте IANA http://www.iana.org/assignments/ipv4-address-space, чтобы после изменения этого списка вы изменили свой access-list. Например, последнее изменение было в августе этого года: выделены сети 71/8, 72/8 для ARIN. Я не знаю есть ли готовый скрипт для выполнения этой работы, но если вы найдете такой или напишете сами, то общество будет Вам благодарно. Есть одна страничка, где всегда хранится актуальный access-list http://www.cymru.com/Documents/secure-ios-template.html, но там список доступа слегка длинноват. Его можно сократить. Принцип сокращения такой

deny ip 0.0.0.0 0.255.255.255 any
deny ip 1.0.0.0 0.255.255.255 any

меняем на

deny ip 0.0.0.0 1.255.255.255 any

и так далее.

В случае если на входе в сеть нет такого фильтра, то возможно вам хочется настроить фильтр на своем собственном сервере или рабочей станции. Кстати авторы персональных FW могли бы взять это на вооружение. Это поможет защитить хост от DOS атак. Вот, например, пример атиспуфингового фильтра для BIND.

После того как мы разобрались с адресами, можно заняться другими полями IP пакета. Например, мне в сеть очень часто приходят tcp пакеты с портом 0. Почему бы вам не посмотреть какие порты используются в пакетах ходящих по вашей сетке.

Фильтр тонкой очистки или Isolated VLAN.

Теперь посмотрим на трафик во внутренней сети. Одним из ключевых факторов построения безопасной конфигурации сети является точное определение всех объектов сети и точное понимание с кем нужно обмениваться информацией каждому из этих объектов и какой вид трафика при этом порождается. Весь другой трафик между этими объектами должен быть отклонен.

Давайте рассмотрим на примере Демилитаризованной зоны (DMZ). Считается правильным выделять сервера компании в отдельную сеть, защищенную как от пользователей из Интернет, так и от внутренних пользователей. Как говорят, доверяй, но проверяй. На картинке показаны два возможных варианта реализации: DMZ располагается между двумя Firewall и DMZ висит на одном из портов Firewall.

Итак, межсетевые экраны фильтруют трафик, приходящий из Интернет и из локальной сети. И, как правило, дизайнеры сети успокаиваются на этой схеме. Все сервера подключаются через один свитч и оказываются в одном широковещательном домене. Однако нужно ли взаимодействие между серверами в DMZ друг с другом? Нужно смотреть в каждом конкретном случае. Можно предположить, что если будет взломан один из серверов DMZ, то с этого сервера возможна атака на соседний сервер, тем более что мы на этапе проектирования никак не защитили один сервер от другого. Таким образом, в тех случаях, когда серверы не должны функционировать друг с другом рекомендуется делать несколько отдельных DMZ. Однако лучшим вариантом является использование PVLAN. Если порты, к которым подключены серверы не будут пересылать пакеты друг другу на канальном уровне, то не будет никакого трафика между серверами и единственный способ для них связаться друг с другом - пройти через Firewall, на котором это соединение должно быть разрешено и передано на нужный порт. Такие порты которые не передают трафик друг другу на канальном уровне называются изолированными.

Та же идея применима и к компьютерам внутри локальной сети. Внимательно проанализируйте информационные потоки и явно задайте при помощи свитча, между какими компьютерами возможен обмен данными.

Данная технология появилась недавно и реализована только на последних свитчах фирмы Cisco. Список оборудования которое поддерживает PVLAN можно посмотреть на сайте в таблице.

С помощью этого же механизма можно объединять пользователей в группы (community), в пределах которых организуется их "выделенное" общение. При этом и изолированные пользователи, и группы могут передавать свой трафик в так называемые публичные (promiscuous) порты, на которых работает маршрутизатор, межсетевой экран и система обнаружения атак.

У Сisco PVLAN реализован так, что трафик, который приходит на promiscuous порт может быть распределен по любым другим портам типа isolated и community. Трафик, который приходит на isolated порт может быть направлен только на promiscuous порт. Трафик, который приходит на community порт может быть направлен на promiscuous порт и на порты принадлежащие этой же community.

Таким образом, даже находясь в одном VLAN хосты у которых в схеме информационных потоков не должно быть взаимного трафика не будут получать ни единого пакета друг от друга. Единственная возможность обменяться информацией – прописать явно правило на межсетевом экране или маршрутизаторе разрешающее передавать пакеты между ними. Но это правило уже работает на третьем уровне модели OSI и в этом случае можно применять access-list и правила межсетевого экрана для явного указания разрешенных портов и протоколов.

Если копнуть более глубоко, то когда хост 1 посылает ARP запрос (в поиске MAC адреса хоста 2 с нужным ему IP из той же подсети) хост 2 не получает это запрос и не отвечает хосту 1, поскольку оба сидят на изолированных друг от друга портах. Мы добились того, что хост 1 считает, что хост 2 недоступен и наоборот. Таким образом решается задача контроля трафика внутри сети и, самое главное, не нужно разбивать сеть на подсети. Мы можем безболезненно наложить технологию PVLAN на уже имеющиеся сети.

Когда же нам становится нужно, чтобы сервера общались друг с другом, то маршрутизатор (или firewall) может ответить, что этот хост доступен через него. Эта техника называется Proxy ARP. Хост 1 думает, что хост 2 находится в другом сегменте и посылает IP пакет через маршрутизатор (или firewall). То есть получается, что в пакете стоит MAC адрес маршрутизатора, и IP адрес хоста 2. А вот маршрутизатор (или firewall) уже решает передавать пакет хосту 2 или нет.

Надо заметить, что есть и уязвимость этого метода: если у вас используется маршрутизатор который не имеет никаких правил доступа и, не задумываясь, маршрутизирует все пакеты, что к нему приходят, то злоумышленник с хоста 1 может специально послать пакет с МАС адресом маршрутизатора, но с IP адресом хоста 2. Такой пакет пройдет через isolated port к маршрутизатору и затем будет послан маршрутизатором на хост 2. Поэтому, надо либо добавить правила доступа на маршрутизаторе (или firewall) запрещающие или разрешающие такие пакеты явно, либо пользоваться дополнительно VLAN Access Control List (VACL) на свитче.

Раньше в рамках одного свитча была похожая возможность которая называлась protected port, но она работала только в пределах одного свитча и информация о protected портах не передавалась по транкам. Сейчас это понятие расширено и дополнено community портами.

Технология PVLAN может быть практически реализована на достаточно большом количестве выпускаемых в настоящее время управляемых коммутаторов имеющих порты Ethernet со скоростью работы 10/100/1000 мегабит в секунду.

Конкретная реализация этих схем на свитчах Cisco описана здесь.

Мир вашему дому.

 

или введите имя

CAPTCHA