2022年3月19日土曜日

【Zabbix/ESXi】snmptrapdにてSNMP v3のTrapを受信する

SNMPを使って監視をする場合、現在でもv1やv2cを使うことが多い。SNMP v1やv2cは、ほとんどの機器で対応がされていることや、コミュニティ名のみ設定が完了するといったシンプルな面で現在も根強く使われているものと想定される。

しかし、SNMP v2c以前のバージョンでは通信が暗号化されないなどの脆弱な要素もある。SNMP v3を使えば、ユーザ名、認証パスワード、暗号化パスワードを設定することができるようになっており、ユーザ単位での認証と通信暗号化ができるようになっている。
※なお、SNMP v3では通信暗号化の機能を「プライバシー」と呼ぶ。

今回、ZabbixのSNMP Trap受信時に使用する「snmptrapd」にて、SNMP v3のTrap受信設定を行うための手順を記載する。SNMP v3 Trap送信側としては、ESXiを利用することにする。

なお、Zabbixではsnmptrapdで受信したTrapをsnmpttにて変換を行い監視する仕組みとなるが、snmpttやZabbix本体の設定変更は特に不要であることを確認している。

環境

  • SNMP v3 Trap受信側: Zabbix 5.0 / snmptrapd
  • SNMP v3 Trap送信側 : ESXi 6,7

SNMP v3 Trap送信設定 (ESXi)

1. Engine IDの設定

SNMP v3を利用する場合、Trap送信元を一意に識別するためのEngine IDを指定する。機器によっては自動生成されるIDとなり、手動での設定は不要となる場合が多い。ESXiの場合も自動生成がされるが、私の環境ではEngine IDが重複したことから、手動で設定することにした。

ESXiのSNMP v3 Trapの設定は、すべてCLIにて行う。ESXiにSSHでログインしたのち、以下コマンドでEngine IDを設定する。Engine IDは5~32 文字の16進文字列であれば、任意で設定して問題ない。

# esxcli system snmp set --engineid 800000000000192168001001

2. SNMP v3の認証・暗号化プロトコルを指定

SNMP v3では認証に使用するプロトコルと、暗号化に使用するプロトコルをそれぞれ設定することができる。

認証プロトコルはMD5またはSHAを選択することができるが、具体的には以下プロトコルとなる。
RFC 3414RFC3826より確認。

  • HMAC-MD5-96
  • HMAC-SHA-96

暗号化プロトコルは当初CBC-DESのみ使用可能だったようだが、機能拡張がされており、AESによる暗号化にも対応している。

  • CBC-DES
  • CFB128-AES-128

なお、RFCとしては上記2種類がサポートされる状況はあるが、暗号化強度が弱いことから、独自にAES256などに対応するパターンもあるようだ。当然だが、SNMP v3 Trap送信側と受信側双方で同じ暗号化方式に対応している必要がある。

ESXiの場合は、RFC準拠のSHA1とAES128の一択となるため、以下の通り設定を行う。

# esxcli system snmp set --authentication SHA1
# esxcli system snmp set --privacy AES128

3. SNMP v3のユーザ、パスワード設定

認証パスワードと暗号化パスワードを以下の通り設定する。

  • 認証パスワード : v3authPass
  • 暗号化パスワード : v3privPass

ESXiの場合パスワードをそのまま指定ができないため、以下コマンドでハッシュ化した文字列を取得する。

# esxcli system snmp hash --auth-hash v3authPass --priv-hash v3privPass --raw-secret
   Authhash: af248a5ff20f816a70121031ba4e9fd69a44b6e5
   Privhash: fcec9a30a5454d50755efeee8f171cceaa9db702

ハッシュ値を確認したら、以下の構文で設定を行う。

esxcli system snmp set -u [ユーザ名]/[認証パスワードのハッシュ]/[暗号化パスワードのハッシュ]/priv

設定例は以下となる。

# esxcli system snmp set -u trapuser/ce534f0992ccea99c435360c52f25c3ea550a933/6fa4e7b290552b6c7c88112fdf3fc1e56e54948b/priv

4. SNMP v3 Trapの送信設定

Trap送信先を指定する。構文は以下の通り

esxcli system snmp set --v3targets [Trap送信先]@162/[ユーザ名]/priv/trap

設定例は以下となる。

# esxcli system snmp set --v3targets 192.168.1.2@162/trapuser/priv/trap

