FreeBSD и SNMP


Письма с отчетами полезны, однако в них содержится только общая информация, а протоколы, относящиеся к продолжительным периодам времени, трудно читать. Чтобы узнать больше о работе сервера сейчас и в долгосрочной перспективе, применяйте индустриальный стандарт сбора информации о хостах сети — простой протокол управления сетью (Simple Network Management Protocol, SNMP). Большинство поставщиков поддерживают его как протокол сбора информации со многих сетевых устройств. FreeBSD включает агент SNMP bsnmpd(8), который не только предоставляет стандартные функции SNMP, но и обеспечивает доступ к особенностям, характерным для FreeBSD.

bsnmpd (сокращенно от Begemot SNMPD) — это минимальный агент SNMP, предусматривающий возможность расширения. В действительности все многообразие функциональных возможностей обеспечивается с помощью внешних модулей. Операционная система FreeBSD включает в себя модули bsnmpd для обеспечения стандартных сетевых функций и функциональных особенностей, присущих FreeBSD, таких как PF и netgrapf(4). bsnmpd — это не универсальный инструмент на все случаи жизни, скорее — это фундамент, на котором любой сможет построить свою реализацию SNMP, наилучшим образом отвечающую его требованиям, но не больше того.

Основы SNMP

SNMP работает по стандартной модели клиент/сервер. Клиент (или агент) SNMP посылает по сети запрос серверу SNMP. Сервер SNMP, bsnmpd, собирает информацию в локальной системе и возвращает ее клиенту.

Агент SNMP может также посылать серверу SNMP запрос на выполнение изменений. Если система сконфигурирована надлежащим (или ненадлежащим, в зависимости от вашей точки зрения) образом, вы можете выдавать команды через SNMP. Такая конфигурация с помощью «записи» чаще всего применяется в маршрутизаторах, коммутаторах и других сетевых устройствах. Большинство UNIX-подобных операционных систем имеют систему управления командной строки и обычно не принимают команды через SNMP. Создание конфигурации системы или запуск команд через SNMP требует тщательной настройки и внимания к безопасности, и это отличная тема для целой книги. Ни один системный администратор из тех, кого я знаю, не использует SNMP для управления своими системами. Помня об этом, мы рассмотрим доступ к SNMP исключительно для чтения.

В дополнение к возможности сервера SNMP отвечать на запросы клиента SNMP клиент может передавать ловушки (traps) SNMP получателю ловушек, расположенному где-то в сети. Агент SNMP генерирует эти ловушки в ответ на определенные события сервера. Ловушки SNMP во многом напоминают сообщения syslogd(8), за исключением того, что они имеют весьма специфический формат, необходимый для работы SNMP. В настоящее время в операционной системе FreeBSD нет получателя ловушек SNMP, но если он вам потребуется, обратите внимание на snmptrapd(8) из катеогрии net-snmp (/usr/port s/net-mgmt/net-snmp).

SNMP MIB

SNMP управляет информацией через базу управляющей информации (Management Information Base, MIB) — древовидную структуру, содержащую иерархическую информацию в формате ASN.1. Пример дерева параметров MIB был представлен в главе 5, когда рассматривался интерфейс sysctl(8).

У каждого сервера SNMP есть список информации, которую он может извлечь из локального компьютера. Сервер представляет эту информацию в виде иерархического дерева. В каждом дереве SNMP MIB есть общие основные категории (сеть, физическая система, программы и т. д.), разбитые на более специфичные подразделы. Такие деревья представляют собой хорошо организованные каталоги, подкаталоги которых содержат более узкую информацию. Аналогично, MIB верхнего уровня содержат множество MIB более низких уровней.

На MIB ссылаются по имени и по номеру. Например, так выглядит параметр MIB одной из систем:

interfaces.ifTable.ifEntry.ifDescr.1 = STRING: "fxp0"

Первый элемент этого параметра MIB interfaces показывает, что запись относится к сетевым интерфейсам системы. Если бы в данной системе не было интерфейсов, первая категория даже не существовала бы. Поле ifTable — это таблица интерфейсов, или список всех интерфейсов системы. Поле ifEntry показывает один конкретный интерфейс, a ifDescr — описание этого интерфейса. Данная запись MIB означает: «Интерфейс с номером 1 на этой машине называется fxp0».

Записи MIB можно также выражать в виде номеров. Большинство инструментов SNMP отдают предпочтение числовым значениям MIB. Большинство из нас предпочтет пользоваться словами, но все же наши хилые мозги должны уметь работать и с тем и с другим. Броузер MIB может переводить записи из одного представления в другое, но вы можете также установить /usr/’ports/net-mgmt/’net-snmp и использовать snmptranslate(l), а пока верьте мне на слово. Предыдущий пример можно преобразовать в такую форму:

.1.3.6.1.2.1.2.2.1.2.1

