私の質問は、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
- 持っていない公共コミュニティが設定されている場合、Wireshark でトラップ パケットの内容を表示できるようにするために SNMPv3 資格情報を定義する必要があったため、snmptrapd サービスは SNMPv3 トラップを復号化できるようになりますか?
- そうでない場合、どのように設定すればよいですか?snmptrapd.conf ファイルPerl スクリプトが SNMPv3 からこれらのトラップを読み取ることができるようにするには?
- Wireshark では、SNMPv3 として暗号化されているにもかかわらず、SNMPv2c トラップと表示されるのはなぜでしょうか。わかりません。
- 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";
/var/lib/net-snmp/snmptrapd.conf 内に作成された usmUser が実際の要件を満たしていないため、/tmp/zabbix_traps.tmp に SNMPv3 トラップが送信されることはありません。
SNMPv3 通知に関しては、ほとんどのスイッチは通知を送信できないため、SNMPv3 トラップのみで対応することになり、snmptrapd のプログラム方法は、SNMPv3 トラップの EngineID でのみ機能します。snmptrapd.conf で、disableAuthorization yes を使用しても、各送信デバイス (スイッチ デバイス) の EngineID がないと、SNMPv3 トラップは機能しません。
さて、SNMPv3 トラップを受信するには、すべてのスイッチのすべての EngineID を取得する必要があります。そのために、SNMPv3 を使用して snmptrapd.conf を作成するための Python スクリプトを作成しました。これは大きな助けになります。実際のファイルには、各 createUser 行の前にスイッチ名と IP アドレスを示すコメントがあります。この 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 はリモート アプリケーションの engineID ではなく、トラップを送信するローカル アプリケーションの engineID を使用することです。つまり、リモート ユーザー データベースにユーザーを作成するときは少し注意が必要で、トラップの送信元となる engineID ごとに 1 つずつ作成する必要があります。つまり、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 で成功した人がいるのを見ましたが、これは本当にひどいもので、EngineID なしでは DES でも 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 トラップ (フォールバック)」を「情報の種類 = ログ」から「情報の種類 = テキスト」に変更しましたTemplate Module Generic SNMPv3
。
Zabbix の成功を祈ります!