Оригинал: https://www.net-snmp.org/tutorial/tutorial-5/commands/snmptrap-v3.html
-----
Необходимые материалы для ознакомления:
- net-snmp: параметры SNMPv3
TRAP и INFORM: различия
Коротко напомним разницу между TRAP и INFORM: TRAP — это SNMP-сообщение, отправляемое от одного приложения другому (обычно на удалённый хост). Его цель — просто уведомить другое приложение о том, что что-то произошло, было замечено и т. д. Главная проблема TRAP в том, что они не подтверждаются — вы не знаете, получило ли удалённое приложение ваше важное сообщение. SNMPv2 PDU решили эту проблему, введя понятие INFORM — это не что иное, как подтверждаемая ловушка. Когда удалённое приложение получает INFORM, оно отправляет обратно сообщение «я получил». Это удобно, потому что отправитель может повторять попытки, пока ловушка не пройдёт.
Программа snmptrap из комплекта Net‑SNMP может отправлять и TRAP, и INFORM. Добавьте -Ci в командную строку snmptrap, чтобы отправить INFORM, или вызовите команду snmpinform (которая функционально эквивалентна snmptrap -Ci). Обратите внимание, что для отправки INFORM необходимо использовать SNMPv2c или SNMPv3. snmptrapd умеет принимать и отображать как INFORM, так и TRAP.
Примечание: snmptrapd не будет отображать SNMPv3 TRAP или INFORM, отправленные пользователем, который не был настроен с помощью директив createUser, описанных ниже. Такие сообщения будут молча отброшены. Если запустить snmptrapd с флагом -Dusm, в отладочном выводе появится сообщение «no such user», объясняющее причину отбрасывания.
Примечание: Начиная с net-snmp 5.3, snmptrapd по умолчанию больше не принимает все ловушки. Он должен быть настроен с авторизованными строками сообщества SNMPv1/v2c и/или пользователями SNMPv3. Неавторизованные TRAP/INFORM будут отбрасываться. Подробности см. в руководстве snmptrapd.conf(5).
SNMPv3, пользователи и идентификаторы engine
С точки зрения SNMPv3 TRAP и INFORM становятся немного сложнее. Причина кроется в способе ведения базы пользователей. Сообщения SNMPv1 и SNMPv2c на основе сообществ всегда просто отображаются конечному пользователю. SNMPv3 требует, чтобы сообщение было отклонено, если отправляющий ловушку пользователь SNMPv3 ещё не существует в базе пользователей. Звучит достаточно просто, не так ли? За исключением одной небольшой проблемы: база пользователей в SNMPv3-приложении на самом деле индексируется комбинацией имени пользователя (называемого «именем безопасности») и идентификатора конкретного SNMP-приложения, с которым вы взаимодействуете (называемого «engineID»). Обычно, когда вы используете остальные SNMP-приложения (snmpget, snmpwalk, …), приложение автоматически «обнаруживает» удалённый engineID и затем добавляет имя пользователя, engineID и пароли в базу пользователей на основе этого удалённого engineID. Это делает всё простым при взаимодействии с удалённым агентом.
INFORM для SNMPv3
INFORM работают по схожему принципу. Когда вы отправляете INFORM, вы используете удалённый engineID для формирования сообщения, и пара «имя безопасности — engineID» должна существовать в удалённой таблице пользователей. Программа snmptrap обнаруживает удалённый engineID точно так же, как и другие приложения, и затем корректно формирует SNMPv3-сообщение с тем пользователем, которого ожидает удалённая сторона. Всё работает. Таким образом, всё, что вам нужно сделать при настройке удалённого приложения snmptrapd (предполагая, что вы используете наш приёмник ловушек), — это создать пользователя v3 в конфигурационной базе snmptrapd. Это делается так:
- Остановите любой запущенный snmptrapd.
Отредактируйте /var/net-snmp/snmptrapd.conf и добавьте следующую строку:
createUser myuser SHA mypassword AES myotherpassword
где myuser — это имя безопасности, которое вы хотите использовать, mypassword — ваш пароль аутентификации, а myotherpassword — пароль шифрования (или оставьте его пустым, если хотите, чтобы он совпадал с паролем аутентификации, либо если шифрование не требуется).
- (Пере)запустите программу snmptrapd.
Теперь вы сможете использовать команду snmpinform для отправки демону ловушек сообщения coldStart в виде INFORM:
snmpinform -v 3 -u myuser -a SHA -A mypassword -l authNoPriv localhost 42 coldStart.0
Если всё сделано правильно, в выводе snmptrapd вы должны увидеть что-то вроде:
2001-10-31 11:21:05 localhost.localdomain [127.0.0.1]:
sysUpTimeInstance = Timeticks: (42) 0:00:00.42 snmpTrapOID.0 = OID: coldStart.0
TRAP для SNMPv3
SNMPv3 TRAP в некотором смысле сложнее, но если хорошо подумать, становится понятно, почему протокол устроен именно так. Отличие в том, что SNMPv3 TRAP используют engineID локального приложения, отправляющего ловушку, а не engineID удалённого приложения. Это означает, что вам нужно создавать пользователей в вашей удалённой базе более аккуратно: необходимо создавать по одному пользователю для каждого engineID, от которого вы хотите получать ловушки. Иными словами, если вы хотите, чтобы 100 SNMP-агентов отправляли SNMPv3-ловушки вашему приёмнику ловушек, вам понадобится 100 директив createUser в файле /var/net-snmp/snmptrapd.conf.
Итак, попробуйте следующее:
- Остановите любой запущенный snmptrapd.
- Отредактируйте /var/net-snmp/snmptrapd.conf и добавьте строку^
createUser -e 0x0102030405 myuser MD5 mypassword DES myotherpassword
Обратите внимание, что теперь мы явно задаём engineID пользователя как 0x0102030405 (технически это не рекомендованное значение, но для примера оно подойдёт).
3. (Пере)запустите программу snmptrapd.
Теперь вы сможете использовать команду snmptrap для отправки демону ловушек сообщения coldStart в виде SNMPv3 TRAP:
snmptrap -e 0x0102030405 -v 3 -u myuser -a MD5 -A mypassword -l authNoPriv localhost 42 coldStart.0
Результат должен быть похож на предыдущий пример.
Здесь можно было бы пуститься в подробные объяснения о тонкостях engineID в SNMPv3, INFORM, TRAP, обнаружении engineID, секретных ключах, паролях, локализованных ключах и т. д. Но поскольку рабочая группа SNMPv3 потратила 18223 строк текста (RFC 2570–2575), чтобы попытаться всё это объяснить, я не думаю, что буду повторять это здесь.