Ловушки Python SNMPv3

я пытаюсь отправить ловушки через snmpv3, это моя первая попытка:

#!/usr/bin/python

from pysnmp.hlapi import *

TARGET="localhost"
TARGET_PORT=162
COMMUNITY_STR="PASSWORD"
IDENTIFIER="1.3.6.1.2.1.xxx"
USER="trapadm"
KEY="PASSWORD"



# OID NODE : MESSAGE

values = { ".100.5": "LOL",
            ".100.6": "ROFL",
        }

def notification(   
                    NODE,
                    MESSAGE,
                    TARGET=TARGET, 
                    TARGET_PORT=TARGET_PORT, 
                    #COMMUNITY_STR=COMMUNITY_STR, 
                    IDENTIFIER=IDENTIFIER

                ):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        sendNotification(
            SnmpEngine(),
            UsmUserData(userName=USER, privKey=KEY, authKey=KEY
                        #authProtocol=usmHMACMD5AuthProtocol,
                        #privProtocol=usmDESPrivProtocol
                        #authProtocol=(1, 3, 6, 1, 6, 3, 10, 1, 1, 2),
                        #privProtocol= (1, 3, 6, 1, 6, 3, 10, 1, 2, 2)
                        ),
        #CommunityData(COMMUNITY_STR, mpModel=0),
            UdpTransportTarget((TARGET, TARGET_PORT)),
            ContextData(),
            'trap',
            NotificationType(
                ObjectIdentity(IDENTIFIER)
            ).addVarBinds(
                (IDENTIFIER+NODE, OctetString(MESSAGE)))
        )
    )

    if errorIndication:
        print(errorIndication)



CASE = True

def main():

    for key in values: 
        if CASE is True:
            notification(key, values[key])



if __name__ == '__main__':
    main()

Я проверил функциональность моего приемника ловушек с помощью следующей команды (которая сработала сразу):

snmptrap -Ci -v 3 -a MD5 -A PASSWORD -x DES -X PASSWORD -l authPriv -u trapadm localhost 0 linkUp.0

Теперь с приведенным выше скриптом Python я вижу через tcpdump, что он был отправлен, но он не отображается в файле журнала trapd. я подозреваю, что это как-то зависит от auth-/privProtocol. Кстати, прокомментированные строки (auth-/privProtocol). тоже прошли испытания.

Любые идеи здесь?


person tobit    schedule 02.12.2019    source источник


Ответы (1)


Ваш код мне нравится (вот рабочий пример).

Одна важная вещь заключается в том, что с SNMPv3 TRAP вам необходимо вручную передать значение идентификатора механизма SNMP вашего отправителя TRAP вашему получателю TRAP. Это связано с односторонним характером TRAP, который не оставляет возможности для автоматической процедуры синхронизации (например, в отличие от команд SNMP).

Я предполагаю, что с snmptrap это происходит так, что и snmptrap, и snmpd имеют одинаковое значение идентификатора механизма SNMP с самого начала.

Решение может состоять в том, чтобы добавить параметр -e <snmp-engine-id> к snmptrap и настроить его как запись пользователя от context-snmp-engine-id до trapadm на стороне snmpd.

person Ilya Etingof    schedule 03.12.2019
comment
Спасибо за ваш ответ. Я посмотрю и подумаю, как я могу это реализовать. Во всяком случае, я нашел способ получить ловушку. Мне нужно было изменить «trap в ContextData()» на информацию, которая кажется похожей на аргумент ‹-Ci› команды snmptrap. - person tobit; 03.12.2019