Данная статья посвящена протоколу SNMP (Simple Network Management Protocol) - одному из протоколов модели OSI, который практически не был затронут в документации просторов RU-нета. Автор попытался заполнить этот вакуум, предоставив читателю почву для размышлений и самосовершенствования, касательно этого, возможно нового для Вас, вопроса. Этот документ не претендует на звание "документации для разработчика", а просто отражает желание автора, насколько это возможно, осветить аспекты работы с данным протоколом, показать его слабые места, уязвимости в системе "security", цели преследованные создателями и объяснить его предназначение.
Протокол SNMP был разработан с целью проверки функционирования сетевых маршрутизаторов и мостов. Впоследствии сфера действия протокола охватила и другие сетевые устройства, такие как хабы, шлюзы, терминальные сервера, LAN Manager сервера , машины под управлением Windows NT и т.д. Кроме того, протокол допускает возможность внесения изменений в функционирование указанных устройств.
Основными взаимодействующими лицами протокола являются агенты и системы управления. Если
рассматривать эти два понятия на языке "клиент-сервер", то роль сервера выполняют агенты,
то есть те самые устройства, для опроса состояния которых и был разработан рассматриваемый
нами протокол. Соответственно, роль клиентов отводится системам управления - сетевым
приложениям, необходимым для сбора информации о функционировании агентов. Помимо этих двух
субъектов в модели протокола можно выделить также еще два: управляющую информацию и сам
протокол обмена данными.
"Для чего вообще нужно производить опрос оборудования?" - спросите Вы. Постараюсь пролить
свет на этот вопрос. Иногда в процессе функционирования сети возникает необходимость
определить определенные параметры некоторого устройства, такие как , например, размер MTU,
количество принятых пакетов, открытые порты, установленную на машине операционную систему
и ее версию, узнать включена ли опция форвардинга на машине и многое другое. Для
осуществления этого как нельзя лучше подходят SNMP клиенты.
Помимо сказанного выше рассматриваемый протокол обладает еще одной весьма важной
особенностью, а именно возможностью модифицировать данные на агентах. Безусловно, было бы
глупостью разрешить модификацию абсолютно любого параметра, но ,не смотря на это, и
количество тех параметров, для которых допускается операция записи просто пугает. С
первого взгляда это полностью опровергает всю теорию сетевой безопасности, но, если
углубиться в вопрос, то становится ясно, что не все так запущено, как кажется с первого
взгляда. "Волков бояться - в лес не ходить". Ведь при небольших усилиях администратора
сети можно свести риск успешного завершения атаки к минимуму. Но этот аспект мы обсудим
позже.
Остановимся на том, какую же все-таки информацию может почерпнуть система управления из
недр SNMP. Вся информация об объектах системы-агента подержится в так называемой MIB
(management information base ) - базе управляющей информации, другими словами MIB
представляет собой совокупность объектов, доступных для операций записи-чтения для каждого
конкретного клиента, в зависимости от структуры и предназначения самого клиента. Ведь не
имеет смысла спрашивать у терминального сервера количество отброшенных пакетов, так как
эти данные не имеют никакого отношения к его работе, так как и информация об администраторе
для маршрутизатора. Потому управляющая система должна точно представлять себе, что и у кого
запрашивать. На данный момент существует четыре базы MIB :
1) Internet MIB - база данных объектов для обеспечения диагностики ошибок и конфигураций.
Включает в себя 171 объект (в том числе и объекты MIB I).
2) LAN manager MIB - база из 90 объектов - пароли, сессии, пользователи, общие ресурсы.
3) WINS MIB - база объектов, необходимых для функционирования WINS сервера (WINSMIB.DLL).
4) DHCP MIB - база объектов, необходимых для функционирования DHCP сервера (DHCPMIB.DLL),
служащего для динамического выделения IP адресов в сети.
Все имена MIB имеют иерархическую структуру. Существует десять корневых алиасов:
1) System - данная группа MIB II содержит в себе семь объектов, каждый из которых служит для
хранения информации о системе (версия ОС, время работы и т.д.).
2) Interfaces - содержит 23 объекта, необходимых для ведения статистики сетевых интерфейсов
агентов (количество интерфейсов, размер MTU, скорость передачи , физические адреса и т.д.) .
3) AT (3 объекта) - отвечают за трансляцию адресов. Более не используется. Была включена в MIB I.
Примером использования объектов AT может послужить простая ARP таблица (более подробно об ARP
протоколе можно почитать в статье "Нестандартное использование протокола ARP", которую можно
найти на сайте www.uinc.ru в разделе "Articles" ) соответствия
физических (MAC) адресов сетевых карт IP адресам машин. В SNMP v2 эта информация была перенесена
в MIB для соответствующих протоколов.
4) IP (42 объекта) - данные о проходящих IP пакетах (количество запросов, ответов, отброшенных
пакетов).
5) ICMP (26 объектов) - информация о контрольных сообщениях (входящие/исходящие сообщения, ошибки
и т.д.).
6) TCP (19) - все, что касается одноименного транспортного протокола (алгоритмы, константы,
соединения, открытые порты и т.п.).
7) UDP (6) - аналогично, только для UDP протокола (входящие/исходящие датаграммы, порты,
ошибки).
8) EGP (20) - данные о трафике Exterior Gateway Protocol (используется маршрутизаторами, объекты
хранят информацию о принятых/отосланных/отброшенных кардах).
9) Transmission - зарезервирована для специфических MIB.
10) SNMP (29) - статистика по SNMP - входящие/исходящие пакеты, ограничения пакетов по размеру,
ошибки, данные об обработанных запросах и многое другое.
Каждый из них представим в виде дерева, растущего вниз, (система до боли напоминает
организацию DNS). Например, к адресу администратора мы можем обратиться посредством
такого пути:
system.sysContact.0 , ко времени работы системы system.sysUpTime.0 ,
к описанию системы (версия, ядро и другая информация об ОС) : system.sysDescr.0 . С другой
стороны те же данные могут задаваться и в точечной нотации. Так system.sysUpTime.0 соответствует
значение 1.3.0, так как system имеет индекс "1" в группах MIB II, а sysUpTime - 3 в иерархии
группы system. Ноль в конце пути говорит о скалярном типе хранимых данных. Ссылку на полный
список (256 объектов MIB II) Вы можете найти в конце статьи
в разделе "Приложение". В процессе работы символьные имена объектов не используются,
то есть если менеджер запрашивает у агента содержимое параметра system.sysDescr.0, то в строке
запроса ссылка на объект будет преобразована в "1.1.0", а не будет передана "как есть". Далее
мы рассмотрим BULK-запрос и тогда станет ясно, почему это столь важно . На этом мы завершим
обзор структуры MIB II и перейдем непосредственно к описанию взаимодействия менеджеров (систем
управления) и агентов.
В SNMP клиент взаимодействует с сервером по принципу запрос-ответ. Сам по себе агент
способен инициировать только оно действие, называемое ловушкой прерыванием (в некоторой
литературе "trap" - ловушка). Помимо этого, все действия агентов сводятся к ответам на
запросы, посылаемые менеджерами. Менеджеры же имеют гораздо больший "простор для
творчества", они в состоянии осуществлять четыре вида запросов:
GetRequest - запрос у агента информации об одной переменной.
GetNextRequest - дает агенту указание выдать данные о следующей (в иерархии) переменной.
GetBulkRequest - запрос за получение массива данных. При получении такового, агент проверяет
типы данных в запросе на соответствие данным из своей таблицы и цикле заполняет структуру
значениями параметров:
for(repeatCount = 1; repeatCount < max_repetitions; repeatCount++)
Теперь представьте себе запрос менеджера на получение списка из сотни значений переменных ,
посланный в символьном виде, и сравните размер такового с размером аналогичного запроса в
точечной нотации. Думаю, Вы понимаете, к чему привела бы ситуация, если бы символьные имена
не преобразовывались вышеуказанным образом.
SetRequest - указание установить определенное значение переменой.
Кроме этого менеждеры могут обмениваться друг с другом информацией о своей локальной MIB.
Такой тип запросов носит название InformRequest.
Приведу значения числовых констант для всех видов запросов:
#define SNMP_MSG_GET (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x0)
#define SNMP_MSG_GETNEXT (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x1)
#define SNMP_MSG_RESPONSE (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x2)
#define SNMP_MSG_SET (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x3)
/* PDU для SNMPv1 */
#define SNMP_MSG_TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x4)
/* PDU для SNMPv2 */
#define SNMP_MSG_GETBULK (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x5)
#define SNMP_MSG_INFORM (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x6)
#define SNMP_MSG_TRAP2 (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x7)
Вот тут то мы сталкиваемся с еще одной интересной деталью, как видите для ловушке есть 2 числовые
константы. На самом деле существует 2 основные версии протокола SNMP (v1 & v2) и самое важное
то, что они не являются совместимыми (на самом деле версий значительно больше -SNMP v2{p | c | u}
etc, только все эти модификации довольно незначительны, так как , например, введение поддержки
md5 и т.п.).
SNMP - протокол контроля и диагностики, в связи с чем , он рассчитан на ситуации, когда
нарушается целостность маршрутов, кроме того в такой ситуации требуется как можно менее
требовательный с аппаратуре транспортный протокол , потому выбор был сделан в сторону UDP.
Но это не значит, что никакой другой протокол не может переносить пакеты SNMP. Таковым может
быть IPX протокол (например, в сетях NetWare) , также в виде транспорта могут выступать карды
Ethernet, ячейки ATM. Отличительной особенностью рассматриваемого протокола есть то, что передача
данных осуществляется без установки соединения.
Допустим менеджер послал несколько пакетов разным агентам, как же системе
управления в дальнейшем определить какой из приходящих пакетов касается 1ого и 2ого
агента? Для этого каждому пакету приписывается определенный ID - числовое значение.
Когда агент получает запрос от менеджера, он генерирует ответ и вставляет в пакет значение
ID , полученное им из запроса (не модифицирую его).
Одним из ключевых понятий в SNMP является понятие group (группа). Процедура
авторизации менеджера представляет собой простую проверку на принадлежность его к
определенной группе, из списка, находящегося у агента. Если агент не находит группы
менеджера в своем списке, их дальнейшее взаимодействие невозможно. До этого мы несколько
раз сталкивались с первой и второй версией SNMP. Обратим внимание на отличие между ними.
Первым делом заметим, что в SNMP v2 включена поддержка шифрования трафика, для чего,
в зависимости от реализации, используются алгоритмы DES, MD5 .
Это ведет к тому что при передаче данных наиболее важные данные недоступны для извлечения
сниффингом, в том числе и информация о группах сети. Все это привело в увеличению самого
трафика и усложнению структуры пакета. Сам по себе, на данный момент, v2 практически нигде не
используется. Машины под управлением Windows NT используют SNMP v1. Таким образом мы медленно
переходим к, пожалуй, самой интересной части статьи, а именно к проблемам Security. Об этом
давайте и поговорим ...