メモ〜DNSサーバ関係

bindの設定

全般事項

bind 設定ファイルの置き場所・ファイル名は一般に{$ROOTDIR}/etc/named.confchrootも参照のこと。

設定ファイルにはステートメントとコメントを含む。ステートメントは全て最後にセミコロン(;)を置く。ステートメントにはサブステートメントを含んだ入れ子構造になっているものもある。ステートメントには以下のものがある。

logging
ログ記録内容やログの場所などの設定を行う。
options
DNSサーバの全般的な設定や他のステートメントに対する既定値の設定を行う。
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)

パス名
出力先ログファイル名のフルパス
versions 非負整数 | unlimited
過去ログの保存世代数の設定。負でない整数またはunlimitedを指定。後者の場合は99を指定したのと同じ意味になる。過去ログファイルの拡張子はドット+0からの連番整数。ローテーションの度に1つずつ拡張子の数値が大きいファイル名のものに上書きされていく。
size サイズ値
ログファイルサイズの上限を規定する。ログファイルのサイズがこの値を超えると、ログローテーションを行わない限りそれ以上書き込みが行われなくなる。既定値はサイズ上限なし。

syslogに出力(syslog)

破棄(null)

チャネル - 出力対象とする優先度レベルの指定

severityステートメントで記述する。

優先度
以下のいずれかの値で出力対象とする優先度の下限を指定する。dynamic を指定した場合はサーバ全体のデバッグレベル指定を適用する。
  • critical
  • error
  • warning
  • notice
  • info
  • debug
  • dynamic
非負整数
デバッグレベルを指定する。0 を指定すればデバッグモードは無効になる。1以上の整数を指定した場合、デバッグモードは有効となり、値が大きいほど詳細な情報が出力される。

チャネル - 出力項目の指定

print-category yes | no
カテゴリ名を出力するかどうかを指示する。yes なら出力し、no なら出力しない。
print-severity yes | no
優先度を出力するかどうかを指示する。yes なら出力し、no なら出力しない。
print-time yes | no
時刻を出力するかどうかを指示する。yes なら出力し、no なら出力しない。

チャネル - 既定のチャネル

チャネルはユーザが定義できる他、以下の4チャネルがあらかじめ定義されている。

default_syslog(syslog送信)
channel default_syslog {
  syslog daemon;  # syslog の daemon ファシリティに送る
  severity info;  # 優先度が info 以上のものを送る
};
	  
default_debug(デバッグ書き出し)
channel default_debug {
  file "named.run";  # 作業ディレクトリ内の named.run ファイルに書き込む
                     # 注:-f オプション付きでnamedを起動している場合は標準エラー出力へ書き出される
  severity dynamic;  # サーバの現在のデバッグレベルのログを出力
};
	  
default_stderr(標準エラー出力)
channel default_stderr {
  file "<標準エラー出力>";  # 左記は定義の説明上の記述で
                            # 実際標準エラー出力を指定する記述法は用意されていない
  severity info;            # 優先度が info 以上のものを送る
};
	  
null(破棄)
channel null {
  null; # このチャネルに送られたメッセージは全て破棄する
};
	  

カテゴリ

ログ出力する内容には「カテゴリ」と呼ばれる種類を区別するためのグループ名が設けられている。その各カテゴリごとに、どのような出力を行うのか規定できる。

default
他のカテゴリに入らないその他全ての内容。既定のチャネル設定は以下の通り。
category default {
  default_syslog; # info以上をsyslogのdaemonファシリティに送る
  default_debug; # サーバ設定のデバッグレベル内容をnamed.runに出力
};
config
parser
queries
lame-servers
statistics
panic
update
ncache
xfer-in
xfer-out
db
eventlib
packet
nofity
cname
security
os
insist
maintenance
load
response-checks

何もカテゴリ指定を行わなかった場合、default カテゴリに対して、下記の既定チャネルが設定される。

全般的な指定(options)

optionsステートメントは、DNSサーバ全般に関する設定や他のステートメントに対する既定値の設定を行う。設定ファイルに記述できるのは1回だけ。

項目

