スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Splunk その10

今回は Splunk サーバで受信した SNMP Trap を検索できるようセットアップしてみます。

1. Net-SNMP のインストール

Splunk サーバで Trap を受信するために、Net-SNMP パッケージに含まれる snmptrapd を使用します。

Net-SNMP がインストールされていない場合はインストールします。パッケージとして必須なのは net-snmp のみですが、net-snmp-utils もあると便利なので、一緒にインストールしておきましょう。

[root@splunk ~]# rpm -qa | grep net-snmp
[root@splunk ~]# yum install net-snmp net-snmp-utils
:
==========================================================================================
 Package                 Arch            Version                      Repository     Size
==========================================================================================
Installing:
 net-snmp                x86_64          1:5.3.2.2-9.el5_5.1          base          702 k
 net-snmp-utils          x86_64          1:5.3.2.2-9.el5_5.1          base          188 k
Installing for dependencies:
 net-snmp-libs           x86_64          1:5.3.2.2-9.el5_5.1          base          1.3 M

Transaction Summary
==========================================================================================
Install       3 Package(s)
Upgrade       0 Package(s)

Total download size: 2.1 M
Is this ok [y/N]: y
:
Installed:
  net-snmp.x86_64 1:5.3.2.2-9.el5_5.1      net-snmp-utils.x86_64 1:5.3.2.2-9.el5_5.1     

Dependency Installed:
  net-snmp-libs.x86_64 1:5.3.2.2-9.el5_5.1                                                

Complete!

ちなみに、yum でインストールされる Net-SNMP パッケージのバージョンは、CentOS 5.5 では 5.3 台、Scientific Linux 6 では 5.5 台になるようです。最新の Net-SNMP をインストールする場合は、Net-SNMP のダウンロードページ からソースを取得してコンパイルしてください。なお、SL6 環境で 5.6.1 をデフォルトのオプションでコンパイルした際には、file と perl-ExtUtils-MakeMaker パッケージの追加インストールが必要でした。configure や make に失敗する場合は、これらのパッケージのインストール状態を確認してみるとよいでしょう。

2. snmptrapd のセットアップ

① snmptrapd の起動オプションを変更します(赤字部分を青字に変更)。

[root@splunk ~]# vi /etc/init.d/snmptrapd
#!/bin/bash

# ucd-snmp init file for snmptrapd
#
# chkconfig: - 50 50
# description: Simple Network Management Protocol (SNMP) Trap Daemon
#
# processname: /usr/sbin/snmptrapd
# config: /etc/snmp/snmptrapd.conf
# config: /usr/share/snmp/snmptrapd.conf
# pidfile: /var/run/snmptrapd.pid
#
# pidfile: /var/run/snmptrapd.pid
#
# source function library
. /etc/init.d/functions

# OPTIONS="-Lsd -p /var/run/snmptrapd.pid"
OPTIONS="-a -m +ALL -Ls2 -OQs -p /var/run/snmptrapd.pid"
if [ -e /etc/sysconfig/snmptrapd.options ]; then
  . /etc/sysconfig/snmptrapd.options
fi

RETVAL=0
prog="snmptrapd"

start() {
        echo -n $"Starting $prog: "
        daemon /usr/sbin/snmptrapd $OPTIONS
        RETVAL=$?
        echo
        touch /var/lock/subsys/snmptrapd
        return $RETVAL
}

stop() {
        echo -n $"Stopping $prog: "
        killproc /usr/sbin/snmptrapd
        RETVAL=$?
        echo
        rm -f /var/lock/subsys/snmptrapd
        return $RETVAL
}

reload(){
        stop
        start
}

restart(){
        stop
        start
}

condrestart(){
    [ -e /var/lock/subsys/snmptrapd ] && restart
    return 0
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  reload)
        reload
        ;;
  condrestart)
        condrestart
        ;;
  status)
        status snmptrapd
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
        RETVAL=1
esac

exit $RETVAL

オプションの意味は以下の通りです。

