OXY NOTES

BINDのlogを適切に設定して攻撃の予兆を察知しよう

ハッカーの攻撃対象になりやすいBIND DNSサーバ

BINDのセキュリティについて、以前の投稿でchroot化やDNS Amp攻撃の対処方法などを解説しました。

性善説に基づいて設計されたBINDはその他にも数々の脆弱性が発見され、その度に緊急のアップデートを繰り返しています。ハッカーもその点は心得ていて、手っ取り早く踏み台を探すためにまずはBINDを狙ってきます。

困った状況と言えますが、逆手に取れば「BINDのログを監視すれば攻撃の意思を持つアクセスを特定できる」と言い換えることもできます。

そこでこのページではBINDで適切なログを収集する方法を解説します。


一般的なロギングの例

BINDには予めログを制御する方法が用意されています。
設定は「/etc/named.conf」で行います。いきなり細かな設定を追うよりも、実際の例を通して解説したほうが理解が早いと思います。

まずは下準備としてログを書き出すディレクトリを作成します。今回は「/var/log/named/」に書き出す設定にしました。

# mkdir /var/log/named/
# chown named.named /var/log/named/

以下、一般的なログを出力する設定の例です。「/etc/named.conf」に追記してください。

logging {
        channel "default-log" {
                file "/var/log/named/default.log" versions 5 size 10M;
                severity debug;
                print-time yes;
                print-severity yes;
                print-category yes;
        };
		
        category default { "default-log"; };
};

1行目、「loggingセクション」でロギングに関する設定を開始します。

2行目、「default-log」というチャンネルを定義。

3行目、「file」でログファイルの場所と、ローテーションして残しておくバージョンの数、ログファイルのサイズを指定。

4行目、「severity」でログレベル(重要度)を指定。

5行目、「print-time」は時刻の出力。「No」とすることで出力しないこともできます。

6行目、「print-severity」は「severity」で指定したレベルを出力。

7行目、「print-category」は後述するカテゴリーを出力。

10行目、カテゴリーで「default」を選択。このカテゴリーで指定した内容のログが、チャンネルの形式で出力されます。

設定が終わったらBINDを再起動します。

# /etc/init.d/named restart

指定したディレクトリにlogファイルが作成されているか確認して下さい。

# cat /var/log/named/default.log

以上の設定が一般的なロギングの例です。

BINDの設定ファイルだけで細かなログの制御ができることが理解できたと思います。次は各設定の詳細について解説します。


channel(チャンネル)について

channel名は自由に決めることができます。
通常はログレベルに合わせて、「default-log」や「config-log」等とすることが多いようです。

デフォルトで以下の様なチャンネルが用意されています。

null

logを破棄するためのチャンネル。

channel "null" {
	null;
};

default_stderr

標準エラーへ出力するためのチャンネル。

channel "default_stderr" {
	stderr;
	severity info;
};

default_debug

デバッグモードのためのチャンネル。

channel "default_debug" {
	file "named.run";
	severity dynamic;
};

fileについて

fileではログの出力先を指定します。
上の例のように特定のファイルへ書き出す方法だけでなく、複数の方法が用意されています。

ファイルへ書き出す方法

上の解説にある通り、特定のディレクトリにlogファイルを出力します。

上記の例のように特定のディレクトリにファイルを書き出す例。

file "/var/log/named/default.log" versions 5 size 10M;

versionsにはログローテーションした際に保存しておくファイルの数を指定します。このオプションがあることでログが無限に作成されてしまう事態を防ぐことができます。

sizeで指定したファイルサイズに達するとログをローテーションします。サイズには「K/k、M/m、G/g」を指定することができます。

syslogへ書き出す方法

ログの管理を行うsyslogへlogを渡す方法です。CentOS6だとlogの収集はrsyslogになっているので注意してください。
そもそもBINDのロギングだけで細かく制御できるのでわざわざsyslogやrsyslogへ書き出す必要もあまりないと思います。(BINDだけでサーバを構成していてログを専用のサーバへセキュアに転送したいといった場合はrsyslog等を利用します。)

rsyslogについては以前の投稿でまとめた」ので必要な方は参照してください。

syslogへファシリティinfoで書き出す例

file syslog (info);

標準エラー出力へ書き出す方法

file stderr;

ログを破棄する方法

file null;

named.runへ書き出す方法

named.runへの書き出しは通常BINDのデバック作業で利用します。
デバッグモードではログレベルを詳細に指定できるため、細かなログの制御が可能です。

named.runは、設定ファイル「named.confのoptionセクション」で指定したワークディレクトリに作成される。デフォルトだと「/var/named」。

ワークディレクトリに「data」というディレクトリを作成してnamed.runに書き出す例。

file "data/named.run";

デバッグメッセージの制御は起動時に指定します。デバッグレベルは0から99まで用意されています。数字が多いほど詳細なログになる。

起動時にデバッグレベルを指定する例

# /usr/local/sbin/named -u named -d デバッグレベル
または
# /usr/sbin/named -u named -d デバッグレベル

このデバッグモードのログは前出のチャンネルdefault_debugに出力される。出力場所を変えたい場合は「file “named.run”;」の部分を変更する。


severityについて

セキュリティはログレベル(重要度)を指定するオプションです。
ログレベルはそれぞれ以下のものを指定することができます。criticalが重大なエラーのみ出力。dynamicは全てのログを出力します。

critical、error、warning、notice、info、debug、dynamic

print-xxxについて

print-timeはタイムスタンプ、
print-severityはセキュリティレベル、
print-categoryはカテゴリ名、をそれぞれyesにするとログに記載されます。デフォルトだと無効になっています。


categoryについて

チャンネルでは出力の形式を指定しましたが、カテゴリーでは出力の内容を指定します。カテゴリに指定できるものは以下の通りです。

カテゴリ 内容
database ゾーン情報やキャッシュ情報など、データベースに関連する記録
security 要求の承認/否認の記録
config 構成ファイルの構文解析と処理の記録
resolver クライアントに代わって実行されるキャッシュサーバの動作に代表される、再帰検索のようなDNS解決の記録
xfer-in サーバが受信したゾーン転送の記録
xfer-out サーバが送信したゾーン転送の記録
notify NOTIFY(通知)プロトコルの記録
client クライアント要請の処理記録
network ネットワーク操作の記録
update DDNSの記録
queries 問い合わせクエリーの記録
dispatch サーバモジュールへ入ってくるパケットを処理するCPU割り当て(ディスパッチ)の記録
dnssec DNSSECやTSIG処理の記録
lame-servers DNS解決の際にほかのサーバで見つけた設定ミス(lame)の記録
general 上記以外の多くのログはカテゴリが未分類であり、それらはgeneralに分類される
default categoryで意図的に指定された以外のカテゴリがここで定義される

http://www.atmarkit.co.jp/ait/articles/0310/15/news001.htmlより


以上でBINDのロギングについて解説しました。
チャンネルとカテゴリを組み合わせて意図したログが出力されるように設定してください。