bind 設定ファイルの置き場所・ファイル名は一般に{$ROOTDIR}/etc/named.conf
。chrootも参照のこと。
設定ファイルにはステートメントとコメントを含む。ステートメントは全て最後にセミコロン(;)を置く。ステートメントにはサブステートメントを含んだ入れ子構造になっているものもある。ステートメントには以下のものがある。
logging
options
zone
acl
コメントは以下の方法で記述できる。
/* ... */
/*
と */
に挟まれた部分がコメントとして扱われる(複数行にまたがってもOK、入れ子構造にすることはできない)// ...
# ...
//
または#
以降行末までがコメントとして扱われる。
logging
ステートメントは、ログに関する設定を行う。設定ファイルに記述できるのは1回だけ。
logging
ステートメントには「チャネル」と「カテゴリ」を記述する。「チャネル」ではログの出力方法を規定する。いくつ定義しても構わない。定義する具体的内容は以下の通り。
一方、「カテゴリ」では実際どの内容を出力するかを定義するが、この際出力方法の指定は「チャネル名」で行う。
【書式】 logging { channel チャネル名 { file パス名 versions 非負整数 | unlimited size サイズ値 | syslog オプション | null; severity 優先度 デバッグレベル; print-category yes | no; print-severity yes | no; print-time yes | no; }; category カテゴリ名 { チャネル名; チャネル名... }; ... };
出力先の指定はファイルへ出力(file)、syslogへ出力(syslog)、破棄する(null)のいずれか。
ファイルに出力(file)
syslogに出力(syslog)
破棄(null)
severity
ステートメントで記述する。
チャネルはユーザが定義できる他、以下の4チャネルがあらかじめ定義されている。
channel default_syslog { syslog daemon; # syslog の daemon ファシリティに送る severity info; # 優先度が info 以上のものを送る };
channel default_debug { file "named.run"; # 作業ディレクトリ内の named.run ファイルに書き込む # 注:-f オプション付きでnamedを起動している場合は標準エラー出力へ書き出される severity dynamic; # サーバの現在のデバッグレベルのログを出力 };
channel default_stderr { file "<標準エラー出力>"; # 左記は定義の説明上の記述で # 実際標準エラー出力を指定する記述法は用意されていない severity info; # 優先度が info 以上のものを送る };
channel null {
null; # このチャネルに送られたメッセージは全て破棄する
};
ログ出力する内容には「カテゴリ」と呼ばれる種類を区別するためのグループ名が設けられている。その各カテゴリごとに、どのような出力を行うのか規定できる。
category default { default_syslog; # info以上をsyslogのdaemonファシリティに送る default_debug; # サーバ設定のデバッグレベル内容をnamed.runに出力 };
何もカテゴリ指定を行わなかった場合、default カテゴリに対して、下記の既定チャネルが設定される。
options
ステートメントは、DNSサーバ全般に関する設定や他のステートメントに対する既定値の設定を行う。設定ファイルに記述できるのは1回だけ。
項目
options { allow-query { 192.168.0.100; }; };
options { allow-query { 192.168.0.100; }; };
options { allow-transfer { 192.168.0.100; }; };
options { notify { yes; }; };
options { recursion { yes; }; };
options { forward { first }; };
options { forwarders { 192.168.0.100; }; };
引数
zone
ステートメントでは、各ドメインの正引き・逆引きに関する設定を記述する。
【書式】マスタの場合 zone ドメイン名 { type master; file ゾーン情報ファイル名; allow-update 対象; allow-query 対象; allow-transfer 対象; notify yes | no; }; 【書式】スレーブの場合 zone ドメイン名 { type slave; file ゾーン情報ファイル名; allow-update 対象; allow-query 対象; allow-transfer 対象; transfer-source IPアドレス; notify yes | no; };
項目
ルートDNSサーバ定義(ルートヒント)に関する情報もzoneステートメントで記述する。
【書式】ルートDNSサーバ定義(ルートヒント)
zone "." {
type hint;
file ルートDNSサーバ定義ファイル名;
};
ルートDNSサーバ定義ファイル(ルートヒントファイル)についてはルートDNSサーバ情報について参照。
named-checkconf
コマンドで、BINDの設定ファイル(named.conf
)の文法に誤りがないかをチェックすることができる[18][20]。
【書式】 named-checkconf オプション 設定ファイル名 -p 【返り値】 エラーあり→1 エラーなし→0 ※エラーがなければ出力なし 【例】 # named-checkconf # echo $? # 直前に実行したコマンドの返り値を出力→引数、既定変数 - UNIX関係参照 0 #
-h
-t
ディレクトリ名-v
-p
named.conf
)の内容を出力する。出力内容にはincludeされたファイルの内容も含む。
-z
-j
/etc/named.conf
置き場所は{$ROOTDIR}/var/named
。ファイル名は全般設定ファイルnamed.conf
の「zone "ゾーン名"」で指定した名前。
なお、ホスト名をつけずドメイン名だけでのリクエストに対して特定のIPアドレスを対応づけるには、相対パスの起点を規定した上で、ゾーンファイル中にホスト名「@」で指定を行う[19](実際には相対パス起点の規定さえ行えば、@ を使わず無名のホストで事足りるよう)。
$ORIGIN ドメイン名.
…相対パスの起点を記す$ORIGIN hoge.org. $TTL 86400 @ IN SOA dns1.hoge.org. www.hoge.org. ( 2011012001 ; serial 1h ; refresh 15m ; retry 1w ; expire 1d ; minimum ) IN NS dns1 @ IN A 192.168.0.1 ; 実は @ はなくてもOKらしい dns1 IN A 192.168.0.1 ; dns server www IN CNAME dns1.pdbj.org ; web server ...
named-checkzone
コマンドで、ゾーンファイルの文法チェックを行うことができる[18][21]。
【書式】 named-checkzone オプション ゾーン名 ゾーンファイル名 【例】 # named-checkzone example.org /var/named/chroot/var/named/example.zone zone example.org/IN: loaded serial 2012082701 OK
最上位DNSサーバ情報(ルートヒント)は以下のURLからダウンロードできる。時々チェックし、ファイルを最新にしておくのがよい。
ftp://ftp.nic.ad.jp/pub/internet/rs.internic.net/domain/named.root
ftp://ftp.rs.internic.net/domain/named.root
定期的にルートヒント情報が更新されていないかをチェックし、必要に応じ更新するためのスクリプト例を以下に記す(私はこれを/etc/cron.monthly/
に置いて月1回チェックさせています)。
【スクリプト例】 #!/bin/sh #==== Variables BASEPATH="/var/named/chroot/var/named/" # ヒントファイルの場所 LOG="/var/log/update_roothint.log" # ログファイルの場所 HINT_CUR=${BASEPATH}"root.cache" # ヒントファイルのフルパス付きファイル名 HINT_NEW=${HINT_CUR}".new" # ダウンロードするヒントファイルの保存名 HINT_SVURL="http://www.internic.net/zones/named.root" # ヒントファイルのURL #==== Output time stamp # 区切りと日時を出力 echo "====== "`date "+%Y-%m-%d %H:%M:%S"` >> $LOG 2>&1 #==== Download the latest root hint file # 最新ヒントファイルをダウンロード wget -O ${HINT_NEW} ${HINT_SVURL} >> $LOG 2>&1 #==== Get the version info of local and latest # 両ファイルのシリアル取得 VAR_CURRENT=`grep 'related version' ${HINT_CUR} | sed -e 's/.\{1,\}zone:[ ]\{1,\}\([0-9]\{1,\}\)/\1/'` VAR_NEW=`grep 'related version' ${HINT_NEW} | sed -e 's/.\{1,\}zone:[ ]\{1,\}\([0-9]\{1,\}\)/\1/'` echo "Current root hint file version : "${VAR_CURRENT} >> $LOG 2>&1 echo "New root hint file version : "${VAR_NEW} >> $LOG 2>&1 #==== When the downloaded is already latest # 既に最新の場合 if [ ${VAR_NEW} -le ${VAR_CURRENT} ] then echo "The root hint file is already latest." >> $LOG 2>&1 rm -f ${HINT_NEW} # ダウンロードしたファイルを消去 #==== When the downloaded is not latest # 最新ではない場合 else mv -f ${HINT_NEW} ${HINT_CUR}.${VAR_NEW} # ダウンロードしたファイルの拡張子をシリアル番号に変更 chown root:named ${HINT_CUR}.${VAR_NEW} # 所有者変更 chmod 640 ${HINT_CUR}.${VAR_NEW} # アクセス権変更 cp -f ${HINT_CUR}.${VAR_NEW} ${HINT_CUR} # 現行ファイルに上書き chown root:named ${HINT_CUR} # 所有者変更 chmod 640 ${HINT_CUR} # アクセス権変更 echo "The root hint file was updated." >> $LOG 2>&1 /etc/init.d/named restart > $LOG 2>&1 # bindサービス再起動 echo "The new root hint was reflected." >> $LOG 2>&1 fi
master:/usr/sbin/dnssec-keygen -a HMAC-MD5 -b 128 zonename -a algorithm HMAC-MD5(大文字小文字を区別しない) DNS仕様上、この値しか選択できないらしい -b keysize HMAC-MD5の場合1〜512(bit) -n nametype HOST(大文字小文字を区別しない) DNS仕様上、この値しか選択できないらしい →
特定のプロセスに対して任意のディレクトリをルートディレクトリに見せかける機能「chroot」を使ったbindの起動方法について[1] [9]。
Red Hat Linuxの場合、/etc/sysconfig/named
ファイルに以下の1行を記述すればそのディレクトリがルートディレクトリとなってbindを起動できる。
【書式】 ROOTDIR="ディレクトリ名" 【例】 ROOTDIR="/var/named/chroot" 上例の場合、設定ファイルは /var/named/chroot/etc/named.conf となる
rndc はネームサーバを制御するユーティリティ[12]。
rndc オプション コマンド
rndc はネームサーバを制御するユーティリティで、何もオプションやコマンドを指定せず実行すると、利用可能なオプションやコマンドについての簡潔な概要が表示されます。
rndc はTCPコネクションを通じてネームサーバと通信して、デジタル署名で認証されたコマンドを送信します。現在の rndc および named がサポートしている認証方式は HMAC-MD5 のみで、接続両端で秘密を共有するのに使われます。これによってTSIG形式の認証がコマンド要求およびネームサーバの応答において利用できるようになります。チャネルを通じて送られるコマンドは全て、サーバが知っているキーidによって署名されていなければなりません。
rndc は設定ファイルを読んで、どのようにネームサーバに接続し、どのアルゴリズムやキーを使うべきかを決定します。
コマンド
rndc-confgen
コマンドはrndcの設定ファイルを生成する。rndc.conf
ファイルを作り、これに関連するcontrol、keyの指定をnamed.conf
に書き込む作業に代わる便利なツールとして用いることができる。-a
オプションを使ってこのコマンドを実行し、rndc.key
を生成すれば、rndc.conf
を使わず、全てnamed.conf
のcontrol節に含めて記述することができる[16][17]。
rndc-confgen オプション
[-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port]
[-r randomfile] [-s address] [-t chrootdir] [-u user]
-a
自動的にrndcの設定を行う。rndc.key
というファイルを/etc
配下(あるいはbindをビルドした際、sysconfdirとして指定した場所)に生成する。この情報がrndc、named起動時に読み込まれる。rndc.key
には既定のコマンドチャネルと認証キーが定義され、rndcこの情報を使ってローカルのnamedとやりとりを行う。rndc.conf
による追加の設定は必要ない。
rndc-confgen -a
を実行することで、既存のBIND 8用named.conf
を変更することなく暫定的に、BIND 8とndcをBIND 9とrndcに置き換えることができる。
もし、rndcをリモートから利用するなど、rndc-confgen -a
が生成した設定よりも更に詳細な設定が必要であるなら、-a
オプションなしでrndc-confgen
を実行し、直接rndc.conf
とnamed.conf
を編集するのがいいでしょう。
-b キーサイズ
-k キー名
rndc-key
。
例: # rndc-confgen -b 512 # Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "iCBoFdgRKn/PjBwk/ZcwlmhmB9vGwicNI10UB3YrqlfQhpDiATv60DaRH/LXqOZAg5bJw4mxgK6vQAnzvXAdCg=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "rndc-key" { # algorithm hmac-md5; # secret "iCBoFdgRKn/PjBwk/ZcwlmhmB9vGwicNI10UB3YrqlfQhpDiATv60DaRH/LXqOZAg5bJw4mxgK6vQAnzvXAdCg=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.conf
【書式】 dig @ネームサーバ オプション 問い合わせ内容
-x
を付けるか、あるいはIPアドレスの直後に.in.addr.arpa
を付ければIPアドレスとみなしそれに対する完全修飾ドメイン名を問い合わせる。
【例】 dig www.hoge.com dig -x 192.168.100.100 dig 192.168.100.100.in‐addr.arpa
オプション
-x
DNSキャッシュポイズニングとは、DNSキャッシュサーバに正しくないDNSキャッシュ情報を送りつける攻撃。DNSキャッシュサーバがこのような情報を受け入れてしまうと、このサーバを参照するDNSクライアントは正しいドメイン名・ホスト名でアクセスしていても本来とは異なるIPアドレスを持つサイトに誘導されてしまう。
対策の一つとして、ソースポートランダマイゼーションがある。ソースポートをランダム化する(=固定しない)と攻撃先のポートを特定しづらくなり危険性が低下するメリットがある。具体的にはnamedの設定内容(named.conf
など)を確認し、以下の記述があれば削除しnamedを再起動して設定を反映させる[26][27]。
※BIND 9 を使用している場合
query-source port 53;
query-source-v6 port 53;
DNS-OARCでは、参照しているDNSサーバがこの対策を行っているかどうかを確認するウェブサービス「Web-based DNS Randomness Test」を提供している。また、コマンドラインからテストを行うにはdig +short porttest.dns-oarc.net TXT
を実行する[28]。以下の例のように「GREAT」という判定が出ればOKとのこと。
[user@server ~]$ dig +short porttest.dns-oarc.net TXT porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net. "xxx.xxx.xxx.xxx is GREAT: 26 queries in 3.6 seconds from 26 ports with std dev 10603"
また、自身がホスト情報を管理する「コンテンツDNSサーバ」(権威サーバ)と他のコンテンツDNSサーバの情報をキャッシュする「キャッシュDNSサーバ」を分離しておけば、コンテンツDNS機能だけを持つDNSサーバについては、不正なキャッシュが入り込むことが防げる。
権威DNSサーバでは必要のないIPアドレスからのゾーン情報転送要求に応じないよう設定し、意図しない情報流出を防ぐようにしておくことが望ましい[32]。 具体的には、bindの設定ファイル(named.conf)で、allow-transferにはスレーブサーバのみ設定する。ゾーン情報転送が適切に拒否されているかを確認する方法は以下の通り[33]。
$ dig +norec @DNSサーバ 問い合わせホスト名 axfr 下記応答が返れば拒否されている <span class="output">; <<>> DiG 9.6-ESV-R4-P3 <<>> +norec @ns1.hoge.org www.hoge.org axfr ; (1 server found) ;; global options: +cmd ; Transfer failed.
Win2000以降では ipconfig /displaydns
で自マシンにキャッシュ(一時保存されている)情報が参照できる。
/var/log/named.log
、chrootしている場合は,/var/named/chroot/var/log/named.log
)には「xfer-in: error: transfer of 'ゾーン名/IN' from IPアドレス#53: failed while receiving responses: permission denied」のメッセージ。
# ls -ld /var/named/chroot/var/named/slaves drwxr-xr-x 2 root named 4096 8月 28 11:26 /var/named/chroot/var/named/slaves # chmod 770 /var/named/chroot/var/named/slaves # ls -ld /var/named/chroot/var/named/slaves drwxrwx--- 2 root named 4096 8月 28 11:26 /var/named/chroot/var/named/slaves
namedの状態を確認すると以下のようなメッセージが出る場合。
# /etc/init.d/named status rndc: connection to remote host closed This may indicate that * the remote server is using an older version of the command protocol, * this host is not authorized to connect, * the clocks are not synchronized, or * the key is invalid. named (pid 1878) を実行中...
キーを作り直してみたら[23]問題は解消した。以下は/var/named/chroot
にchrootしてnamedを稼働させている場合の例。
1. キーサンプルをrndc.confファイル、named.confファイルのサンプルを取得 # rndc-confgen -b 512 -k rndc.key >/var/named/chroot/etc/rndc.conf 2. 前項で作成したrndc.conf後半の「Use with the following in named.conf...」 をコメントアウト解除してnamed.confに追記。追記内容例は以下の通り。 # vi /var/named/chroot/etc/named.conf key "rndc.key" { algorithm hmac-md5; secret "uJwXUTjdJfq8612ojC4R5rzqK4P+7OI+OljS127HoUDinYw2DXuHpLy1HGj5tQgRiMWCf4Lr0wij6XTwgSpjNQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc.key"; }; }; 3. rndc.keyファイルの作成 # rndc-confgen -a -b 512 -k rndc.key -t /var/named/chroot wrote key file "/etc/rndc.key" wrote key file "/var/named/chroot/etc/rndc.key" # ls -l /var/named/chroot/etc/rndc.* -rw-r--r-- 1 root root 608 8月 28 14:17 /var/named/chroot/etc/rndc.conf -rw-r----- 1 root named 140 8月 28 14:13 /var/named/chroot/etc/rndc.key 4. named再起動 # /etc/init.d/named restart Stopping named: [ OK ] Starting named: [ OK ]
なお、rndcが使用するkey(/etc/rndc.confまたは/etc/rndc.keyの中の「secret」の値)とnamed.confの使用するkey(named.conf内か読み込んでいる外部ファイルの「secret」の値、例:chrootを適用していて「include "/etc/rndc.key"
」と指定すれば、/var/named/chroot/etc/rndc.key
を参照)の共通鍵を同じにする必要がある。
[root@server ~]# cat /var/named/chroot/etc/named.conf ... include "/etc/rndc.key" ←実際には/var/named/chroot/etc/rndc.key を指す [root@server ~]# cat /etc/rndc.key key "rndckey" { algorithm hmac-md5; secret "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX0123456789"; }; [root@server ~]# cat /var/named/chroot/etc/rndc.key key "rndckey" { algorithm hmac-md5; secret "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX"; }; [root@server ~]# /etc/init.d/named status rndc: connection to remote host closed This may indicate that * the remote server is using an older version of the command protocol, * this host is not authorized to connect, * the clocks are not synchronized, or * the key is invalid. named (pid 26723) を実行中... [root@server ~]# cp /var/named/chroot/etc/rndc.key etc/rndc.key またはシンボリックリンクで同じファイルを参照させる [root@server ~]# mv /etc/rndc.key /etc/rndc.key.bak;ln -s /var/named/chroot/etc/rndc.key /etc/rndc.key [root@server ~]# /etc/init.d/named status version: 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 () CPUs found: 12 worker threads: 12 number of zones: 21 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running named (pid 26723) を実行中...
namedの状態を確認すると以下のようなメッセージが出る場合。
# /etc/init.d/named status WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) version: 9.7.0-P2-RedHat-9.7.0-10.P2.el5_8.2 () CPUs found: 8 worker threads: 8 number of zones: 21 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running named (pid 12345) を実行中...
/etc/rndc.conf
と/etc/rndc.key
の両方が存在するとこのメッセージが出るらしい(chrootしてnamedを実行していたとしても)[25]。以下は/var/named/chroot
にchrootしている場合で、上記2ファイルの一方(/etc/rndc.conf
)を削除する場合。
# ls /etc/rndc.* -rw-r--r-- 1 root root 0 8月 28 14:32 /etc/rndc.conf -rw-r----- 1 root named 140 8月 28 14:13 /etc/rndc.key # rm /etc/rndc.conf # ls /etc/rndc.* -rw-r----- 1 root named 140 8月 28 14:13 /etc/rndc.key # ls /var/named/chroot/etc/rndc.* -rw-r--r-- 1 root root 0 8月 28 14:32 /var/named/chroot/etc/rndc.conf -rw-r----- 1 root named 140 8月 28 14:13 /var/named/chroot/etc/rndc.key Stopping named: [ OK ] Starting named: [ OK ]
これにより、「WARNING: key file (/etc/rndc.key) exists,...」の1行は出なくなった。