Perl

Zabbix 中的 SNMPv3 陷阱

  • January 6, 2021

我的問題是關於使用 SNMPv3 的 zabbix 陷阱和使用zabbix_trap_receiver.pl的 snmptrapd 服務。我有一個僅啟用了 SNMPv3 的交換機,因此該交換機沒有配置 SNMPv1/2c rwro社區,並且經過漫長的修改現有 SNMPv2 模板的旅程後,我能夠將其添加為 zabbix 上的主機。在snmptrapd.conf的zabbix 文件中,添加瞭如下所示的幾行以啟用 SNMP 陷阱:

authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";

我的問題:

  • 是什麼意思authCommunity execute public
  • 我沒有配置公共社區,snmptrapd 服務是否能夠解密 SNMPv3 陷阱,因為在 wireshark 上我必須定義 SNMPv3 憑據才能顯示陷阱數據包內容?
  • 如果沒有,我如何在snmptrapd.conf中配置它,以便 perl 腳本可以從 SNMPv3 讀取這些陷阱?
  • 在wireshark上,為什麼說SNMPv2c陷阱,雖然它被加密為SNMPv3,但我在這裡迷路了?
  • 請向我解釋啟用 SNMPv2 和啟用 SNMPv3 時陷阱如何工作?

編輯 我也嘗試了以下

createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";

但沒有運氣

snmptrapd 守護程序使用陷阱的方式不允許在未指定發送方設備的 EngineID 的情況下接收任何 SNMPv3 陷阱,即,如果您只是在 /etc/snmp/snmptrapd.conf 中執行以下操作:

createUser snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";

您永遠不會在 /tmp/zabbix_traps.tmp 中獲得任何 SNMPv3 陷阱,因為在 /var/lib/net-snmp/snmptrapd.conf 中創建的 usmUser 不滿足實際要求,僅此而已..

當涉及到 SNMPv3 通知時,大多數交換機無法發送它們,因此我們只能使用 SNMPv3 陷阱,而 snmptrapd 的程式方式僅適用於 SNMPv3 陷阱的 EngineID。即使我在 snmptrapd.conf 中使用 disableAuthorization yes,如果沒有每個發送設備(即交換機設備)的 EngineID,SNMPv3 陷阱也將無法工作。

現在,為了接收 SNMPv3 陷阱,您需要獲取所有交換機的所有 EngineID,為此我編寫了一個 python 腳本,以便使用 SNMPv3 建構 snmptrapd.conf,這是一個很大的解脫。實際文件在顯示交換機名稱和 IP 地址的每個 createUser 行之前都有一個註釋。這個 SNMPv3 陷阱資訊實際上在 net-snmp 文件中提到過,但是當我第一次閱讀它時我無法理解它,因為它說The difference is that SNMPv3 TRAPs use the engineID of the local application sending the trap rather than the engineID of the remote application當你第一次閱讀它時你會感到困惑,但是稍微集中一下變得非常清楚:

SNMPv3 TRAP 在某些方面有點複雜,但如果您花很長時間考慮它,協議以這種方式工作是有道理的。不同之處在於 SNMPv3 TRAP 使用發送陷阱的本地應用程序的引擎 ID,而不是遠端應用程序的引擎 ID。這意味著您必須更加小心地在遠端使用者數據庫中創建使用者,並且需要為您希望從中發送陷阱的每個 engineID 創建一個。這意味著如果您想讓 100 個 snmp 代理向您的陷阱接收器發送 snmpv3 陷阱,您需要在 /var/net-snmp/snmptrapd.conf 文件中添加 100 個 createUser 指令。

/etc/snmp/snmptrapd.conf 文件如下所示:

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";

該文件比這長得多,但現在我可以從所有交換機接收所有陷阱。我在 stackoverflow 上看到有人在不使用 EngineID 的情況下成功使用 DES,但這是真正的廢話,無論是對於 DES 還是對於沒有 EngineID 的 AES,它都對我不起作用。這只是在其他監控軟體的後台完成的事情,這些軟體確實記錄了所有設備的引擎ID,用於陷阱接收任務。

我還注意到來自核心交換機的陷阱是從zabbix所在的vlan的虛擬介面接收的,所以我不得不修改zabbix_trap_receiver.pl腳本如下:

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')

在處理陷阱時,我必須將它們視為歷史記錄,因此我將 SNMP 陷阱(回退)項從 Type of information=Log 更改為 Type of information=Text in template Template Module Generic SNMPv3

祝zabbixing好運!

引用自:https://unix.stackexchange.com/questions/554038