Если выразить этот параметр MIB словами, то в нем будет пять элементов, разделенных точками. Параметр MIB, выраженный в числах, состоит из 11 компонентов. Есть подозрение, что здесь не все в порядке, потому что обе записи должны означать одно и то же. В чем тут дело?

Числовое представление параметра MIB длиннее, поскольку в него входит часть по умолчанию — .1.3.6.1.2.1. Она означает .iso.org.dod.internet.mgmt.mib-2. Это стандартное подмножество MIB, применяемое в Интернете. В названии почти каждого (но не во всех) параметра MIB есть префиксная строка — вот почему никто ее больше не приводит.

Если есть настроение почудить, можно даже смешать слова и числа:

.1.org.6.1.mgmt.1.interfaces.ifTable.1.2.1

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

Определения MIB и броузеры MIB

Определения параметров MIB следуют очень строгому синтаксису, описанному в файлах MIB. У каждого агента SNMP есть собственные файлы MIB — bsnmpd держит их в каталоге /usr/share/snmp. Это обычные текстовые файлы. Вы можете читать и интерпретировать их, не пользуясь ничем, кроме своей головы. Но я настоятельно рекомендую скопировать их на свою рабочую станцию и установить броузер MIB, чтобы упростить их изучение.

Броузеры MIB интерпретируют файлы MIB, представляя их в виде древовидной структуры с полным определением каждой части и описанием каждого отдельного параметра MIB. Вообще говоря, броузер позволяет вводить имена конкретных параметров MIB и отображает как числовое, так и словесное представление этого параметра, а также запрос агента SNMP для определения состояния этого параметра MIB.

