2021年4月13日火曜日

【Zabbix】SNMP Trapに含まれる16進文字を通常文字に変換して監視する

ZabbixのSNMP Trap監視は、snmptrapdにて受信したトラップをSNMPTT (SNMP Trap Transfer)や変換スクリプトを使って整形し、出力されたログファイルをZabbixにて監視させることによって実現される。

SNMP Trapで受信した文字は、トラップ内容によっては16進文字 (Hex-string) で送信されてくることがある。16進文字とは以下のように、E3 83 86 ...といった16進の2桁の文字で構成される文字列となり、人間では読み解くことができない

2021/01/30 09:44:48 .1.3.6.1.4.1.6876.4.3.0.203 Normal "Status Events" t1160vcsa.intrat.local - 
ZBXTRAP 192.168.11.160 vpxdAlarmInfo This notification is sent on entity alarm state change, 
by the vCenter Server SNMP agent. 3 Gray Yellow 
E3 83 86 E3 82 B9 E3 83 88 E3 82 A2 E3 83 A9 E3  
83 BC E3 83 A0 20 28 E4 BB AE E6 83 B3 E3 83 9E  
E3 82 B7 E3 83 B3 E4 BD 9C E6 88 90 29 20 2D 20  
~(中略)~ 
72 63 65 20 70 6F 6F 6C 3A 20 43 6C 75 73 74 65  
72 31 36 30 0A 44 61 74 61 20 63 65 6E 74 65 72  
3A 20 44 61 74 61 63 65 6E 74 65 72 31 36 30 0A  
test-vm

16進文字は、変換サイトなどを使えば通常文字へ変換することができ、上記の16進文字は以下文字列となる。

2021/01/30 09:44:48. .1.3.6.1.4.1.6876.4.3.0.203 Normal Status Events t1160vcsa.intrat.local - 
ZBXTRAP 192.168.11.160 vpxdAlarmInfo This notification is sent on entity alarm state change, 
by the vCenter Server SNMP agent. 3 Gray Yellow 
テストアラーム (仮想マシン作成) - 
Event: VM created (10362) 
Summary: Created virtual machine test-vm on t1161esxi.intrat.local in Datacenter160 
Date: 01/30/2021 12:44:48 AM 
User name: VSPHERE.LOCAL\Administrator 
VM: test-vm 
Host: t1161esxi.intrat.local 
Resource pool: Cluster160 
Data center: Datacenter160 test-vm

本記事では、SNMP Trapに含まれる16進文字を通常文字に変換するスクリプトを作成し、SNMPTTの処理に組み込むことでZabbixにてSNMP Trapの内容を確認できるようにする

環境

  • OS : CentOS 8.1
  • Zabbix : 5.0.7
  • SNMPTT : 1.4.2

手順

1. SNMPTTのインストールおよびZabbixのSNMP Trap監視設定

SNMPTTのインストールおよびZabbixのSNMP Trap監視設定の手順は、以前以下記事にて記載している。もし実施前の場合は、参照してインストールと設定をしておくこと。

2. xxdをインストール

16進文字を変換するためxxdコマンドをインストールする。xxdvim-commonのパッケージに含まれる。

# dnf install vim-common -y

3. 16進文字を通常文字に変換するスクリプトを作成

変換スクリプトは/usr/local/bin/convert_hex_to_string.shという名称で、以下の通り作成する。

#!/bin/bash

# 標準入力を変数に代入
trap_message=$(cat -)

# ログ出力先を設定
output_file="/var/log/snmptrap/snmptrap_convert.log"

# 16進文字を抽出
hex_string=$(echo ${trap_message} | egrep 'ZBXTRAP .*' | egrep -o ' [A-F0-9]{2} .* [A-F0-9]{2}')

if [[ ${hex_string} = "" ]]; then
    # 16進文字が含まれない場合は変換しない
    msg=$(echo ${trap_message})
else
    # 16進文字が含まれる場合は変換する

    # 16進文字より前の文字列を抽出
    first_message=$(echo ${trap_message} | sed -e "s/ [A-F0-9]\{2\} .* [A-F0-9]\{2\}.*$//g")

    # 16進文字をxxdコマンドを使って通常文字に変換し、
    # 1行で表示させるため改行を削除
    normal_string=$(echo ${hex_string} | xxd -r -p | tr '\n' ' ')

    # 16進文字より後の文字列を抽出
    last_message=$(echo ${trap_message} | sed -e "s/^.* [A-F0-9]\{2\} .* [A-F0-9]\{2\}//g")

    msg=$(echo "${first_message} ${normal_string} ${last_message}")
fi

# ログファイルに出力
echo ${msg} >> ${output_file}
exit 0

なお、本スクリプトで変換したSNMP Trapは、/var/log/snmptrap/snmptrap_convert.logに出力されるので、出力先ファイルをあらかじめ作成しておく。

# touch /var/log/snmptrap/snmptrap_convert.log
# chown snmptt:snmptt /var/log/snmptrap/snmptrap_convert.log

4. SNMPTTにスクリプト組み込み

