rndcの仕組みと設定
rndcは、ローカル上、またはリモート上にあるBIND9を制御するツール
主に、設定の再読み込み、namedサービスの停止(起動はできない)、統計情報の表示、キャッシュのクリアなどのために使用する
■ rndcの仕組み
rndcコマンドを実行する端末は、同じ端末(サーバ)上のnamedサービス、または外部のサーバ上のnamedサービスの制御をすることができる
■ iptablesの設定
CentOSでは、デフォルトでiptablesによって外部からの着信パケットが禁止されている
リモートからrndcを受け付ける場合のみ、iptablesに追加設定する必要がある
namedデーモンがrndcを受け付けるポート番号は、デフォルトでTCP953となっている
[ 設定例 ]
# iptables -I INPUT 10 -s 192.168.24.60 -p tcp --dport 953 -j ACCEPT 192.168.24.60からのrndcのみ許可するように設定
# service iptables save 保存
■ rndcの設定
rndcを利用するためには、rndcコマンドを実行する側とBINDサービスが実行されている側の双方でrndcに関する設定が必要になる
rndcでは両者間で利用する共通鍵が必要となるので、まずは共通鍵を作成する
@ 共通鍵の作成
新しく共通鍵を作成したい場合は、共通鍵を作成するBIND付属のrndc-confgenコマンドを使用する
(他にもdnssec-keygenがあるが、ここでは割愛)
デフォルトでは/etc/rndc.keyとして出力するので、既存の/etc/rndc.keyがある場合は上書きしてしまうので注意する
作成した共通鍵は、AやBで使用する
[ 書式 ]
rndc-confgen オプション
[ 主なオプション ]
-a 共通鍵を新しく作成する デフォルトでは/etc/rndc.keyに出力
-b ビット数 共通鍵の鍵の長さ(ビット数単位) 省略時のデフォルトは128bit   512bit推奨
-c 出力ファイル名 省略時は/etc/rndc.keyで作成されるが、別のファイル名としたい場合に使用する
-k 共通鍵名 共通鍵名の指定
-t chrootディレクトリ chrootディレクトリ配下にもファイルを出力したい場合
-u ユーザ名 chrootディレクトリ配下に出力したファイルの所有者を指定したい場合
[ 設定例 ]
# rndc-confgen -a -b 512 -k rndctest -cオプション省略時は/etc/rndc.keyに出力
(既存の/etc/rndc.keyがあれば上書きされる)
鍵の長さは推奨の512bitを指定
# more /etc/rndc.key 確認
key "rndctest" {
algorithm hmac-md5;
secret "Ey/2YxEvsIiJ5WwQWzdlDAZ5L1ICSShC6e1QNdQ1
h5jgThMij608OVd38ge7Br/NFE0WnkK1oUB/Ykm63fg16A==";
};
# ls -l /etc/rndc.key アクセス権はrootのみ読み込み可になっている
-r-------- 1 root root 141 4月 23 03:58 /etc/rndc.key
[ 参考 ]
# rndc-confgen -a -b 512 -c /etc/rndc.key.test -k keytestdesu \ オプションの検証のため、適当に設定してみた
-t /var/named/chroot -u named
# ls -l /etc/rndc* -cオプションを使うと既存の/etc/rndc.keyを上書きすることはない
-r-------- 1 root root 113 4月 13 11:03 /etc/rndc.key (なぜか)アクセス権は読み書き可になっている
-rw------- 1 root root 144 4月 23 03:45 /etc/rndc.key.test
# ls -l /var/named/chroot/etc/rndc.key.test chroot配下にも同じものが作成される
-rw------- 1 named root 144 4月 23 03:45 /var/named/chroot/etc/rndc.key.test -uオプションはchroot配下のファイルに影響している
A rndcコマンドを実行する側の設定
rndcコマンドは、rndcコマンドを実行する端末上の/etc/rndc.confまたは/etc/rndc.keyをデフォルトで参照している
最初に/etc/rndc.confを参照し、「ファイルがない場合は」/etc/rndc.keyを参照する
よって、/etc/rndc.confの設定の誤りやアクセス失敗の場合は、/etc/rndc.keyが存在していてもrndcに失敗する
/etc/rndc.confにするのか、/etc/rndc.keyにするのかは自由だが、リモート上にあるBINDを制御する場合は、/etc/rndc.confでなければならない
( serverステートメントで外部のnamedサーバを指定するため)
ローカル上のnamedサービスを制御する場合は、どちらのファイルでも良い
通常、rndcコマンドの使用はroot権限を持ったユーザのみに制限するので、ファイルのアクセス権をrootのみ読み込みができるように変更をする
rndc実行時のオプションを使うことにより、/etc/rndc.confまたは/etc/rndc.key以外のファイルを使用することもできる
rndcが読み込むファイルの順序
各ファイルで使用するステートメント
/etc/rndc.conf
optionsステートメント デフォルトで使用する共有鍵名と相手のホスト名を指定する
serverステートメント デフォルトで指定した相手以外に対してもrndcを実行したい場合は、
serverステートメントを使用して、その相手のホスト名と使用する共有鍵名を指定する
serverステートメントを省略した場合は、optionsで指定したデフォルトを対象とする
keyステートメント 共有鍵の設定
/etc/rndc.key
keyステートメント 共有鍵の設定
各ファイルでの書式
[ /etc/rndc.confの書式 ]
options { optionsステートメントは必須
default-server デフォルトの相手となるホスト名;
default-key "デフォルトで使用する共通鍵名";
};
server rndcの対象となるホスト名 { serverステートメントは任意、複数設定可能
key "使用する共通鍵名"; optionsステートメントで指定したデフォルト以外のサーバもrndcで
}; 制御したい場合に記述する
key "共通鍵名" { keyステートメントは必須 複数設定可能
algorithm hmac-md5; options, serverステートメントで指定した共通鍵の設定
secret "ベース64でエンコードされた共通鍵";
};
[ /etc/rndc.keyの書式 ]
key "共通鍵名" { keyステートメントは必須
algorithm hmac-md5;
secret "ベース64でエンコードされた共通鍵";
};
[ /etc/rndc.confの場合の設定例 ]
# vi /etc/rndc.conf rndc.confはないので、新規に作成する
options { optionsステートメントは必須
default-server localhost; ここではローカル上のnamedをデフォルトとして設定
default-key "rndckey";
};
server 192.168.24.54 { serverステートメントは任意
key "rndckey2"; ここでは、リモート(192.168.24.54)上のnamedを制御するために設定
}; 192.168.24.54に対しては、共通鍵名rndckeys2を使用
key "rndckey" { keyステートメントは必須
algorithm hmac-md5;
secret "NWteQWyWZBsI6T9W3srJ7bTPg5
ju3To8rfZj0sd0y3sD9cA7LNxB4sU9KxE7";
};
key "rndckey2" {
algorithm hmac-md5;
secret "fltQArFkIHfkvJpABTKoapMDAtgah+v9ItTXAMjGUJLkGieJwvto
Hn9kIBo2L9c4k7u88LWyTjisLUUotB2Ieg==";
};
# chmod 400 /etc/rndc.conf rndcコマンドを実行するユーザ(通常はrootユーザ)しか読み込みが
できないようにアクセス変更する
# ls -l /etc/rndc.conf
-r-------- 1 root root 217 4月 7 10:49 /etc/rndc.conf
[ /etc/rndc.keyの場合の設定例 ]
# vi /etc/rndc.key /etc/rndc.keyはデフォルトで存在していることがある
key "rndckey" { keyステートメントは必須
algorithm hmac-md5;
secret "NWteQWyWZBsI6T9W3srJ7bTPg5
ju3To8rfZj0sd0y3sD9cA7LNxB4sU9KxE7";
};
# ls -l /etc/rndc.key
-r-------- 1 root root 217 4月 7 10:49 /etc/rndc.key rndcコマンドを実行するユーザ(通常はrootユーザ)しか読み込みが
できないようにアクセス変更する
B namedサービス側の設定
named.confファイルで、rndcによる制御を許可する端末と使用する共通鍵の設定を行う
namedサービス側が使用する共通鍵をincludeを使って外部のファイルから読み込む場合、namedサービスを実行するユーザだけが読み込むことができるように変更する
読み込む外部ファイル名は、何でも良い( つまりは/etc/rndc.keyでなくても良い)
[ named.confで使用するステートメント ]
keyステートメント rndcを使う相手との間で使用する共通鍵の設定
controlsで指定した相手にあわせて複数設定可能
named.confにkeyステートメントを使ってキーを直接記載せずに、includeステートメントを使って外部ファイルに記載した
keyステートメントを読み込む方法もある
includeステートメント 外部ファイルに書き込んだkeyを読み込む場合に使用する
controlsステートメント rndcによる制御を許可する相手と使用する共通鍵を設定
rndcを実行する相手ごとに異なる共通鍵を使用する場合は、複数設定する
[ 書式 ]
key "共通鍵名" {
algorithm hmac-md5;
secret "ベース64でエンコードされた共通鍵";
};
include "外部ファイル名"; # keyステートメントが記述された外部のファイルを読み込む場合に使用する
controls {
inet nrdcを受け付けるインターフェースアドレス allow { 許可する相手; } keys { "使用する共通鍵名"; };
};
[ 外部ファイルを読み込む場合の設定例 ]
# vi named.conf
include "/etc/rndc.key"; includeを使って、読み込むファイルを指定
chrootを使っている場合は、chrootディレクトリから見た位置
controls { この場合はローカル(127.0.0.1)からのみrndcコマンドを受け付ける
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndckey"; }; そのときに使用する共通鍵名は、rndckey
};
# more /var/named/chroot/etc/rndc.key includeで読み込んでいるファイル
key "rndckey" { 共通鍵名は、controlsステートメントの共通鍵名と同じであること
algorithm hmac-md5;
secret "NWteQWyWZBsI6T9W3srJ7bTPg5
ju3To8rfZj0sd0y3sD9cA7LNxB4sU9KxE7";
};
# ls -l /var/named/chroot/etc/rndc.key namedサービスはnamedユーザで起動させているので、ここでは
-r-------- 1 named named 113 3月 23 15:22 /var/named/chroot/etc/rndc.key アクセス権と所有権をnamedユーザのみに変更
■ rndcの設定例
@ ローカル上のnamedサービスの制御
ここではローカルからのrndcのみ許可する設定を説明すると同時に、rndcコマンドが読み込むファイルとnamedサービスが読み込むファイルが異なることを検証する
[ 設定例 ]
rndcが使用するファイルの作成
# rndc-confgen -a -b 512 -k rndc-key /etc/rndc.keyを作成
(既存の/etc/rndc.keyは上書きされる)
rndcコマンドが使用する共通鍵名はrndc-keyとした
# more /etc/rndc.key 内容の確認
key "rndc-key" {
algorithm hmac-md5;
secret "i/3WhPJtSLbveh0hZyv66QODZTqAqAHA15xMUqE9GRvl3RB9
hNpmw9l6fW/f8k34u24se7DW0jJyC+G6/LA7AA==";
};
# ls -l /etc/rndc.key アクセス権の確認  rootしか読み込めないようにする
-r-------- 1 root root 77 4月 1 14:01 /etc/rndc.key (一般ユーザがrndcを使えないようにする)
named.confの設定
# vi /var/named/chroot/etc/named.conf 今回は共通鍵を外部ファイルから読み込む方法で設定
chroot環境下なので、実際は
include "/etc/rndc.key.chroot"; /var/named/chroot/etc/rndc.key.chroot
namedが読み込むファイル名は何でも良い
controls { アクセスできるのはローカルシステムからのみ
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndckeys"; }; 使用する共通鍵名は、rndckeysにした
}; (/etc/rndc.keyと明確に区別するため)
named.confが読み込むファイルの作成
# cp /etc/rndc.key /var/named/chroot/etc/rndc.key.chroot (最初から作るのは面倒なので)/etc/rndc.keyをコピーして
# vi /var/named/chroot/etc/rndc.key.chroot 共通鍵名はnamed.confで指定したrndckeysに変更
key "rndckeys" {
algorithm hmac-md5;
secret "i/3WhPJtSLbveh0hZyv66QODZTqAqAHA15xMUqE9GRvl3RB9
hNpmw9l6fW/f8k34u24se7DW0jJyC+G6/LA7AA==";
};
# chown named:named /var/named/chroot/etc/rndc.key.chroot 所有権とアクセス権の変更
# chmod 400 /var/named/chroot/etc/rndc.key.chroot namedしか読み込めないようにする
# ls -l /var/named/chroot/etc/rndc.key.chroot 確認
-r-------- 1 named named 77 4月 1 15:05 /var/named/chroot/etc/rndc.key.chroot
rndcの確認
# service named start namedの起動
named を起動中: [ OK ]
# rndc status rndcが実行できることを確認
version: 9.7.3 (Not available.)
CPUs found: 1
worker threads: 1
number of zones: 21
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is ON
recursive clients: 0/2900/3000
tcp clients: 0/100
server is up and running
# rndc reload 設定の再読み込みもできた
server reload successful
# service named stop 停止も正常にできた
named を停止中: [ OK ] (rndcがおかしい場合は正常に終了できない)
A リモート上のnamedサービスの制御
192.168.24.54のホスト上で動作するnamedサービスに対して、192.168.24.60からrndcコマンドの実行ができるようにする
[ 設定例 ]
namedサービス(192.168.24.54)側の設定
共通鍵の作成
# rndc-confgen -a -b 512 -c /tmp/rndckey -k rndc-test 既存の/etc/rndc.keyはそのまま使用するので、
wrote key file "/tmp/rndckey 上書きしないように別ファイルに出力
# more /tmp/rndckey 内容の確認
key "rndc-test" { (/tmp/rndckeyファイルは後で削除する)
algorithm hmac-md5;
secret "fltQArFkIHfkvJpABTKoapMDAtgah+v9ItTXAMjGUJLkGieJwvt
oHn9kIBo2L9c4k7u88LWyTjisLUUotB2Ieg==";
};
named.confの設定
# vi /var/named/chroot/etc/named.conf
acl localnet { ACLの作成(任意)
192.168.24.60; ここでは192.168.24.60のみに指定
};
include "/etc/rndc.key.chroot"; 上記の検証で作成した
ローカルからのrndc用の設定ファイル
controls {
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndckeys"; };
};
key "rndc-test" { 今回は共通鍵を外部ファイルから読み込まずに、
algorithm hmac-md5; keyステートメントで指定した方法で設定することとし、
secret "fltQArFkIHfkvJpABTKoapMDAtgah+v9ItTXAMjGUJLkGieJwvt 作成した/tmp/rndckeyの内容をそのままコピー
oHn9kIBo2L9c4k7u88LWyTjisLUUotB2Ieg==";
};
controls { rndcを受け付けるインターフェースは、192.168.24.54
inet 192.168.24.54 allow { localnet; } keys { "rndc-test"; } localnet(=192.168.24.60)からのrndcを許可
}; 使用する共通鍵名は、keyステートメントで指定したrndc-test
iptables(パケットフィルタリング)の設定
# iptables -I INPUT 14 -s 192.168.24.60 -p tcp --dport 953 -j ACCEPT 192.168.24.60からのTCP953宛パケットを許可する
# service iptables save 設定の保存
設定の再読み込み
# rm /tmp/rndckey /tmp/rndckeyは不要なので削除
rm: remove 通常ファイル `/tmp/rndckey'? y
# rndc reload 再読み込み実施
rndcを実行する(192.168.24.60)側の設定
# vi /etc/rndc.conf リモートのBINDも制御するため、/etc/rndc.confを使用する
options {
default-server localhost; デフォルトのほうは、ローカル上のnamedサービスを制御するために設定
default-key "rndckey";
};
key "rndckey" {
algorithm hmac-md5;
secret "E03MOKBPayBRkKeUMNGK4WmGkN63jgbcYVhvw1ap
e9YtDBWhyLyTVqpk9RWz";
};
server 192.168.24.54 { 新しく設定を追加
key "rndckey2"; 192.168.24.54に対しては、共通鍵名rndckeys2を使用
};
key "rndckey2" { 共通鍵の設定の追加
algorithm hmac-md5; 共通鍵名は、rndckeys2
secret "fltQArFkIHfkvJpABTKoapMDAtgah+v9ItTXAMjGUJLkGieJwvto 共通鍵は、192.168.24.54のnamed.confで指定したものと同じ
Hn9kIBo2L9c4k7u88LWyTjisLUUotB2Ieg==";
};
# chmod 400 /etc/rndc.conf アクセス権の確認
rootだけが読み込めるように変更
# ls -l /etc/rndc.conf (一般ユーザがrndcを使えないようにする)
-r-------- 1 root root 438 4月 1 18:26 /etc/rndc.conf
192.168.24.60からのrndc確認
# rndc -s 192.168.24.54 status デフォルト以外のホストを対象とするときは、
version: 9.7.3 (Not available.) 「-s ホスト名」オプションを使用する
CPUs found: 1
worker threads: 1
number of zones: 21
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is ON
recursive clients: 0/2900/3000
tcp clients: 0/100
server is up and running
■ rndc関係のトラブルシューティング
rndc.keyファイルにアクセスができないので、namedの起動に失敗する
# service named start
named を起動中: [失敗]
# tail /var/log/messages
Jul 30 01:32:38 notePC01 named[9386]: loading configuration from '/etc/named.conf'
Jul 30 01:32:38 notePC01 named[9386]: /etc/named.conf:54: open: /etc/rndc.key: permission denied
Jul 30 01:32:38 notePC01 named[9386]: loading configuration: permission denied
Jul 30 01:32:38 notePC01 named[9386]: exiting (due to fatal error)
[ 対応 ]
上記のように「permission denied」であれば、/etc/rndc.keyのアクセス権をnamedサービスを実行するユーザが読み込めるように変更する
もし「not found」であれば、named.confで指定した場所にrndc.keyが見つからないので、保存場所が正しいかどうか確認する
rndcコマンドが参照する、共通鍵が記述されたファイル(/etc/rndc.confまたは/etc/rndc.key)が見つからない
# rndc status
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
[ 対応 ]
/etc/rndc.keyまたは/etc/rndc.confを用意して設定を行う
rndc.keyがあるがデフォルトの設定ファイルrndc.confを使用したとでる
# rndc status
WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)
[ 対応 ]
デフォルトでrndcコマンドは/etc/rndc.confを最初に参照し、なければ/etc/rndc.keyを参照する
エラーではないが、この警告が出ないようにするには/etc/rndc.confか/etc/rndc.keyのどちらだけにする
(chroot環境だとこのエラーはでないかも?)
rndcでnamedへの接続に失敗する
# rndc status
rndc: connect failed: 127.0.0.1#953: connection refused
[ 対応 ]
namedサービスが起動していないので起動させる  または、named.confのcontrolsステートメントの見直し
rndcが使用するkeyと対象のnamedサービスが使用するkeyが異なる
# rndc 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,
or the key is invalid.
[ 対応 ]
rndcが使用するkey(/etc/rndc.confまたは/etc/rndc.keyの中)とnamed.confの使用するkey(named.conf内か読み込んでいる外部ファイル)の
共通鍵(鍵名は不一致でも良い)を合わせる
rndcの設定がおかしいため、namedサービスが正常に終了できない
# service named stop
named を停止中: ...........................................[失敗].
[ 対応 ]
namedを強制的に終了させ、rndc関係の設定を確認する
[ 解決例 ]
# ps -ef | grep named
named 8344 1 0 13:59 ? 00:00:00 /usr/sbin/named -u named -4 -t /var/named/chroot namedのプロセスがまだ残っていることを確認
# kill 8344 killコマンドで強制終了
# service named start 仮にすぐに起動させた場合は、起動するが・・
named を起動中: [ OK ]
 ここの灰色の部分は
# service named status status情報がおかしい  検証のために行ったことなので
named が停止していますが PID ファイルが残っています  やらないこと
# ps -ef | grep named 起動中のnamedのプロセス番号と、named.pidに
named 9831 1 0 15:31 ? 00:00:00 /usr/sbin/named -u named -4 -t /var/named/chroot 登録されているプロセス番号が不一致するという
問題が発生する
# more /var/run/named.pid
9136
# service named status killで終了した場合はまずはstatusを確認
rndc: connect failed: 127.0.0.1#953: connection refused rndc:connection〜はnamedが停止のためなので無視
named が停止していますが PID ファイルが残っています
# more /var/run/named.pid PIDファイルの確認(こちらはシンボリックリンク)
中身は空だがファイルは存在する(存在することが問題)
# more /var/named/chroot/var/run/named/named.pid PIDファイルの確認(こちらは本体)
中身は空だがファイルは存在する(存在することが問題)
# rm /var/named/chroot/var/run/named/named.pid PIDファイルの削除
# rm /var/run/named.pid 同上
rm: remove シンボリックリンク `/var/run/named.pid'? y
# service named status (2重起動防止のための)ロックファイルが
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found 残っているのでまだ起動できない
named は停止していますがサブシテムがロックされています
# ls -l /var/lock/subsys/named ロックファイルが存在する
-rw-r--r-- 1 root root 0 4月 1 13:08 /var/lock/subsys/named
# rm /var/lock/subsys/named ロックファイルの削除
rm: remove 通常の空ファイル `/var/lock/subsys/named'? y
# service named status エラーが出なくなった
rndc: connect failed: 127.0.0.1#953: connection refused
named は停止しています
rndcの設定を確認後、namedサービスを起動させる