-a : authenticationFailure トラップを無視します。
-m +ALL : デフォルトで読み込まれる MIB モジュールに、MIB ディレクトリに存在するモジュールを追加します。
-Ls2 : syslog 経由でログ出力を行い、facility として local2 を使用します。占有できる facility がない場合には、デフォルトの -Lsd のままにして、後述する programname による出力先指定を行いましょう。
-OQs : ログ出力から MIB モジュールの名前や variable bindings の型情報を削除します。

② snmptrapd の設定ファイルを編集します。

設定ファイルのデフォルトのパスは /etc/snmp/snmptrapd.conf です。ソースからインストールしている環境では /usr/local/etc/snmp/snmptrapd.conf 等になっていると思いますので、man snmptrapd.conf で確認してください。

[root@splunk ~]# vi /etc/snmp/snmptrapd.conf
authCommunity log public
format1 \n hostname = "%A"\n source = "%a"\n security = "%P"\n enterprise = "%N"\n generic_type = "%W"\n specific_type = "%q"\n uptime = "%#T"\n variable-bindings:\n%V\n + % + %v\n\n
format2 \n hostname = "%B"\n source = "%b"\n security = "%P"\n variable-bindings:\n%V\n + % + %v\n\n

オプションの意味は以下の通りです。

authCommunity log public : "public" というコミュニティを持つ Trap をログに出力します。

5.3 から community の認証が必須となり、authCommunity による指定がない community を持つ Trap は破棄されるようになりました。どんな community でも受け入れるよう設定するには、snmptrapd の起動オプションに「--disableAuthorization=yes」を追加するか、snmptrapd.conf に「disableAuthorization yes」を追加する必要があります。

format1 : SNMP v1 Trap の出力形式を指定します。
format2 : SNMP v2 Trap の出力形式を指定します。

使用可能な変数については man snmptrapd の FORMAT SPECIFICATIONS を参照してください。
注意点として、\n や ¥t などの特殊文字は、snmptrapd のログの出力先に syslog を指定した場合には自動的に「# + 8 進数表記の文字コード」に変換されてしまい、有効に機能しません。

syslog 経由でのログ出力例
May 14 20:09:11 splunk snmptrapd[6603]: #012 hostname = "rt01"#012 source = "192.168.100.111"#012 security = "TRAP, SNMP v1, community public"#012 enterprise = "snmpTraps"#012 generic_type = "Link Up"#012 specific_type = "0"#012 uptime = "7:32:30.10"#012 variable-bindings:#012 + ifIndex.2 = 2#012 + ifDescr.2 = FastEthernet0/1#012 + ifType.2 = ethernetCsmacd#012 + locIfReason.2 = "up"

このため、syslog 経由でログ出力する場合は上記文字コードを splunk で改行コードに再変換する必要があります(具体的な方法については後述します)。

※ ちなみに、rsyslogd を利用している場合は、rsyslog.conf に $EscapeControlCharactersOnReceive off を設定することで、こうした動作を無効化することが可能です(デフォルトは on)。

また、参考までに起動時に -Lf オプションを指定して syslog を経由せず直接ファイルにログを出力する場合のフォーマットと、出力例も掲載しておきます。この場合、/etc/logrotate.d ディレクトリの下にローテーションのための定義を作成し、postrotate で snmptrapd に HUP シグナルを送るよう設定する必要があります。

format1 %y/%m/%l %h:%j:%k\n hostname = "%A"\n source = "%a"\n security = "%P"\n enterprise = "%N"\n generic_type = "%W"\n specific_type = "%q"\n uptime = "%#T"\n variable-bindings:\n%V\n + % + %v\n\n
format2 %y/%m/%l %h:%j:%k\n hostname = "%B"\n source = "%b"\n security = "%P"\n variable-bindings:\n%V\n + % + %v\n\n

【参考】 直接ファイルに出力した場合のログ出力例
2011/5/15 0:56:54
 hostname = "rt01"
 source = "UDP: [192.168.100.111]:50048"
 security = "TRAP2, SNMP v2c, community public"
 variable-bindings:
 + sysUpTimeInstance = 0:12:20:16.50
 + snmpTrapOID.0 = linkDown
 + ifIndex.2 = 2
 + ifDescr.2 = FastEthernet0/1
 + ifType.2 = ethernetCsmacd
 + locIfReason.2 = "administratively down"

