ZabbixのSNMPv3トラップ

ZabbixのSNMPv3トラップ

私の質問は、SNMPv3およびsnmptrapdサービスを使用するzabbixトラップについてです。zabbix_trap_receiver.pl。 SNMPv3のみが有効なスイッチがあるため、そのスイッチにはSNMPv1 / 2cはありません。読み書きまたはルオコミュニティが設定され、既存のSNMPv2テンプレートを変更する長いプロセスが経過した後、それをzabbixのホストとして追加することができました。存在するザビックス文書存在するsnmptrapd.confSNMPトラップを有効にするためにいくつかの行(下に示す)を追加しました。

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

私の質問:

  • どういう意味ですか?authCommunity execute public
  • 私はいません。人々コミュニティを設定した後、snmptrapdサービスはSNMPv3トラップを復号化できますか? Wiresharkでは、トラップパケットの内容を表示できるようにSNMPv3資格情報を定義する必要がありますか?
  • そうでない場合、どのように設定しますか?snmptrapd.confPerlスクリプトが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で無効Authorization yesを使用しても、各トランスポートデバイス(スイッチデバイスなど)のEngineIDがないと、SNMPv3トラップは機能しません。

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は、リモートアプリケーションのエンジンIDではなく、トラップを送信するローカルアプリケーションのエンジンIDを使用することです。これは、リモートユーザーデータベースにユーザーを作成するときに注意を払う必要があり、トラップを送信したいエンジンIDごとにユーザーを作成する必要があることを意味します。つまり、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 Trap(Fallback)エントリをInfoType = LogからInfoType = Textに変更しましたTemplate Module Generic SNMPv3

Zabbixに頑張ってください!

関連情報