SNMPTT本体となる/usr/sbin/snmpttに対して、先ほど作成した変換スクリプトを処理に組み込む。/usr/sbin/snmpttはPerlスクリプトとなり、1784行のif ($log_enable == 1)のif文の中の処理でログ出力が実施されているため、そこにconvert_hex_to_string.shを実行する処理を追加する。

▼修正前

        if ($log_enable == 1)
        {
          $trap_attempted_to_log++;	

          if (open LOGFILE, ">>$log_file")
          {
            print LOGFILE $trap_date_time." $message";
            close LOGFILE;
            $trap_successfully_logged++;
          }

▼修正後

        if ($log_enable == 1)
        {
          $trap_attempted_to_log++;	

          if (open LOGFILE, ">>$log_file")
          {
            print LOGFILE $trap_date_time." $message";
            close LOGFILE;
            $trap_successfully_logged++;

            # Execute a script that convert Hex-string to String
            my $convert_cmd = "echo $trap_date_time.\" $message\" | /usr/local/bin/convert_hex_to_string.sh";
            system($convert_cmd) == 0 or die "Can't execute $convert_cmd";
          }

5. Zabbix設定

変換スクリプトのログ出力先は/var/log/snmptrap/snmptrap_convert.logとなるので、本ログをSNMP Trapのログファイルとして監視できるようZabbix Serverの設定を行う。

設定は、/etc/zabbix/zabbix_server.confを以下の通り修正する。

SNMPTrapperFile=/var/log/snmptrap/snmptrap_convert.log
StartSNMPTrapper=1

設定反映のため、Zabbix Serverを再起動する。

# systemctl restart zabbix-server

6. Zabbixの画面にてSNMP Trapの出力内容を確認

実際に16進文字が含まれるSNMP Trapを出力させて、16進文字が変換されることを確認する。今回は、vCenter Serverにて設定したアラートをZabbixで検知させたることで確認を行った。

▼変換前

# tail /var/log/snmptrap/snmptrap.log
2021/01/30 09:44:48 .1.3.6.1.4.1.6876.4.3.0.203 Normal "Status Events" t1160vcsa.intrat.local - ZBXTRAP 192.168.11.160 vpxdAlarmInfo This notification is sent on entity alarm state change, by the vCenter Server SNMP agent. 3 Gray Yellow E3 83 86 E3 82 B9 E3 83 88 E3 82 A2 E3 83 A9 E3  83 BC E3 83 A0 20 28 E4 BB AE E6 83 B3 E3 83 9E  E3 82 B7 E3 83 B3 E4 BD 9C E6 88 90 29 20 2D 20  45 76 65 6E 74 3A 20 56 4D 20 63 72 65 61 74 65  64 20 28 31 30 33 36 32 29 0A 53 75 6D 6D 61 72  79 3A 20 43 72 65 61 74 65 64 20 76 69 72 74 75  61 6C 20 6D 61 63 68 69 6E 65 20 74 65 73 74 2D  76 6D 20 6F 6E 20 74 31 31 36 31 65 73 78 69 2E  69 6E 74 72 61 74 2E 6C 6F 63 61 6C 20 69 6E 20  44 61 74 61 63 65 6E 74 65 72 31 36 30 0A 44 61  74 65 3A 20 30 31 2F 33 30 2F 32 30 32 31 20 31  32 3A 34 34 3A 34 38 20 41 4D 0A 55 73 65 72 20  6E 61 6D 65 3A 20 56 53 50 48 45 52 45 2E 4C 4F  43 41 4C 5C 41 64 6D 69 6E 69 73 74 72 61 74 6F  72 0A 56 4D 3A 20 74 65 73 74 2D 76 6D 0A 48 6F  73 74 3A 20 74 31 31 36 31 65 73 78 69 2E 69 6E  74 72 61 74 2E 6C 6F 63 61 6C 0A 52 65 73 6F 75  72 63 65 20 70 6F 6F 6C 3A 20 43 6C 75 73 74 65  72 31 36 30 0A 44 61 74 61 20 63 65 6E 74 65 72  3A 20 44 61 74 61 63 65 6E 74 65 72 31 36 30 0A  test-vm

▼変換後

# tail /var/log/snmptrap/snmptrap_convert.log
2021/01/30 09:44:48. .1.3.6.1.4.1.6876.4.3.0.203 Normal Status Events t1160vcsa.intrat.local - ZBXTRAP 192.168.11.160 vpxdAlarmInfo This notification is sent on entity alarm state change, by the vCenter Server SNMP agent. 3 Gray Yellow テストアラーム (仮想マシン作成) - Event: VM created (10362) Summary: Created virtual machine test-vm on t1161esxi.intrat.local in Datacenter160 Date: 01/30/2021 12:44:48 AM User name: VSPHERE.LOCAL\Administrator VM: test-vm Host: t1161esxi.intrat.local Resource pool: Cluster160 Data center: Datacenter160 test-vm

上記のように、出力ログが問題なく変換されていることと、Zabbixの画面上で問題なく表示されることが確認できれば、対応は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