③ サーバ起動時に snmptrapd が自動起動するよう設定します。

[root@splunk ~]# chkconfig --list snmptrapd
snmptrapd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@splunk ~]# chkconfig snmptrapd on
[root@splunk ~]# chkconfig --list snmptrapd
snmptrapd       0:off   1:off   2:on    3:on    4:on    5:on    6:off

④ 追加の MIB ファイルを MIB ディレクトリに配置します。

ログに含まれる OID をオブジェクト名に変換するため、MIB ディレクトリ(デフォルトのパスは /usr/share/snmp/mibs)に MIB ファイルを追加します。例えば、Cisco 機器の LinkUp/LinkDown Trap を監視する場合は、以下の 3 つのファイルを追加します(Trap が定義されている MIB だけではなく、Trap の variable binding が定義されている MIB も必要なので注意してください)。

CISCO-SMI.my
CISCO-TC.my
OLD-CISCO-INTERFACES-MIB.my

⑤ 設定が完了したら、snmptrapd を再起動します。

[root@splunk ~]# service snmptrapd restart
snmptrapd を停止中:                                        [  OK  ]
snmptrapd を起動中:                                        [  OK  ]

3. iptables の設定(オプション)

SNMP Trap の標準待ち受けポートである 162/udp での受信を許可するよう、iptable にルールを追加します。

① まずは現状のルールを確認します。

