Zabbix 中的 SNMPv3 陷阱

Zabbix 中的 SNMPv3 陷阱

我的問題是關於使用 SNMPv3 和 snmptrapd 服務的 zabbix 陷阱zabbix_trap_receiver.pl。我有一台僅啟用 SNMPv3 的交換機,因此該交換機沒有 SNMPv1/2c讀寫或者配置了社區,經過漫長的修改現有 SNMPv2 範本後,我能夠將其新增為 zabbix 上的主機。在zabbix文檔snmptrapd.conf新增了幾行(如下所示)以啟用 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 trap,雖然它被加密為SNMPv3,但我在這裡迷失了?
  • 請向我解釋一下當啟用 SNMPv2 和啟用 SNMPv3 時陷阱如何運作?

編輯 我也嘗試了以下方法

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

但沒有運氣

答案1

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,這真是一個很大的緩解。實際文件在每個 createUser 行之前都有一個註釋,其中顯示交換器名稱和 IP 位址。這個 SNMPv3 traps 的資訊實際上在 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 使用發送陷阱的本機應用程式的engineID,而不是遠端應用程式的engineID。這意味著您必須更加小心地在遠端用戶資料庫中建立用戶,並且需要為您希望從中發送陷阱的每個 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 都不起作用。這只是在其他監控軟體的後台完成的事情,這些軟體確實記錄了所有設備的 EngineID,用於陷阱接收任務。

我還注意到來自核心交換器的陷阱是從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 traps (fallback) 專案從 Type of information=Log 更改為 Type of information=Text Template Module Generic SNMPv3

祝 zabbix 好運!

相關內容