На рабочей станции с установленной операционной системой FreeBSD (или хотя бы UNIX-подобной системой) можно использовать броузер MIB — mbrowse (/usr/ports/net-mgmt/mbrowse). Для систем Windows есть множество броузеров MIB, в том числе вполне приличный и бесплатный Getif (http://www.wtcs.org). Если вам для работы с SNMP не нужны программы с графическим интерфейсом, загляните в категорию net-snmp (/usr/ports/net-mgmt/net-snmp), где вы найдете богатый ассортимент инструментов командной строки, предназначенных для работы с SNMP.

Безопасность и SNMP

Многие эксперты по компьютерной безопасности утверждают, что аббревиатура SNMP происходит от «Security: Not My Problem!» (безопасность — это не моя проблема). Не слишком доброжелательно, зато точно. В общедоступных сетях SNMP следует использовать только за брандмауэром. Если вы вынуждены использовать SNMP в незащищенном Интернете, применяйте механизм фильтрации пакетов, препятствующий получению посторонних запросов к вашему сервису SNMP. Агент SNMP работает с портом UDP 161.

Базовый уровень безопасности в SNMP обеспечивается через сообщества. Оглянитесь кругом — и вы без труда найдете массу разнообразных объяснений, почему сообщества — это не то же самое, что пароли, но фактически сообщество — это пароль. У большинства агентов SNMP есть два пароля по умолчанию: открытый (доступ только для чтения) и закрытый (доступ для чтения и для записи). Да, есть пароль по умолчанию, который обеспечивает доступ для чтения и для записи. Всякий раз, когда вы настраиваете агент SNMP, в любой ОС, на любом хосте ваша первая задача — запретить имена сообществ по умолчанию и заменить их другими, которые не приводились в документации в последние несколько десятилетий.

Реализация протокола SNMP поставляется в разных версиях. Версия 1 была первой попыткой, версия 2с представляет современный стандарт. Вам могут встретиться упоминания о версии 3, в которой применяются усовершенствованные механизмы шифрования для защиты данных, передаваемых в сети. Однако лишь немногие производители в действительности реализовали SNMPv3. В bsnmpd(8) системы FreeBSD используется SNMPv2c. Это означает, что любой желающий, вооружившись анализатором пакетов, сможет перехватить имя сообщества SNMP, поэтому ни у кого не вызывает сомнений необходимость использования SNMP исключительно в закрытых сетях. Посылка запросов SNMP через общедоступные сети — отличный способ привлечь незнакомцев, пытающихся запустить руку в вашу систему управления.

Конфигурирование bsnmpd

Прежде чем использовать SNMP для мониторинга системы, необходимо настроить демон SNMP. Конфигурация bsnmpd(8) находится в файле /etc/snmpd.config. Помимо открытого и закрытого сообществ по умолчанию конфигурация по умолчанию не включает ни одну из особенностей FreeBSD, придающих bsnmpd(8) привлекательность.

Переменные bsnmpd

В конфигурации bsnmpd используются переменные, которым присваиваются значения с помощью операторов. Большая часть определений переменных находится в начале конфигурационного файла, как показано здесь:

location := "Room 200"
contact := "sysmeister@example.con"
system := 1 # FreeBSD
traphost := localhost
trapport := 162

Эти переменны определяют значения параметров MIB, которые должны быть установлены в любом агенте SNMP. Переменная location описывает физическое местоположение машины. Для каждой машины должен быть указан действительный адрес электронной почты (contact). Демон bsnmpd(8) может работать и в других операционных системах, отличных от FreeBSD, поэтому здесь присутствует переменная (system), определяющая тип операционной системы. Последние переменные определяют имя хоста ловушки и его номер порта.

Далее в файле можно определить имена сообществ SNMP:

# Измените эти имена! read := "public"
# Раскомментируйте строку begenotSnnpdConnunityString.0.2 ниже,
# чтобы определить имя сообщества для обеспечения доступа на запись.
write := "geheim"
trap := "nytrap"

Строка read определяет имя сообщества данного агента SNMP, разрешающего доступ только для чтения. Конфигурационный файл по умолчанию предлагает изменить его. Не пренебрегайте этим советом. Строка write — это имя сообщества с правом доступа для чтения и записи, которое далее в конфигурационном файле запрещено по умолчанию. Вы можете также определить имя сообщества для передачи ловушек SNMP этим агентом.

С этой конфигурацией уже можно запустить bsnmpd(8), обеспечив передачу основных сведений SNMP к вашей сетевой системе управления. Чтобы запускать bsnmpd во время загрузки, просто добавьте в файл /etc/rc.conf строку bsnmpd_enable="YES". Однако при этом вы не сможете получить дополнительную функциональность, предоставляемую FreeBSD. Давайте посмотрим, как ими управлять.

Детализированная конфигурация bsnmpd

Демон bsnmpd(8) использует значения переменных, которые вы определите в начале файла, для присвоения значений различным параметрам MIB, расположенным в конфигурационном файле ниже. Например, в начале файла были определены переменные read и public. Ниже в конфигурационном файле вы обнаружите такую инструкцию:

begemotSnmpdCommunityString.0.1 = $(read)

Она устанавливает значение параметра MIB begemotSnmpdCommunityString.0.1 равным значению переменной read.

Почему бы просто не установить эти значения напрямую? bsnmpd(8) задумывался как расширяемый и легко настраиваемый инструмент. Установить несколько переменных в начале файла гораздо проще, чем редактировать правила, расположенные в файле ниже.

Давайте вернемся к параметру MIB begemotSnmpdCommunityString, значение которого здесь устанавливается. Для чего он нам нужен? Поискав эту строку в броузере MIB, вы увидите, что этот параметр MIB определяет имя сообщества SNMP. Возможно, вы допускали это исходя из того, что ему присваивается значение переменной read, но теперь сомнений не осталось.

Точно так же вы могли бы отыскать следующую запись:

begemotSnmpdPortStatus.0.0.0.0.161 = 1

Поиск в броузере MIB показывает, что это выделенный IP-адрес и порт UDP, к которым привязывается bsnmpd(8) (в данном случае — все имеющиеся в системе IP-адреса и порт 161). Все конфигурационные параметры MIB определяются подобным образом.

Загрузка модулей bsnmpd

Большинство наиболее интересных функциональных возможностей bsnmpd настраивается с помощью модулей. Включите модули в конфигурационный файл, имя которого определяется параметром MIB begemotSnmpdModulePath, укажите класс модуля и полный путь к разделяемой библиотеке, которая содержит реализацию этой особенности. Например, в конфигурационном файле можно увидеть закомментированную строку, описывающую модуль PF для bsnmpd(8):

begemotSnmpdModulePath."pf" = "/usr/lib/snmp_pf.so"

Эта запись включает поддержку параметров MIB для PF. Благодаря этому модулю программное обеспечение системы управления сможет увидеть все, что происходит в PF, когда это будет разрешено, начиная от сброшенных пакетов и заканчивая размером таблицы состояний.

К моменту написания этих строк вместе с bsnmpd(8) для FreeBSD распространялись следующие модули, ориентированные на FreeBSD. Все они выключены по умолчанию, но вы можете включить их, раскомментировав соответствующие строки в конфигурационном файле.

Netgraph
Предоставляет доступ ко всем сетевым особенностям Netgraph, описанным в snmp_netgraph(3).

PF
Предоставляет доступ к пакетному фильтру PF.

Hostres
Реализует параметр MIB — Host Resources SNMP, snmp_hostres(3).

bridge
Предоставляет доступ к функциям сетевого моста, описанным в snmp_bridge(3).

Включив необходимые модули в конфигурационном файле, перезапустите bsnmpd(8). Если программа не запустилась, проверьте содержимое /var/log/messages на наличие ошибок.

В комплексе с bsnmpd(8), syslogd(8), письмами о состоянии и разнообразными инструментами анализа производительности вы сможете превратить систему FreeBSD в хорошо управляемое сетевое устройство. Теперь, когда вы познакомились со всем, что может предложить система, захватите фонарь, так как далее мы собираемся заглянуть в самые темные уголки FreeBSD.

Комментарии запрещены.