5. SNMP有効化と設定確認

最後にSNMP有効化と設定確認を行う。

# esxcli system snmp set --enable true

# esxcli system snmp get
   Authentication: SHA1
   Communities: public
   Enable: true ←★trueであること
   Engineid: 800000000000192168001001
   Hwsrc: indications
   Largestorage: true
   Loglevel: info
   Notraps: 
   Port: 161
   Privacy: AES128
   Remoteusers:
   Syscontact:
   Syslocation:
   Targets:
   Users: trapuser/ce534f0992ccea99c435360c52f25c3ea550a933/6fa4e7b290552b6c7c88112fdf3fc1e56e54948b/priv
   V3targets: 192.168.11.24@162 trapuser priv trap

以上でESXiにおけるSNMP v3 Trapの送信設定は完了となる。

SNMP v3 Trap受信設定 (snmptrapd)

1. snmptrapd.confを設定

snmptrapdの設定はSNMP v2と同様、/etc/snmp/snmptrapd.confに設定追加を行う。

createUser -e 0x[Engine ID] [ユーザ名] SHA [認証パスワード] AES [暗号化パスワード]
authUser log,execute,net [ユーザ名]

設定例は以下の通り。先ほど設定したESXiと同一のEngine ID、ユーザ名、認証パスワード、暗号化パスワードを設定する。

# cat /etc/snmp/snmptrapd.conf
/usr/bin/bin/my_great_script cold

createUser -e 0x800000000000192168001001 trapuser SHA v3authPass AES v3privPass

authUser log,execute,net trapuser
authCommunity   log,execute,net public
traphandle default /usr/sbin/snmptthandler

2. snmptrapdを再起動

設定反映のためsnmptrapdを再起動する。注意事項として、設定反映のためにはなぜか2回再起動が必要となるので注意する。

# systemctl restart snmptrapd
# systemctl restart snmptrapd

実際の設定は/var/lib/net-snmp/snmptrapd.confに記載される。念のため、設定が反映されていることを確認しておこう。usmUserから始まる行が追加されていれば問題ない。

# cat /var/lib/net-snmp/snmptrapd.conf | grep usmUser
usmUser 1 3 0x800000000000192168001001 "trapuser" "trapuser" NULL .1.3.6.1.6.3.10.1.1.3 0xaf248a5ff20f816a70121031ba4e9fd69a44b6e5 .1.3.6.1.6.3.10.1.2.4 0xfcec9a30a5454d50755efeee8f171cce 0x

3. SNMP v3 Trap受信確認

最後にSNMP v3 Trapを受信できることを確認する。ESXiからは以下コマンドにてテストTrapの送信が可能となる。

# esxcli system snmp test
   Comments: There is 1 target configured, send warmStart requested, test completed normally.

snmptrapdでログが受信したかどうかは/var/log/messagesを確認すればよい。

# tail -1 /var/log/messages
Sep  4 17:26:17 localhost snmptrapd[29984]: 2021-09-04 17:26:17 <UNKNOWN> [UDP: [192.168.1.1]:26522->[192.168.1.2]:162]:#012.1.3.6.1.2.1.1.3.0 = Timeticks: (120893100) 13 days, 23:48:51.00#011.1.3.6.1.6.3.1.1.4.1.0 = OID: .1.3.6.1.6.3.1.1.5.2

参考までにZabbixの管理画面でも監視状況を確認したところ、問題なくSNMP v3のテストTrapの監視ができていることが確認できた。

【参考】snmptrapdの設定削除

snmptrapdの設定追加後、不要になったTrap受信設定を削除したい場合、/etc/snmp/snmptrapd.confの設定を削除するだけでは、設定削除されない。したがって、直接/var/lib/net-snmp/snmptrapd.confから不要な設定を削除する。

なお、サービスを停止してから設定削除を行う必要があるので注意すること。もしサービス起動状態で設定削除を行っても、サービス再起動をすると設定が戻ってしまう。

# vi /etc/snmp/snmptrapd.conf ←★事前に設定を削除

# systemctl stop snmptrapd ←★サービスを停止
# sed -ie '/^usmUser.*/d' /var/lib/net-snmp/snmptrapd.conf ←★usmUserで始まる行をすべて削除

# systemctl start snmptrapd ←★サービス起動
# systemctl restart snmptrapd ←★設定反映のためサービス再起動

参考

0 件のコメント:

コメントを投稿

人気の投稿