Minha pergunta é sobre traps do zabbix com SNMPv3 e serviço snmptrapd usandozabbix_trap_receiver.pl. Eu tenho um switch no qual habilitei apenas o SNMPv3, então o switch não tem SNMPv1/2crwourocomunidades configuradas e consegui adicioná-lo como host no zabbix após uma longa jornada modificando modelos SNMPv2 existentes. Emdocumentação do zabbixemsnmptrapd.confhá algumas linhas adicionadas conforme mostrado aqui para ativar armadilhas SNMP:
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";
Minhas perguntas:
- Qual é o significado de
authCommunity execute public
- eu não tenhopúblicocomunidade configurada, o serviço snmptrapd será capaz de descriptografar armadilhas SNMPv3 porque no wireshark eu tive que definir credenciais SNMPv3 para que ele pudesse me mostrar o conteúdo dos pacotes de armadilhas?
- Se não, como posso configurá-lo emsnmptrapd.confpara que o script perl possa ler essas armadilhas do SNMPv3?
- No wireshark, por que diz armadilha SNMPv2c, embora seja criptografado como SNMPv3, estou perdido aqui?
- Por favor, explique-me como as armadilhas funcionam quando o SNMPv2 está ativado e quando o SNMPv3 está ativado.
Editar Eu também tentei o seguinte
createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";
Mas sem sorte
Responder1
A maneira como o daemon snmptrapd funciona com traps não permite receber nenhum trap SNMPv3 sem especificar o EngineID do dispositivo remetente, ou seja, se você apenas fizer o seguinte em /etc/snmp/snmptrapd.conf:
createUser snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";
Você nunca obterá nenhuma armadilha SNMPv3 em seu /tmp/zabbix_traps.tmp, porque o usmUser criado dentro de /var/lib/net-snmp/snmptrapd.conf não está atendendo aos requisitos reais, é isso.
Quando se trata de informes SNMPv3, a maioria dos switches não consegue enviá-los, então ficamos presos apenas aos traps SNMPv3, e a forma como o snmptrapd é programado funciona apenas com EngineIDs para traps SNMPv3. Mesmo se eu usar disableAuthorization yes em snmptrapd.conf, as armadilhas SNMPv3 não funcionarão sem o EngineID para cada dispositivo de envio, ou seja, o dispositivo de comutação.
Agora, para receber traps SNMPv3, você precisa obter todos os EngineIDs de todos os switches, para isso escrevi um script python para construir snmptrapd.conf usando SNMPv3, o que é um grande alívio. O arquivo real tem um comentário antes de cada linha createUser que mostra o nome do switch e o endereço IP. Esta informação sobre armadilhas SNMPv3 é mencionada na documentação do net-snmp, mas quando a li pela primeira vez não consegui entendê-la porque diz The difference is that SNMPv3 TRAPs use the engineID of the local application sending the trap rather than the engineID of the remote application
que quando você lê pela primeira vez você ficará confuso, mas com um pouco de concentração isso fica muito claro:
Os TRAPs SNMPv3 são um pouco mais complicados em alguns aspectos, mas faz sentido que o protocolo funcione dessa maneira se você passar muito tempo pensando nisso. A diferença é que os TRAPs SNMPv3 usam o engineID do aplicativo local que envia o trap em vez do engineID do aplicativo remoto. Isso significa que você deve criar usuários em seu banco de dados de usuários remotos com um pouco mais de cuidado e criar um para cada ID de mecanismo do qual deseja enviar traps. Isso significa que se você deseja que 100 agentes snmp enviem traps snmpv3 para seu receptor de trap, você precisa de 100 diretivas createUser em seu arquivo /var/net-snmp/snmptrapd.conf.
O arquivo /etc/snmp/snmptrapd.conf se parece com isto:
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";
O arquivo é muito mais longo que isso, mas agora posso receber todas as armadilhas de todos os switches. Vi no stackoverflow que alguém teve sucesso com DES sem usar EngineID, mas isso é uma porcaria, nunca funcionou para mim nem para DES nem para AES sem EngineID. É apenas algo que foi feito em segundo plano por outro software de monitoramento que mantém um registro dos EngineIDs de todos os dispositivos para tarefas de recepção de armadilhas.
Também notei que as armadilhas do switch principal são recebidas da interface virtual da vlan na qual o zabbix reside, então tive que modificar o script zabbix_trap_receiver.pl da seguinte forma:
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')
Ao trabalhar em traps, eu tinha que vê-los como histórico, então mudei o item SNMP traps (fallback) de Type of information=Log para Type of information=Text in template Template Module Generic SNMPv3
.
Boa sorte no zabbix!