Александр Неупокоев
Безопасность в сетях, построенных на Layer2-коммутаторах
В этой статье будет рассмотрено, как можно произвести атаки на Layer2-сети и как можно защитить такую сеть от нападения с помощью оборудования Cisco Systems.
Типы Layer2-атак
- Переполнение CAM-таблицы (Content Address Memory) – злоумышленник флудит таблицу MAC-адресов коммутатора, к которому он подключен, с целью переполнения соответствующей таблицы. После переполнения CAM-таблицы, коммутатор начинает работать в режиме простого хаба. То есть при получении кадра на порт коммутатора коммутатор рассылает кадр на все порты, за исключением того, от которого пришел данный кадр.
- VLAN Hopping – смысл атаки заключается в том, что злоумышленник может получить доступ к другому устройству в сети не из своего VLAN.
- Атака на STP – смысл атаки заключается в том, что злоумышленник с помощью программных средств может отправить коммутатору пакет BPDU, в котором указать высокий приоритет и меньший MAC-адрес и тем самым стать «корневым коммутатором» с целью перехвата сетевого трафика.
- MAC-спуфинг – злоумышленник может подменить MAC-адрес с целью захватить трафик необходимого ему устройства.
- Атака на PVLAN – Private Vlan, это виланы, которые составляют одну подсеть (как правило), и между хостами этого вилана связи быть не должно. Но злоумышленник может получить доступ к соседнему устройству PVLAN посредством устройства L3 (роутера).
- Атака на DHCP – злоумышленник может заполнить весь пул DHCP с помощью генерации большого количества запросов с несуществующими MAC-адресами. Что приведет к DOS-атаке, т.е. отказу в обслуживании, так как после заполнения пула сервер не сможет выделять адреса реальным хостам. После чего атакующий может поднять собственный DHCP-сервер, и хосты сети будут получать от недоверительного сервера все настройки, которые укажет злоумышленник. Например, он может направить весь трафик через свой хост и таким образом перехватить и просканировать его на предмет служебной информации.
Рассмотрим эти атаки и меры борьбы с ними более подробно.
Переполнение CAM-таблицы
Коммутатор имеет CAM-таблицу, где содержится «привязка», какие MAC-адреса на каком порту принимаются.
Разумеется, CAM-таблица не бесконечна и имеет свои размеры. Например, коммутатор Catalyst 2960 может содержать 8192 MAC-адресов, Catalyst 6000 серии – 128000 MAC-адресов.
Стоит подумать, а что же произойдет, когда вся таблица будет занята? Новые записи не смогут добавляться, весь трафик будет проходить на все порты.
Что это даст атакующему вполне очевидно. Он может «прослушать» весь сетевой трафик и получить конфеденциальную информацию.
Стоит отметить, что всё это действенно для VLAN, в котором находится злоумышленник, т.е. после переполнения данной таблицы атакующий не сможет прослушивать весь сетевой трафик, который «ходит» через коммутатор, а лишь своего VLAN, но и это не очень радостно.
Какие же существуют способы борьбы с данным видом атаки?
Логика подсказывает, что для подавления такой атаки нам необходимо указать, что на порту коммутатора, к которому подключен пользователь, может быть, скажем, не больше одного MAC-адреса, а в случае если появляется более одного, перевести порт в отключенное состояние и отправить сообщение администратору о нарушении безопасности (например, на syslog-сервер).
Рассмотрим на примере. Допустим, у нас есть коммутатор Cisco Catalyst 2960 и 24 порта, к которым подключены пользователи. Нужно сделать так, чтобы на каждом порту мог быть только один хост (иными словами, только один MAC-адрес).
Для этого заходим в режим глобального конфигурирования:
switch# conf t
Затем перейдем к конфигурированию портов, выберем сразу все, с 1 по 24:
switch(config)#int range f0/1
Затем укажем, что все эти порты являются портами доступа:
switch(config-if-range)#switchport mode access
Включаем защиту порта port-security:
switch(config-if-range)#switchport port-security
Выбираем реакцию на нарушения нашей политики безопасности, т.е. что будет коммутатор делать, когда на порту появится больше MAC-адресов, чем нами указано. В данном случае мы хотим, чтобы порт выключался и посылалось соответствующее сообщение по SNMP trap и syslog. Данную опцию можно не указывать принудительно, она действует по умолчанию.
Также существуют режимы: protect и restrict. Смысл этих режимов заключается в том, что порт не будет выключаться (т.е. переходить в состояние shutdown), а лишь будут блокироваться пакеты, если обнаружено нарушение, связанное с MAC-адресами. Protect от Restrict отличается тем, что при возникновении внештатной ситуации restrict может послать snmp trap и syslog-сообщение о нарушении политики безопасности:
switch(config-if-range)#switchport port-security violation shutdown
Соответственно указываем, сколько MAC-адресов мы готовы увидеть на этом порту. В данном случае 1 MAC-адрес, значение 1, устанавливается по умолчанию.
switch(config-if-range)#switchport port-security maximum 1
Поставим порт коммутатора в режим обучения, т.е. первый MAC-адрес, который будет получен через этот порт, будет прописан автоматически в running-config. Запись будет сохраняться до тех пор, пока не будет перезагружен коммутатор. Либо если выполнить команду «copy running-config startup config» (или просто wr), то значение привязки MAC-адреса к порту будет сохранено и в дальнейшем может использоваться даже после перезагрузки коммутатора.
switch(config-if-range)#switchport port-security mac-address sticky
Данной меры вполне достаточно, чтобы избежать атаки на переполнение CAM-таблицы.
Команда для просмотра установок, сделанных на портах, связанных с port-security:
show port-security
Пример:
catalyst#show port-security
Secure Port MaxSecureAddr CurrentAddr SecurityViolation Security Action
(Count) (Count) (Count)
---------------------------------------------------------------------------
Fa0/1 2 2 38174 Restrict
Fa0/2 2 2 21601 Restrict
Fa0/3 3 3 6346 Restrict
Fa0/4 2 2 34777 Restrict
Fa0/5 2 2 0 Restrict
skipped
Fa0/48 2 2 26 Restrict
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port) : 35
Max Addresses limit in System (excluding one mac per port) : 8320 |
Следующая команда покажет вам, на каких портах включен port-security и как они сконфигурированы относительно безопасности port-security:
show port-security interface имя_интерфейса
Пример:
catalyst#show port-security int
ASW-ZU2#show port-security interface f0/1
Port Security : Enabled
Port Status : Secure-up
Violation Mode : Restrict
Aging Time : 0 mins
Aging Type : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses : 2
Total MAC Addresses : 2
Configured MAC Addresses : 0
Sticky MAC Addresses : 2
Last Source Address:Vlan : 001b.d491.4b1a:1
Security Violation Count : 38176 |
В отличие от предыдущей команды вывод покажет настройки конкретного интерфейса.
VLAN Hopping
Рассмотрим более подробно данный вид атаки, способ реализации и как ее предотвратить.
Цель данной атаки в том, что пользователь может попытаться передать данные в другой VLAN. Давайте рассмотрим, как это сделать. Как подсказывает логика, это возможно, когда атакующий может инициировать trunk-режим.
В коммутаторах Cisco Catalyst по умолчанию порт работает не в режиме mode access и не в режиме mode trunk, таким образом, на порту работает протокол DTP (Dynamic Trunk Protocol).
В такой ситуации стоит атакующему «притвориться» коммутатором, как между ними будет установленно транковое соединение, и соответственно будут доступны VLAN, сконфигурированные на коммутаторе, и после чего передать данные в другой VLAN не составит труда. Бороться с этим не легко, а очень легко.
Для начала нужно все используемые интерфейсы коммутатора принудительно перевести в режимы access и trunk, где это положено. Неиспользуемые порты необходимо перевести в shutdown, и перенести их в несуществующий VLAN, который будет известен только данному коммутатору, т.е. не передаваться по trunk-портам другим коммутаторам.
Для перевода порта в режим доступа необходимо переключиться в режим глобального конфигурирования:
switch# conf t
Заходим в настройку порта:
switch(conf)#int f0/1
Принудительно указываем режим доступа:
switch(config-if)#switchport mode access
Для того чтобы перевести порт коммутатора в режим trunk, в режиме конфигурации интерфейса выполните следующую команду:
switch(config-if)#switchport mode trunk
Для неактивных портов создадим специальный VLAN, скажем, под номером 666, дадим ему имя unconnected и перенесем все неиспользуемые порты в этот самый VLAN и сделаем им shutdown.
Создаем VLAN.
switch(conf)#vlan 666
Даем ему имя:
switch(config-vlan)#name Unconnected
switch(config-vlan)#exit
Переносим необходимые нам порты (например, с 12 по 24) в созданный VLAN.
switch(conf)#int range f0/12 - 24
switch(config-if-range)#switchport access vlan 666
switch(config-if-range)#shut
Описанные настройки позволят противостоять атакам типа VLAN Hopping.
Атака на STP
Как известно, STP (Spanning Tree Protocol) – это протокол, предназначенный для предотвращения зацикливания пакетов в сети, при наличии дублирующих маршрутов. Расскажу вкратце, как он работает.
Сначала происходит обнаружение коммутаторов, которые связаны между собой. Затем выбирается так называемый Root Bridge, т.е. главный «корневой коммутатор». Далее по специальному алгоритму будут заблокированы порты коммутатора, которые создают петли в получившейся топологии. Более подробно работу STP мы не будем рассматривать.
Что может сделать атакующий?
Атакующий может также «притвориться» коммутатором, направить в сторону коммутатора BPDU-пакет, в котором он может подделать приоритет, MAC-адрес, для того чтобы стать «корневым коммутатором» и с его помощью перехватить сетевой трафик.
Корневым коммутатором становится тот, у которого самый высокий приоритет. Если приоритет у нескольких коммутаторов одинаковый, то для выбора корневого коммутатора используется MAC-адрес, у кого он меньше, тот и становится корневым.
Постараемся избавиться от этой уязвимости. Что для этого необходимо?
- Запретить хождение BPDU-пакетов с портов, в которых мы точно знаем, что там нет никаких коммутаторов. И в случае если такой пакет всё же пришёл, переводить этот порт в shutdown.
- Обезопасить наш корневой коммутатор, чтобы ни при каких условиях не мог быть выбран другой корневой коммутатор, в том числе и наш атакующий (атакующему не составит труда поставить приортитет лучше, чем у настояшего главного коммутатора, и MAC-адрес поменьше, что будет гарантировать, что атакующий представляется root).
Перейдем к реализации данной идеи непосредственно на коммутаторе.
Для начала на всех портах доступа поставим специальный режим STP, который называется portfast. После этого клиент, подключенный к такому порту, не будет принимать участия в разрешении маршрутов по алгоритму STP, и данные будут передаваться ему сразу. Если данная опция включена не будет, то сначала подключенный клиент инициирует пересчет маршрутов по алгоритму STP (это может занять достаточно много времени, десятки секунд и даже больше), и лишь после того будут начинать передаваться пользовательские данные через порт.
По умолчанию portfast на Cisco Catalyst отключен, и это нужно будет сконфигурировать вручную.
Будем конфигурировать Portfast на портах f0/1 – 24.
switch# conf t
switch(config)#int range f0/1 - 24
switch(config-if-range)#spanning-tree portfast
Далее укажем, что на этих портах хождение BPDU-пакетов противопоказано, для этого в режиме глобальной конфигурации необходимо сделать следующее:
switch(config)#spanning-tree portfast bpduguard default
Теперь при появлении на портах, на которых указан режим STP portfast, BPDU-пакета, порт будет отключаться, т.е. переходить в режим shutdown.
И последнее, необходимо обезопасить наш Root Bridge. Для этого необходимо перейти в конфигурацию интерфейса, к которому подключен другой коммутатор, и сделать следующее:
switch(config)# int f0/1
switch(config-if)spanning-tree guard root
Теперь, в случае если появится злоумышленник и направит в сторону коммутатора пакет BPDU с максимальным приоритетом и меньшим MAC-адресом, это не позволит стать ему «корневым коммутатором»
MAC Spoofing
MAC Spoofing – это атака, реализуемая путем подделывания MAC-адреса, например, атакующий может подделать MAC-адрес, который использовал другой хост сети. Что это может дать атакующему, зависит от политики безопасности сети. Для того чтобы предотвратить данный тип атаки, необходимо выполнить меры, которые описаны в разделе «Переполнение CAM-таблицы», т.е. необходимо указать максимальное количество MAC-адресов на порту, указать действие, которое будет выполнено в случае нарушения нашей политики (shutdown, restrict, protect).
Указать MAC-адреса статически, динамически либо в режиме обучения.
Для указания статического MAC-адреса, в режиме конфигурирования интерфейса необходимо выполнить:
switch(config-if)# switchport port-security mac-address 3234.2343.fa12
где 3234.2343.fa12 – MAC-адрес клиента.
Для указания динамического MAC-адреса ничего дополнительного не делается, необходимо только включить функцию port-security, как было описано выше.
Чтобы указать режим обучения MAC-адресов, необходимо выполнить в режиме конфигурирования интерфейса команду:
switch(config-if-range)#switchport port-security mac-address sticky
Указать время жизни записей ARP-таблицы. Рассмотрим пример, в котором установим максимальное количество адресов на порту равным 1, действие shutdown и укажем, что ARP-таблица имеет таймер в 60 секунд.
switch# conf t
switch(config)#int range f0/1 - 24
switch(config-if-range)#switchport mode access
switch(config-if-range)#switchport port-security
switch(config-if-range)#switchport port-security violation shutdown
switch(config-if-range)#switchport port-security maximum 1
switch(config-if-range)#arp timeout 60
В этом примере все порты коммутатора FastEthernet с 1 по 24 переведены в режим доступа, применена технология port-security. На каждом порту может находиться лишь один клиент одновременно, об этом говорит команда «switchport port-security maximum 1», данный параметр установлен по умолчанию, и поэтому в конфигурационном файле этой команды видно не будет. В случае если на порту появилось сразу два и более MAC-адреса, порт переводится в режим shutdown. Команда «arp timeout 60» говорит о том, что MAC-адрес будет находиться в ARP-кэше 60 секунд без обновления.
Атака на PVLAN (Private VLAN)
В технологии PVLAN в отличие от VLAN порты могут находиться в трёх режимах:
- Isolated;
- Promiscuous;
- Community.
Порты, которые отмечены как Isolated, не могут передавать данные в своем VLAN между клиентами. Данные передаваться могут только между портами Isolated и Promiscuous.
Порты Promiscuous – это порты в PVLAN, в которые можно передавать данные со всех портов Isalated и Community, как и в обычном VLAN.
Community – это группы портов, между членами которых можно передавать данные, можно назвать VLAN во VLAN.
Если атакующему доступно устройство Layer 3 (например, маршрутизатор либо коммутатор третьего уровня), он может установить связь между клиентами, которые находятся в одном PVLAN, между портами Isolated. Как это можно реализовать?
Пользователь может подделать пакет, в котором он укажет в IP-адресе назначения необходимое ему устройство (которое находится на другом порту Isolated), источник останется без изменения, а вот в качестве MAC-адреса назначения он укажет MAC-адрес устройства L3. L3-устройство получит данный пакет и может переправить его по указанному адресу. Принимающая сторона может сделать то же самое, тем самым обеспечив передачу данных между Isolated-портами.
Предотвращение такой атаки сводится к тому, что на устройстве L3 создается специальный Access List, в котором запрещается прямая передача данных между сегментом сети. Рассмотрим пример настройки.
router#conf t
router(config)#ip access-list extended pvlan
router(config-ext-nacl)#deny ip 10.0.0.0 0.0.0.255 10.0.0.0 0.0.0.255
router(config-ext-nacl)#permit any any
router(config-ext-nacl)#exit
router(config)#int f0/1
router(config-if)#ip access-group pvlan in
Таким образом был создан список управления доступом под названием PVLAN, в котором указывается, что с сети 10.0.0.0/24 запрещено передавать данные в 10.0.0.0/24, всё остальное разрешено. И этот список доступа последней командой был связан с интерфейсом f0/1.
Описанные выше настройки не позволят атакующему установить связь между клиентами одного PVLAN, между Isolated-портами используя L3-устройство.
Атака на DHCP
Существуеет несколько способов атаковать DHCP-сервер.
1. Злоумышленник может сформировать и послать DHCP-серверу огромное количество DHCP-запросов с разными MAC-адресами. Сервер будет выделять IP-адреса из пула, и рано или поздно весь DHCP-пул закончится, после чего сервер не сможет обслуживать новых клиентов. Данный вид атаки можно классифицировать как DoS (Denial of Service – откзаз в обслуживании). Нарушается работоспособность сети.
Метод борьбы с такими атаками называется DHCP Snooping. Вкратце рассмотрим, как это работает. Когда коммутатор получает пакет, то он сравнивает MAC-адрес, указанный в DHCP-запросе, и MAC-адрес, который был прописан на порту коммутатора. Если адреса совпадают, то коммутатор отправляет пакет дальше. Если адреса не совпадают, то коммутатор отбрасывает пакет.
2. Злоумышленник может поставить свой DHCP-сервер и выдавать свои настройки пользователям сети (может указать любой DNS, Gateway и т. д.), и воспользоваться уже по своему усмотрению, начиная от прослушивания трафика до подделки DNS-ответов, и т. д.
Если в сети существует несколько DHCP-серверов, то на запрос будут отвечать все серверы, но клиентом будет обработан только первый ответ. Какой из DHCP-серверов ответит быстрее и чей ответ быстрее дойдет до клиента зависит от многих факторов, таких как: загрузка DHCP-сервера, загрузка сети и т. д.
Для того чтоб злоумышленник был уверен, что именно от его DHCP-сервера клиент получит ответ, атакующим может быть предварительно произведена DoS-атака на легальные DHCP-сервера способом, описанным в 1-м пункте.
В технологии DHCP Snooping существует понятие доверительных и недоверительных портов (trusted и untrusted соответственно). Доверительные порты – это порты, с которых может приходить ответ DHCP (DHCPOFFER и так далее), а недоверительные порты – это порты, с которых не могут приходить ответы DHCPOFFER.
Доверительные порты указываются вручную. Все порты, которые не указаны доверительными, автоматически становятся недоверительными. Порт, который непосредственно подключен к DHCP-серверу, должен быть объявлен как доверительный (trust порт).
DHCP Snooping настраивается для каждого VLAN. Для настройки DHCP Snooping необходимо сначала включить snooping в режиме глобальной конфигурации, затем включить на нужном VLAN, затем указать trust-порты. Рассмотрим на примере.
switch(config)# ip dhcp snooping
switch(config)# ip dhcp snooping vlan 10
switch(config)#int f0/1
switch(config-if)#ip dhcp snooping trust
В данном примере мы включили защиту DHCP на VLAN 10. Интерфейс f0/1 у нас подключен непосредственно к DHCP-серверу, поэтому на нем мы включили trust.
Также можно включить или выключить опцию 82 DHCP (которая отвечает за информацию relay, т.е. через какие коммутаторы прошёл данный пакет, аналогию можно провести с таблицей маршрутизации). Делается в режиме глобального конфигурирования командой:
switch(config)#ip dhcp snooping information option
Также есть возможность включить ограничение количества запросов DHCP в секунду. Делается это на интерфейсе, в нашем случае f0/1. К этому параметру нужно относиться с осторожностью. Если количество запросов в секунду будет больше, чем мы указали (в нашем примере 100), то запросы будут отклонены.
switch(config)#interface fa0/1
switch(config-if)#ip dhcp snooping limit rate 100
Заключение
В статье мы рассмотрели основные виды Layer 2-атак, и рассмотрели, как с ними можно бороться. Описанные меры должны применяться комплексно, для повышения безопасности сети в целом.