allow-query アドレスマッチリスト
指定したアドレスマッチリストにマッチするDNSクライアントからの問い合わせに対しては回答するようにする。zone設定内でも指定でき、このoptions設定内での設定はzone設定内での設定によって上書きされる。allow-queryオプションが指定されていない場合は、全てのホストからの問い合わせに対して応答を返す(つまり指定がない場合の既定値は any)。
options {
  allow-query { 192.168.0.100; };
};
allow-recursion アドレスマッチリスト
指定したアドレスマッチリストにマッチするDNSクライアントからの問い合わせからのみ再帰問い合わせを受け付ける。zone設定内でも指定でき、このoptions設定内での設定はzone設定内での設定によって上書きされる。allow-recursionオプションが指定されていない場合は、全てのホストからの問い合わせに対して応答を返す(つまり指定がない場合の既定値は any)。
options {
  allow-query { 192.168.0.100; };
};
allow-transfer アドレスマッチリスト
指定したアドレスマッチリストにマッチするノードに対してのみゾーン情報を転送する。マスター(プライマリ)DNSサーバにおいて、スレーブ(セカンダリ)DNSサーバなどを指定する。
options {
  allow-transfer { 192.168.0.100; };
};
nofify yes | no
yesに設定した場合、信頼できるゾーンサーバに対してゾーン情報更新通知を行う。通知を受け取ったサーバはそのゾーンのマスタサーバに接続して更新の必要があるかどうかを確認し、必要であれば直ちにゾーン転送を開始する。既定値は「yes」。zoneステートメント内でも指定可能。optionsでの指定はzoneでの設定により上書きされる。
options {
  notify { yes; };
};
recursion yes | no
yesに設定されていて、DNS問い合わせが再帰処理を要求している(=もしDNSサーバ自身が管理するゾーンではない内容についての問い合わせであった場合、DNSサーバが問い合わせを受けている情報を調べて回答する)場合、再帰処理を試みる。noに設定されている場合、サーバ自身が答えを知らない場合はその旨返答する。既定値は「yes」。
options {
  recursion { yes; };
};
forward only | first
このオプション指定は、forwarders に空ではない指定が行われている場合にのみ意味を持つ。引数に「first」を指定すると、問い合わせ内容が自分の知らない(=自身が管理するドメインに関する問い合わせでもなく、キャッシュにも情報がない)場合、まずforwardersに指定されたサーバに問い合わせを行い、そのサーバが要求に応答しなかった場合は自身で答えを探そうとする。「only」を指定するとforwardersに指定したサーバに問い合わせを行うだけで、応答がなければそれ以上何もしない。この指定がない場合の既定値は「first」。
options {
  forward { first };
};
forwarders アドレスマッチリスト
問い合わせを転送する先となるサーバのリスト。既定値は空(転送しない)。
options {
  forwarders { 192.168.0.100; };
};

引数

アドレスマッチリスト
IPアドレス(0から255までの整数を1個〜4個、ドットで区切った値、単一のIPアドレスまたはIPアドレスの前方一部、例:123、45.67、89.123.45.67)、ネットワーク(IPアドレス/ネットマスクbit数、例:127/8(=127.0.0.0/255.0.0.0)、1.2.3.0/28(=1.2.3.0/255.255.255.240))、keyステートメントで定義された鍵のID、aclステートメントで定義したアドレスマッチリスト名、の要素が1つ以上集まったリスト。感嘆符(!)を前に付けると指定した要素「以外」が対象になる。またあらかじめ「any」「none」「localhost」「localnets」のアドレスグループ名が定義されている。

ゾーンの設定

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;
};

項目

allow-transfer IPアドレスリスト
全般的な指定(options)と同じ

ルート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 ディレクトリ名
Chroot to directory so that include directives in the configuration file are processed as if run by a similarly chrooted named.
-v
バージョン情報を出力して終了する。
-p
エラーがなかった場合、設定ファイル(named.conf)の内容を出力する。出力内容にはincludeされたファイルの内容も含む。
-z
Perform a test load of all master zones found in named.conf.
-j
ゾーンファイルを読み込む際、ジャーナルファイルがあればそれを読む。
設定ファイル名
チェックする設定ファイル名を指定する。指定がない場合の既定値は/etc/named.conf

ゾーン定義ファイルについて

置き場所は{$ROOTDIR}/var/named。ファイル名は全般設定ファイルnamed.confの「zone "ゾーン名"」で指定した名前。

