среда, апреля 27, 2016

SNMP в Windows Часть 5. Продолжаем мучить SNMP Trap.

Здравствуйте уважаемые читатели. В прошлый раз, мы с вами, попробовали работать с SNMP Trap в Windows. Сегодня попробуем развить данную тему. Кто не читал прошлую статью, настоятельно рекомендую это сделать.

И так, в прошлый раз мы научились принимать SNMP Trap, которые умел генерировать агент Windows. Как мы уже поняли, по умолчанию, таких SNMP Trap очень и очень не много. А что если нам хочется сгенерировать свой Trap? Как обычно выход есть - можно использовать сторонние утилиты, например такие как TrapGen(http://trapgen.trapreceiver.com). Для того чтобы испытать данную утилиту, скачиваем её и помещаем в корень одного из дисков на агенте, для удобства использования. В моем случае в корень диска C.

На станции менеджере как обычно запускаем PowerSNMP Free Manager и наблюдаем за его окном Traps.

Окно Traps PowerSNMP Free Manager
Окно Traps PowerSNMP Free Manager
На агенте открываем командную строку и выполняем в ней следующие команды:

cd c:\
trapgen.exe -c Test -d 192.168.1.12

Первой командой мы переходим в корень диска C. Второй командой запускаем из него утилиту TrapGen с параметрами. Параметр -c отвечает за имя community, а параметр -d за адрес станции менеджера.

Заглянем на станцию менеджер. И увидим что в окне Traps появился первый трап.

Мы получили наш SNMP Trap
Мы получили наш SNMP Trap
Интересно, а почему он имеет именно такие значения. Все очень просто. Для своей работы утилита TrapGen требует только один обязательный параметр, а именно -d  - адрес станции менеджера. Все остальные параметры задаются по умолчанию следующим образом:
  • -с = public - имя community;
  • -o =  1.3.6.1.4.1.2854 - OID отправителя;
  • -g = 6 - значение generic type;
  • -s = 1 - specific type;
  • -t - текущее системное время; 
  • и еще пара менее значимых в данный момент параметров.        
Также с помощью параметра -v имеющего формат -v [OID связанный с переменной] [Тип] [Значение переменной] можно запихнуть в SNMP Trap какие то более конкретные данные. Давайте попробуем выполнить команду вот такого вида:

trapgen.exe -c Test -d 192.168.1.12 -o 1.3.6.1.4.1.1824 -v 1.3.6.1.4.1.1824.1.0.0.1 STRING "This is my first trap"

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

Информация по полученному трапу
Информация по полученному трапу
Я думаю принцип понятен. Но у Вас уже наверное возник вопрос. А зачем вообще все это делать, брать и отправлять SNMP Trap руками? Ведь весь смысл трапов в том, чтобы агент самостоятельно уведомлял менеджера о каких то событиях? Но поверьте смысл есть! Пусть у вас уже есть настроенный SNMP мониторинг, и вы уже получаете на него ряд SNMP Trapов от различных сетевых устройств. И вы хотите получать на этот же мониторинг уведомление о каком то специфичном событие, происходящем на рабочей станции под управлением Windows. С вероятностью 99 % встроенный агент WIndows не будет уметь генерировать нужный вам трап. Вот тут то нам и пригодится умение отправлять трапы с помощью утилиты TrapGen. Как отправлять трап мы уже разобрали. Теперь разберемся как автоматизировать этот процесс.




Как вы уже наверное знаете, в Windows есть две такие чудесные вещи как Журнал Системы и Планировщик заданий. Эти две чудесные вещи в сочетании с утилитой TrapGen могут творить чудеса). И так приступим.

Ни для кого не секрет, что многие события происходящие в ОС Windows фиксируются в системном журнале. Чтобы просмотреть системный журнал кликните правой кнопкой мыши по иконке Компьютер и выберите пункт Управление. В открывшемся окне выберите раздел Просмотр событий.

Системный журнал Windows
Системный журнал Windows
В данном разделе сгруппированы все события происходящие в вашей системе. Например, события связанные с запуском и остановкой служб находятся в разделе Просмотр событий - Журналы Windows - Система. К каждому событию происходящему в системе можно привязать какое либо действие, для этого необходимо выделить событие и нажать Привязать задачу к событию.

Например у меня есть событие вот такого вида:

Некоторое событие в системном журнале Windows
Некоторое событие в системном журнале Windows
Данное событие системного журнала говорит о том что была успешно запущена служба Центр обновления Windows. Давайте попробуем привязать к нему утилиту TrapGen, чтобы она отсылала SNMP Trap на станцию менеджер каждый раз когда данная служба успешно запускается. Для этого выделяем данное событие и выбираем Привязать задачу к событию. В открывшемся окне задаем Имя и описание задачи. Задавайте на свое усмотрение. В моем случае вот так.

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

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