[root@splunk ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      156 87916 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 135 packets, 15670 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination
1       43  7090 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 255
3        0     0 ACCEPT     esp  --  *      *       0.0.0.0/0            0.0.0.0/0
4        0     0 ACCEPT     ah   --  *      *       0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            224.0.0.251         udp dpt:5353
6        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:631
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8      105 78103 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8000
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8089
12       5  1124 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:514
13       3  1599 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:9997
14       0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

② 新たなルールの挿入位置を確認し(今回は ACCEPT 行の末尾に挿入するため 14 行目)、162/udp 宛てのトラフィックを許可するルールを追加します(必要に応じてアドレスによる制限をかけて下さい)。

[root@splunk ~]# iptables -I RH-Firewall-1-INPUT 14 -p udp --dport 162 -j ACCEPT
[root@splunk ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     3288 1601K RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 2855 packets, 391K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination
1     1215  266K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 255
3        0     0 ACCEPT     esp  --  *      *       0.0.0.0/0            0.0.0.0/0
4        0     0 ACCEPT     ah   --  *      *       0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            224.0.0.251         udp dpt:5353
6        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:631
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8     1915 1304K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10       4   208 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8000
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8089
12     132 28020 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:514
13      19  2495 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:9997
14       0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:162
15       3   691 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

③ 設定を保存します。

[root@splunk ~]# service iptables save
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]

4. syslog の設定

① facility が local2 のログを /var/log/snmptrap.log に出力するよう、syslog の設定を行います。

ここでは ryslogd を利用しているため、/etc/rsyslog.conf に以下の行を追加します。

local2.*                                               -/var/log/snmptrap.log

なお、facility に空きがない場合には、以下のように programname による出力先の指定も可能です。

::programname, isequal, "snmptrapd" -/var/log/snmptrap.log
& ~

② ログのローテーション設定を追加します。

以前、ネットワーク機器用に作成したローテンションポリシーを /var/log/snmptrap.log にも適用します。

[root@splunk ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
/var/log/remote/*\.log /var/log/snmptrap.log {
    rotate 1
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

③ rsyslogd の再起動を行います。

[root@splunk ~]# service rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]

5. splunk の設定

① 任意の App の inputs.conf を編集して、/var/log/snmptrap.log のモニタ設定を追加します。

今回は sample_syslog App の設定ファイルを編集します。

/opt/splunk/etc/apps/sample_syslog/local/inputs.conf
[monitor:///var/log/snmptrap.log]
disabled = 0
sourcetype = snmptrap

なお、*NIX App を使用して、/var/log ディレクトリのファイルをモニタしている場合には、/opt/splunk/etc/apps/unix/local/inputs.conf を編集して blacklist に /var/log/snmptrap.log を追加しておきましょう。

/opt/splunk/etc/apps/unix/local/inputs.conf の設定例
[monitor:///var/log]
disabled = 1
blacklist = (lastlog|snmptrap\.log)

② props.conf を編集して、改行コードの変換と、フィールド抽出のための設定を追加します。

/opt/splunk/etc/apps/sample_syslog/local/props.conf
[snmptrap]
SEDCMD-replace_012_to_LF = s/#012/\n/g
REPORT-snmptrap = snmpv2-name-extract snmp-secinfo-extract

※ SEDCMD はインデックス時に実行される変換設定のため、大規模環境などでパフォーマンスへの影響が気になる場合は、検索条件の末尾に「| rex mode=sed "s/#012/\n/g"」を付け足すことで、同等の出力を得ることができます。

③ transforms.conf を編集して、フィールド抽出のための設定を追加します。

/opt/splunk/etc/apps/sample_syslog/local/transforms.conf
[snmpv2-name-extract]
REGEX = \+ snmpTrapOID\.\d+ = (\S+)
FORMAT = name::$1

[snmp-secinfo-extract]
REGEX = security = "\w+, SNMP (\S+), community (\S+)"
FORMAT = version::$1 community::$2

これにより、「community=public」や「version=v2c」といった検索条件が使用できるようになります。また、Version 2c の Trap については「name=linkUp」の形式で、Trap のオブジェクト名を検索条件に指定できます(v1 Trap については、特に設定をしなくても「generic_type="Link Up"」や「specific_type="clogMessageGenerated"」などの条件が利用可能です)。

④ splunk を再起動します。

[root@splunk ~]# splunk restart
                                                           [  OK  ]
Stopping splunkweb...Stopping splunkd...
Shutting down.  Please wait, as this may take a few minutes.
.......                                                    [  OK  ]
Stopping splunk helpers...
                                                           [  OK  ]
Done.

Splunk> CSI: Logfiles.

Checking prerequisites...
        Checking http port [8000]: open
        Checking mgmt port [8089]: open
        Checking configuration...  Done.
        Checking index directory...
        Validated databases: _audit _blocksignature _internal _thefishbucket history main os summary summary_forwarders summary_hosts summary_indexers summary_pools summary_sources summary_sourcetypes
        Done
Success
        Checking conf files for typos...
All preliminary checks passed.

Starting splunk server daemon (splunkd)...
                                                           [  OK  ]
                                                           [  OK  ]
Done.Starting splunkweb... Done.
If you get stuck, we're here to help.
Look for answers here: http://www.splunk.com/base/Documentation

The Splunk web interface is at http://splunk:8000

⑤ テスト用の Trap を発行して、Splunk Web から確認を行います。

[root@splunk ~]# snmptrap -v 1 -c public localhost enterprises.1 localhost 3 0 ' '
[root@splunk ~]# snmptrap -v2c -c public localhost 1 1

Splunk Web から「sourcetype=snmptrap」で検索を行い、以下のように表示されれば正しく設定できています。

splunk_10-1.png



今回はひとまず、Splunk から Trap を検索できるようになるところまでを解説しました。

SNMPTT 等を使ったより高度な Trap の管理については、また別途紹介したいと思います。
関連記事

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

-

管理人の承認後に表示されます

-

管理人の承認後に表示されます

コメントの投稿

非公開コメント

プロフィール

米麹

筆者: 米麹
某社に勤務する SE です。
ここでは本職とは関係のない趣味的な検証情報などを書いていきます。

注意事項とお願い
記事の内容は掲載時点のもので、現在は異なる可能性があります。情報に誤りや不適切な事項があった場合には、コメントやメールフォームでご指摘下さい。
また、本サイトの情報を利用することによって生じたいかなる損害についても、筆者は責任を負いかねますのでご了承下さい。
カレンダー
04 | 2018/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最新記事
月別アーカイブ
カテゴリ
全記事表示リンク

全ての記事を表示する

検索フォーム
メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。