Mi pregunta es sobre las trampas zabbix con SNMPv3 y el servicio snmptrapd usandozabbix_trap_receiver.pl. Tengo un conmutador en el que habilité SNMPv3 únicamente, por lo que el conmutador no tiene SNMPv1/2crworocomunidades configuradas y pude agregarlo como host en zabbix después de un largo viaje modificando las plantillas SNMPv2 existentes. Endocumentación zabbixensnmptrapd.confse agregaron un par de líneas como se muestra aquí para habilitar las capturas SNMP:
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";
Mis preguntas:
- Cuál es el significado de
authCommunity execute public
- no tengopúblicocomunidad configurada, ¿podrá el servicio snmptrapd descifrar trampas SNMPv3 porque en Wireshark tuve que definir las credenciales SNMPv3 para poder mostrarme el contenido de los paquetes de trampas?
- Si no, ¿cómo puedo configurarlo ensnmptrapd.conf¿Para que el script Perl pueda leer estas trampas desde SNMPv3?
- En Wireshark, ¿por qué dice trampa SNMPv2c, aunque está cifrado como SNMPv3, estoy perdido aquí?
- Por favor, explíqueme cómo funcionan las trampas cuando SNMPv2 está habilitado y cuando SNMPv3 está habilitado.
Editar También probé lo siguiente
createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";
pero no hubo suerte
Respuesta1
La forma en que el demonio snmptrapd funciona con las capturas no permite recibir ninguna captura SNMPv3 sin especificar el ID del motor del dispositivo remitente, es decir, si simplemente hace lo siguiente en /etc/snmp/snmptrapd.conf:
createUser snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";
Nunca obtendrá ninguna trampa SNMPv3 en su /tmp/zabbix_traps.tmp, porque el usmUser creado dentro de /var/lib/net-snmp/snmptrapd.conf no cumple con los requisitos reales, eso es todo.
Cuando se trata de informes SNMPv3, la mayoría de los conmutadores no pueden enviarlos, por lo que nos quedamos atrapados solo con capturas SNMPv3, y la forma en que se programa snmptrapd funciona solo con EngineID para capturas SNMPv3. Incluso si uso enableAuthorization yes en snmptrapd.conf, las trampas SNMPv3 no funcionarán sin el EngineID para cada dispositivo emisor, es decir, el dispositivo conmutador.
Ahora, para recibir capturas SNMPv3, necesita obtener todos los EngineID de todos los conmutadores, para eso escribí un script en Python para poder compilar snmptrapd.conf usando SNMPv3, lo cual es un gran alivio. El archivo real tiene un comentario antes de cada línea createUser que muestra el nombre del conmutador y la dirección IP. Esta información sobre trampas SNMPv3 en realidad se menciona en la documentación de net-snmp, pero cuando la leí por primera vez no pude entenderla porque así lo dice. The difference is that SNMPv3 TRAPs use the engineID of the local application sending the trap rather than the engineID of the remote application
Cuando lo leas por primera vez te confundirás, pero con un poco de concentración. queda muy claro:
Las TRAP SNMPv3 son un poco más complicadas en algunos aspectos, pero tiene sentido que el protocolo funcione de esta manera si pasas mucho tiempo pensando en ello. La diferencia es que las TRAP SNMPv3 utilizan el ID del motor de la aplicación local que envía la captura en lugar del ID del motor de la aplicación remota. Esto significa que debe crear usuarios en su base de datos de usuarios remotos con un poco más de cuidado y crear uno para cada ID de motor desde el que desea enviar trampas. Esto significa que si desea que 100 agentes snmp envíen trampas snmpv3 a su receptor de trampas, necesita 100 directivas createUser en su archivo /var/net-snmp/snmptrapd.conf.
El archivo /etc/snmp/snmptrapd.conf tiene este aspecto:
createUser -e 0x800007c703609c9f1eff01 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703cc4e24e4c6c3 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703d4c19e743e86 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10ca715 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10c46f0 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121bacd snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121b7d8 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703609c9f5136f4 snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";
El archivo es mucho más largo que eso, pero ahora puedo recibir todas las trampas de todos los conmutadores. Vi en stackoverflow que alguien tuvo éxito con DES sin usar EngineID, pero esto es una verdadera mierda, nunca me funcionó ni para DES ni para AES sin EngineID. Es solo algo que se ha hecho en segundo plano de otro software de monitoreo que mantiene un registro de los EngineID de todos los dispositivos para la tarea de recepción de trampas.
También noté que las trampas del conmutador central se reciben desde la interfaz virtual de la VLAN en la que reside zabbix, por lo que tuve que modificar el script zabbix_trap_receiver.pl de la siguiente manera:
use NetSNMP::TrapReceiver; # should be added in order to get the script to work, otherwise it fails -- elekgeek 2nd DEC 2019
# get the host name
$pdu_info{'receivedfrom'} =~ s/192.168.168.254/192.168.168.1/ig; # I added this line to get the core switch IP instead of zabbix's VLAN SVI IP, otherwise trap is not added to the CORE trap.fallback -- elekgeek 2nd DEC 2019
my $hostname = $pdu_info{'receivedfrom'} || 'unknown';
if ($hostname ne 'unknown')
Cuando trabajaba en trampas, tenía que verlas como historial, así que cambié el elemento Trampas SNMP (alternativa) de Tipo de información=Registro a Tipo de información=Texto en plantilla Template Module Generic SNMPv3
.
¡Buena suerte con el zabbix!