Выбираем требуемое действие при возникновении события
Выбираем требуемое действие при возникновении события
В следующем окне в качестве программы указываем c:\trapgen.exe, а в качестве её аргумента -c Test -d 192.168.1.12 -o 1.3.6.1.4.1.1824 -v 1.3.6.1.4.1.1824.1.0.0.1 STRING "WinUpdate servise up"

Указываем что при возникновении события нужно запустить TrapGen
Указываем что при возникновении события нужно запустить TrapGen
Нажимаем далее. Все проверяем и нажимаем Готово. Поздравляю, ваша задача успешно создана. Настало время ее проверить. Для этого переходим в "Панель управления" - "Система и безопасность" - "Администрирование" - "Службы" и запустим службу Центр обновления Windows.

Теперь если мы перейдем на станцию менеджер и откроем PowerSNMP Free Manager. В разделе Traps мы увидим следующее.

Полученный SNMP Trap
Полученный SNMP Trap
Дополнительная информация по трапу
Дополнительная информация по трапу
Вроде бы все отлично. Служба запустилась, трап получен - о чем еще можно желать?! Но есть тут один подвох. Попробуйте остановить службу Центр обновления Windows и перейти на станцию менеджер. Что мы увидим? Мы опять получили трап о том что служба Центр обновления Windows запущена. В чем же дело. Дело в том, что мы привязали нашу задачу к событию 7036   источника Service Control Manager,  а оно генерируется не только при запуске службы Центр обновления Windows, а при изменении состояния вообще любой службы. Поэтому если мы например остановим или запустим, например службу Центр обеспечения безопасности, мы получим на станции менеджере тот же самый трап. Как же быть?

Для того чтобы отловить запуск или остановку конкретной службы необходимо произвести дополнительную фильтрацию событий 7036 источника Service Control Manager по параметрам param1  и param2 , в которых фигурирует непосредственное название службы и её состояние. Для этого там же в панели Управление компьютером переходим в раздел планировщик заданий и ищем там недавно  созданную задачу.

Ищем нашу задачу по отправке SNMP Trap в планировщике
Ищем нашу задачу по отправке SNMP Trap в планировщике
Кликаем по ней правой кнопкой мыши и выбираем свойства.

Свойства запланированной задачи
Свойства запланированной задачи
В открывшемся окне выбираем вкладку Триггеры и нажимаем на кнопку Изменить.

Редактирование триггера события
Редактирование триггера события
В открывшемся окне выбираем Настраиваемое. И нажимаем на кнопку Создать фильтр события. В открывшемся окне переходим на вкладку XML. Ставим галочку изменить запрос вручную. И копируем в поле следующий запрос:

<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Service Control Manager']]] and *[EventData[Data[1]='Центр обновления Windows' and Data[2]='Работает']]</Select>
  </Query>
</QueryList>

Нажимаем ОК нужное число раз, чтобы сохранить изменения. Данным запросом мы отфильтровываем сообщения от источника Service Control Manager, которые в param1 содержат текст Центр обновления Windows  и в param2 содержат текст Остановлена.

Давайте по аналогии создадим задание для остановки службы Центр обновления Windows. Процесс будет аналогичен. Отличаться будет только фильтр, и то чуть чуть:

<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Service Control Manager']]] and *[EventData[Data[1]='Центр обновления Windows' and Data[2]='Остановлена']]</Select>
  </Query>
</QueryList>

и будут небольшие отличаи в параметрах утилиты trapgen -c Test -d 192.168.1.12 -o 1.3.6.1.4.1.1824 -v 1.3.6.1.4.1.1824.1.0.0.1 STRING "WinUpdate servise down"

Если все сделано верно, при запуске службы Центр обновления Windows мы будем получать на станции менеджере следующий трап:

Мы получили SNMP трап о том что запущена выбранная служба
Мы получили SNMP трап о том что  выбранная службазапущена
А если служба остановлена:

Мы получили SNMP трап о том что выбранная служба остановлена
Мы получили SNMP трап о том что выбранная служба остановлена
Запуск или останов других служб не приводит к генерации трапов.

Я думаю этих примеров более чем достаточно чтобы продемонстрировать возможность привязки трапов к различным системным событиям Windows. Пробуйте, экспериментируйте, событий в системном журнале хватит на долго)                                                                                                                                                  

1 коммент.:

Здравствуйте, огромное спасибо за статью! Всё очень наглядно и доходчиво объяснено) Не понял только откуда взялся OID 1.3.6.1.4.1.1824.1.0.0.1. Сначала Вы пишите про 1.3.6.1.4.1.2854 - OID отправителя, а потом сразу этот. Это OID специально для передачи любой string?

Отправить комментарий