web-dev-qa-db-ja.com

ZabbixのSNMPv3トラップ

私の質問は、zabbix_trap_receiver.plを使用したSNMPv3およびsnmptrapdサービスでのzabbixトラップについてです。 SNMPv3のみを有効にしたスイッチがあるため、スイッチにはSNMPv1/2crwまたはroコミュニティが構成されていません。既存のSNMPv2テンプレートを変更する長い旅の後で、zabbixのホストとして追加することができました。 zabbixドキュメントsnmptrapd.confには、SNMPトラップを有効にするために次のように追加された行がいくつかあります。

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

私の質問:

  • authCommunity execute publicの意味は何ですか
  • publicコミュニティが構成されていません。wiresharkでトラップパケットの内容を表示できるようにSNMPv3資格情報を定義する必要があったため、snmptrapdサービスはSNMPv3トラップを復号化できますか?
  • そうでない場合は、PerlスクリプトがSNMPv3からこれらのトラップを読み取れるように、snmptrapd.confで構成するにはどうすればよいですか?
  • 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
elekgeek

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でdisableAuthorizationyesを使用しても、SNMPv3トラップは、各送信デバイス、つまりスイッチデバイスのEngineIDがないと機能しません。

ここで、SNMPv3トラップを受信するには、すべてのスイッチのすべてのEngineIDを取得する必要があります。そのため、SNMPv3を使用してsnmptrapd.confをビルドするために、pythonスクリプトを記述しました。これは、大きな安心です。 。実際のファイルには、スイッチ名と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は、リモートアプリケーションの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";

ファイルはそれよりはるかに長いですが、今ではすべてのスイッチからすべてのトラップを受信できます。誰かが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トラップ(フォールバック)を[情報の種類=ログ]から[情報の種類=テンプレートのテキスト]に変更しましたTemplate Module Generic SNMPv3

頑張ってザビックス!

0
elekgeek