なお、ホスト名をつけずドメイン名だけでのリクエストに対して特定のIPアドレスを対応づけるには、相対パスの起点を規定した上で、ゾーンファイル中にホスト名「@」で指定を行う[19](実際には相対パス起点の規定さえ行えば、@ を使わず無名のホストで事足りるよう)。

$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サーバ情報について

最上位DNSサーバ情報(ルートヒント)は以下のURLからダウンロードできる。時々チェックし、ファイルを最新にしておくのがよい。

定期的にルートヒント情報が更新されていないかをチェックし、必要に応じ更新するためのスクリプト例を以下に記す(私はこれを/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
  

DNS通信の安全確保

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

特定のプロセスに対して任意のディレクトリをルートディレクトリに見せかける機能「chroot」を使ったbindの起動方法について[1] [9]

Red Hat Linuxの場合、/etc/sysconfig/named ファイルに以下の1行を記述すればそのディレクトリがルートディレクトリとなってbindを起動できる。

【書式】
ROOTDIR="ディレクトリ名"
【例】
ROOTDIR="/var/named/chroot"
上例の場合、設定ファイルは /var/named/chroot/etc/named.conf となる
  

DNSサーバの制御(rndc)

rndc はネームサーバを制御するユーティリティ[12]

rndc

rndc オプション コマンド

rndc はネームサーバを制御するユーティリティで、何もオプションやコマンドを指定せず実行すると、利用可能なオプションやコマンドについての簡潔な概要が表示されます。

rndc はTCPコネクションを通じてネームサーバと通信して、デジタル署名で認証されたコマンドを送信します。現在の rndc および named がサポートしている認証方式は HMAC-MD5 のみで、接続両端で秘密を共有するのに使われます。これによってTSIG形式の認証がコマンド要求およびネームサーバの応答において利用できるようになります。チャネルを通じて送られるコマンドは全て、サーバが知っているキーidによって署名されていなければなりません。

rndc は設定ファイルを読んで、どのようにネームサーバに接続し、どのアルゴリズムやキーを使うべきかを決定します。

コマンド

querylog
クエリのログ出力ON/OFFを切り替える
trace
デバッグレベルを1つ上げる
trace デバッグレベル
デバッグレベルを指定値に設定する。値は0以上99以下の整数(数値が大きいほど詳細)。
notrace
デバッグ停止。trace 0 と同じ。

rndcのキーを生成する(rndc-confgen)

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.confnamed.confを編集するのがいいでしょう。

-b キーサイズ
認証キーのサイズをビット単位で指定する。指定可能な値は1から512の整数。指定がない場合の既定値は128。
-k キー名
rndc認証キーのキー名を指定する。指定する値は有効なドメイン名である必要がある。指定がない場合の既定値は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

【書式】
dig @ネームサーバ オプション 問い合わせ内容
    
@ネームサーバ
問い合わせ先のネームサーバをドメイン名またはIPアドレスで指定する。この指定を省略すると問い合わせを行おうとしているマシンに設定された既定のネームサーバに対して問い合わせが行われる。
問い合わせ内容
記述内容をネームサーバに問い合わせる。特にオプションがなければ、完全修飾ドメイン名とみなしそれに対するIPアドレスを問い合わせる。-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
問い合わせ内容を完全修飾ドメイン名ではなく、IPアドレスとみなし逆引きの問い合わせを行う。

nslookup

セキュリティ関係

DNSキャッシュポイズニング

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.

DNSキャッシュの参照

Win2000以降では ipconfig /displaydns で自マシンにキャッシュ(一時保存されている)情報が参照できる。

トラブルシューティング

ゾーン情報がスレーブに転送されない

現象
マスタDNSサーバでゾーン情報を更新し、serial値も増やしているにも関わらずスレーブDNSサーバにゾーン情報が転送されない。ログ(/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」のメッセージ。
原因
スレーブDNSサーバ上のゾーンファイルがあるディレクトリあるいはゾーンファイル自体のアクセス権が、named実行ユーザが書き込めるようになっていない[22]
対処
ゾーンファイルがあるディレクトリあるいはゾーンファイル自体のアクセス権を変更し、named実行ユーザが書き込めるようにする[22]
# 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行は出なくなった。