Bind9 Statistics for Cacti

まえおき

DNSの攻撃が問題になっている昨今、自前のキャッシュサーバといえども、否、だからこそ、統計のチェックをして攻撃されていないか、攻撃に使用されていないかを確認する必要があります。で、今回はその統計のチェックを Cacti でやるための追加設定の方法を紹介しましょう。
参考:

ダウンロード

から bind9-snmp_1.6.tgz を落としてくるんだけど、いま見たら bayour.com が 404 返すなあ。手元にあるのは少し前にあらかじめ落としてきてあったものです。
手元の環境は下記のとおり。

ファイルのインストールと設定

# tar -C /tmp -zxvf bind9-snmp_1.6.tgz
# cd /tmp/bind9-snmp-1.6/
# cp BAYOUR-COM-MIB.txt /usr/local/share/snmp/mibs/
# cp bind9-snmp-stats.pl snmp*.conf.stub /usr/local/etc/snmp
# cp bind9-stats_*.xml /usr/local/share/cacti/resource/snmp_queries/
# cp BayourCOM_SNMP.pm /usr/local/lib/perl5/site_perl/

BayourCOM_SNMP.pm は perl -V して出る @INC: のどれかのパスにコピーする。

つぎに snmp*.conf の設定。

# cd /usr/local/etc/snmp
# cat snmp.conf.stub >> snmp.conf
# cat snmpd.conf.stub >> snmpd.conf
# cat snmpd.conf.stub
[省略]
pass_persist .1.3.6.1.4.1.8767.2.1   /usr/local/etc/snmp/bind9-snmp-stats.pl

snmpd.conf.stub 見ればわかるとおり、OID .1.3.6.1.4.1.8767.2.1 に対して bind9-snmp-stats.pl を実行し、Bind9の統計情報を取得して、SNMPで返すということをやっている。bind9-snmp-stats.pl は rndc stats を実行した後 stats file から値を読み取るというスクリプト

続いて bind9-snmp-stats.pl 用の設定ファイルを作る。bind9-snmp-stats.plのアタマの部分に

 my $CFG_FILE = "/etc/bind/.bindsnmp";

と設定ファイルがどこにあるかを書くようになっているので、これを適切なファイル名に変更する。今回は /usr/local/etc/snmp/bindsnmp ファイルに設定を書く。設定例は同じくスクリプト中のコメントにもあるし、README.txt にも書いてある。こんな感じで。

DEBUG=4
DEBUG_FILE=/chroot/named/var/log/bind9-snmp-stats.log
IGNORE_INDEX=1
RNDC=/usr/sbin/rndc
RNDC_OPTS=-c /chroot/named/etc/rndc.conf
STATS_FILE=/chroot/named/var/stats/named.stats
STATS_FILE_OWNER_GROUP=bind:bind
DELTA_DIR=/var/tmp

いまの環境では bind を chroot して使っているのでそれに合わせて多少変えている。RNDC_OPTS は本来ないオプションで、今回追加したもの(後述)。rndc の設定ファイルを chroot 環境のパスにおいているので、設定ファイル位置を指定するために入れてある。

スクリプトの修正

とりあえず diff から見よう。

--- bind9-snmp-stats.pl.orig    Tue Feb  7 19:54:06 2006
+++ bind9-snmp-stats.pl Wed Mar 21 09:58:24 2007
@@ -17,7 +17,7 @@
 #
 # If the location of the config file isn't good enough for you,
 # feel free to change that here.
-my $CFG_FILE = "/etc/bind/.bindsnmp";
+my $CFG_FILE = "/usr/local/etc/snmp/bindsnmp";
 #
 #   Optional arguments
 #      DEBUG=4
@@ -469,7 +469,7 @@
     %CFG = get_config($CFG_FILE);

     debug(0, "=> Dumping Bind9 stats\n") if($CFG{'RNDC'} && ($CFG{'DEBUG'} > 1));
-    system($CFG{'RNDC'}." stats") if($CFG{'RNDC'});
+    system($CFG{'RNDC'}." ".$CFG{'RNDC_OPTS'}." stats") if($CFG{'RNDC'});

     my $tmp =  $CFG{'STATS_FILE'};
     $tmp =~ s/\W/_/g;
@@ -611,7 +611,7 @@
        }

        # Re-get the DEBUG config option (so that we don't have to restart process).
-       $CFG{'DEBUG'} = get_config('DEBUG');
+       $CFG{'DEBUG'} = get_config($CFG_FILE, 'DEBUG');

        # {{{ Get all run arguments - next/specfic OID
        my $arg = $_; chomp($arg);

変更点:

  • 17行目:CFG_FILE は設定ファイル指定。
  • 469行目:rndc にオプションを追加するように変更している。設定ファイルから RNDC_OPTSの値を持ってきてオプションに追加するだけ。
  • 611行目:不具合の修正。ファイル名が引数としてわたっていないためにエラーが起こって動かないようなので変更する。bind9-snmp-stats.pl を実行して適当にReturnを入力したとき、下記のようなメッセージが出てる場合はここを直す。
Argument "2/8" isn't numeric in numeric gt(>) at ./bind9-snmp-stats.pl line 618, <> line 2.

スクリプトの動作確認

# ./bind9-snmp-stats.pl
PING [return]
PONG
getnext [return]
1 [return]
.1.3.6.1.4.1.8767.2.1.1.0
integer
6
# snmpwalk -v2c -c community_string localhost .1.3.6.1.4.1.8767.2.1.3.1
BAYOUR-COM-MIB::b9stCounterName.1 = STRING: success
BAYOUR-COM-MIB::b9stCounterName.2 = STRING: referral
BAYOUR-COM-MIB::b9stCounterName.3 = STRING: nxrrset
BAYOUR-COM-MIB::b9stCounterName.4 = STRING: nxdomain
BAYOUR-COM-MIB::b9stCounterName.5 = STRING: recursion
BAYOUR-COM-MIB::b9stCounterName.6 = STRING: failure
BAYOUR-COM-MIB::b9stCounterTotal.1 = INTEGER: 3439
BAYOUR-COM-MIB::b9stCounterTotal.2 = INTEGER: 0
BAYOUR-COM-MIB::b9stCounterTotal.3 = INTEGER: 49
BAYOUR-COM-MIB::b9stCounterTotal.4 = INTEGER: 160
BAYOUR-COM-MIB::b9stCounterTotal.5 = INTEGER: 3192
BAYOUR-COM-MIB::b9stCounterTotal.6 = INTEGER: 17

こんな感じで値が出力されてればOK。

グラフの設定

グラフ情報(ホストテンプレート) cacti_host_template_bind9_snmp_machine.xml はブラウザ経由でインポートする。

  • [console]-"Import/Exprrt" [Import Templates]-[参照]
    • cacti_host_template_bind9_snmp_machine.xmlを選択して OK
  • [console]-"Devices"
    • Bindの動いている機器を選択
    • "Devices"-"Host Template" : Bind9 SNMP Machine を選択して [Save]
    • [Create Graphs for this Host]から作成する Bind9 Stats Graphを選択
      • Data Query [SNMP - Local - Bind9 Statistics - domains - QUERY]
      • Data Query [SNMP - Local - Bind9 Statistics - totals - QUERY]

domains はゾーン管理をしているBindでドメインごとにクエリを分析したい場合。Statsでドメイン別の情報を出すようにオプションを設定してやる必要がある。

options {
    zone-statistics "yes";
};

かな。いま対象にしているのはキャッシュサーバなので totals のみ使用してる。