ZabbixでDNSSECの有効期間を監視してみた

DNS
Published: 2011-11-05

 DNSSECを導入してから4か月が過ぎました。スマート署名や全自動ゾーン署名といったDNSSECの運用を簡単にする仕組みがあるようなのですが、へっぽこDNS運用担当な私は手動更新です。

 当然、有効期間内に再署名しないといけないのですが、過去に再署名を忘れて自ドメインを検証失敗にしてしまった実績があるので、Zabbixで有効期間を監視する事にしました。今後は、有効期間の最終週になるとメール通知されるはずです。以下メモ。

 ※注意 : スクリプト内でdig +dnssecコマンドを利用しているため、zabbixサーバがdig +dnssecを実行出来る必要があります。私はセカンダリDNS上でzabbixを動かしています

1.外部チェック用のシェルを作る。

 見よう見まねでスクリプトを書きました。スクリプトでは、Zabbixから渡されるドメイン名と権威DNS名を利用して、監視したいゾーンの権威DNSにdigを行います。そして、その結果からRRSIGの有効期間最終日を取得します。最後に、最終日と今日との差分を計算し、標準出力としてZabbixに値を返します。スクリプトの格納先は/etc/zabbix/externalscriptsです。

 差分の求め方は@kleinsbottleに頂いたアドバイスが参考になりました。ありがとうございました。

#!/bin/sh
domain=$1
dns=$2

response=`dig @$dns $domain +dnssec`

rrsig_end=`echo $response | sed -e "s/^.*RRSIG.*8 [0-9] [0-9]\+ \([0-9]\+\) [0-9]\+.*$/\1/g"`

now=`date +"%Y%m%d"`

rrsig_yy=`echo $rrsig_end | awk '{print substr($0,1,4);}'`
rrsig_mm=`echo $rrsig_end | awk '{print substr($0,5,2);}'`
rrsig_dd=`echo $rrsig_end | awk '{print substr($0,7,2);}'`
rrsig_hh=`echo $rrsig_end | awk '{print substr($0,9,2);}'`
rrsig_mmm=`echo $rrsig_end | awk '{print substr($0,11,2);}'`

rrsig_end=`date +%s --date "$rrsig_yy-$rrsig_mm-$rrsig_dd $rrsig_hh:$rrsig_mmm"`
now=`date +%s --date "$now"`

diff=`expr $rrsig_end - $now`
diff=`expr $diff / 86400`
echo $diff

2.監視したいゾーンをホストとして登録

 外部チェック用シェルの第一引数としてホスト名を利用している都合上、監視したいゾーン名でホストを登録します。DNS名もホスト名と同一にし、接続方法をDNSにします。

3.アイテムの作成

登録したホストに対して、先ほどのスクリプトを利用したアイテムを追加します。キーの箇所にはパラメータとしてスクリプトの第二引数である権威DNS名を追加します。こうすると、スクリプトでは「dig @dns1.aimless.jp aimless.jp +dnssec」が実行されます。

dnssec_item

3.トリガーの設定

 アイテムの戻り値(有効期間の最終日と現在との差分)が8未満だった場合に、致命的な障害としてイベントを生成するトリガーを作成します。

dnssec_triger

4.アクションの追加

 トリガーが生成したイベントが障害な時に、メールを飛ばすアクションを定義します。私の環境ではadminのメールアドレスが携帯のメアドになっているので、adminユーザ宛にメールを飛ばすようにしました。

5.確認

 上記設定後、現在の差分がグラフに描画されている事を確認しています。したがって、情報収集に関するスクリプトの作りとZabbixの設定は問題ないと思います。あとは、再署名を放置し続けてメールが飛んでくるかを確認したいと思います。Zabbixがメールを送信してくれないと、有効期間切れの悪夢が再び訪れるかもしれません。。。