rndc ローカル上 またはリモート上にある BIND9 を制御するツール主に 設定の再読み込み named サービスの停止 ( 起動はできない ) 統計情報の表示 キャッシュのクリアなどのために使用する rndc の仕組仕組み rndc コマンドを実行する端末は 同じ端末 ( サーバ ) 上の named サービス または外部のサーバ上の named サービスの制御をすることができる rndc の設定 rndc を利用するためには rndc コマンドを実行する側と BIND サービスが実行されている側の双方で設定が必要になる設定をする際に 両者で利用する共通鍵が必要となるので まずは共通鍵を作成する 1 共通鍵の作成 /.keyがデフォルトで存在する場合は そこに記述された共通鍵を利用しても良い新しく共通鍵を作成したい場合は 共通鍵を作成するBIND 付属のrndc-confgenコマンドを使用する ( 他にもdnssec-keygenがあるが ここでは割愛 ) 作成した共通鍵は 2や3で使用する [ 書式 rndc-confgen オプション [ 主なオプション -a 共通鍵を新しく作成するデフォルトでは /.keyに出力 -b ビット数 共通鍵の鍵の長さ ( ビット数単位 ) 省略時のデフォルトは128bit 512bit 推奨 -c 出力ファイル名 省略時は /.keyで作成されるが 別のファイル名としたい場合に使用する -k 共通鍵名 共通鍵名の指定 -t chrootディレクトリ chrootディレクトリ配下にもファイルを出力したい場合 -u ユーザ名 chrootディレクトリ配下に出力したファイルの所有者を指定したい場合 [ 設定例 # rndc-confgen -a -b 512 -k rndctest -cオプション省略時は/.keyに出力 ( 既存の /.keyがあれば上書きされる) 鍵の長さは推奨の512bitを指定 # more /.key 確認 key "rndctest" { secret "Ey/2YxEvsIiJ5WwQWzdlDAZ5L1ICSShC6e1QNdQ1 h5jgthmij608ovd38ge7br/nfe0wnkk1oub/ykm63fg16a=="; # ls -l /.key アクセス権は root のみ読み込み可になっている -r-------- 1 root root 141 4 月 23 0358 /.key [ 参考 # rndc-confgen -a -b 512 -c /.key.test オプションの検証のため 適当に設定してみた -k keytestdesu -t /var/named/chroot -u named # ls -l /* -cオプションを使うと既存の/.keyを上書きすること -r-------- 1 root root 113 4 月 13 1103 /.key はない -rw------- 1 root root 144 4 月 23 0345 /.key.test ( なぜか ) アクセス権は読み書き可になっている # ls -l /var/named/chroot/.key.test chroot 配下にも同じものが作成される -rw------- 1 named root 144 4 月 23 0345 /var/named/chroot/.key.test -uオプションはchroot 配下のファイルに影響している
2 rndc コマンドを実行実行するする側の設定 rndcコマンドは rndcコマンドを実行する端末上の /.confまたは/.keyをデフォルトで参照している最初に /.confを参照し ファイルがない場合は /.keyを参照するよって /.confの設定が誤っている場合は /.keyが存在していてもrndcに失敗する /.conf にするのか /.key にするのかは自由だが リモート上にある BIND を制御する場合は /.conf でなければならない ( server ステートメントで外部の named サーバを指定するため ) ローカル上の named サービスを制御する場合は どちらのファイルでも良い 通常 rndc コマンドの使用は root 権限を持ったユーザのみに制限するので ファイルのアクセス権を root のみ読み込みができるように変更をする rndc 実行時のオプションを使うことにより /.conf または /.key 以外のファイルを使用することもできる rndc が読み込むファイルファイルの順序 各ファイルファイルで使用使用するするステートメント /.conf optionsステートメントデフォルトで使用する共有鍵名と相手のホスト名を指定する serverステートメントデフォルトで指定した相手以外に対してもrndcを実行したい場合は serverステートメントを使用して その相手のホスト名と使用する共有鍵名を指定する serverステートメントを省略した場合は optionsで指定したデフォルトを対象とする keyステートメント共有鍵の設定 /.key key ステートメント 共有鍵の設定 各ファイルファイルでのでの書式 [ /.confの書式 options { default-server デフォルトの相手となるホスト名 ; default-key " デフォルトで使用する共通鍵名 "; options ステートメントは必須 server rndcの対象となるホスト名 { serverステートメントは任意 複数設定可能 key " 使用する共通鍵名 "; optionsステートメントで指定したデフォルト以外のサーバも rndcで制御したい場合に記述する key " 共通鍵名 " { keyステートメントは必須複数設定可能 options, serverステートメントで指定した共通鍵の設定 secret " ベース64でエンコードされた共通鍵 "; [ /.keyの書式 key " 共通鍵名 " { secret " ベース64でエンコードされた共通鍵 "; key ステートメントは必須
[ /etc / rndc.conf conf の場合場合の設定例 # vi /.conf rndc.confはないので 新規に作成する options { optionsステートメントは必須 default-server localhost; default-key "rndckey"; server localhost { key "rndckey"; secret "NWteQWyWZBsI6T9W3srJ7bTPg5 ju3to8rfzj0sd0y3sd9ca7lnxb4su9kxe7"; serverステートメントは任意左記の場合だと optionsと同じ内容なので省略しても問題ない key ステートメントは必須 # chmod 600 /.conf root しか読み込みができようにアクセス権を変更する # ls -l /.conf -r-------- 1 root root 217 4 月 7 1049 /.conf [ /etc / rndc.key の場合場合の設定例 # vi /.key secret "NWteQWyWZBsI6T9W3srJ7bTPg5 ju3to8rfzj0sd0y3sd9ca7lnxb4su9kxe7"; # ls -l /.key -r-------- 1 root root 217 4 月 7 1049 /.key key ステートメントは必須 root しか読み込みができようにアクセス権を変更する 3 named サービス側の設定 named.confファイルで rndcによる制御を許可する端末と使用する共通鍵の設定を行う namedサービス側が使用する共通鍵をincludeを使って 外部のファイルから読み込む場合 サービスを実行するユーザが読み込むことができればよい ステートメント keysステートメント controlsステートメント rndcを使う相手との間で使用する共通鍵の設定 controlsで指定した相手にあわせて複数設定可能 named.confにkeysステートメントを使ってキーを直接記載せずに includeステートメントを使って 外部ファイルに記載したkeysステートメントを読み込む方法もある rndcによる制御を許可する相手と使用する共通鍵を設定 rndcを実行する相手ごとに異なる共通鍵を使用する場合は 複数設定する [ 書式 key " 共通鍵名 " { secret " ベース64でエンコードされた共通鍵 "; include " 外部ファイル名 "; # key ステートメントが記述された外部のファイルを読み込む場合に使用する inet nrdc を受け付けるインターフェースアドレス allow { 許可する相手 ; } keys { " 使用する共通鍵名 "; [ 外部ファイルファイルを読み込む場合場合の設定例 # more named.conf include "/.key"; includeを使って 読み込むファイルを指定 chrootを使っている場合は chrootディレクトリから見た位置 この場合はローカル (127.0.0.1) からのみrndcコマンドを inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndckey"; 受け付ける そのときに使用する共通鍵名は rndckey # more /var/named/chroot/.key includeで読み込んでいるファイル 共通鍵名は controlsステートメントの共通鍵名と 同じであること secret "NWteQWyWZBsI6T9W3srJ7bTPg5 ju3to8rfzj0sd0y3sd9ca7lnxb4su9kxe7"; # ls -l /var/named/chroot/.key namedサービスは namedユーザで稼動させているので -r-------- 1 named named 113 3 月 23 1522 /var/named/chroot/.key namedユーザに対して所有権 アクセス権を与えるように変更 した
rndc の設定例 ローカル上の named サービスの制御ここではローカルからのrndcのみ許可する設定を説明すると同時に rndcコマンドが読み込むファイルとnamedサービスが読み込むファイルが異なることを検証す rndc が使用使用するするファイルファイルの作成 # rndc-confgen -a -b 512 -k rndc-key # more /.key 内容の確認 key "rndc-key " { secret "i/3whpjtslbveh0hzyv66qodztqaqaha15xmuqe9grvl3rb9 hnpmw9l6fw/f8k34u24se7dw0jjyc+g6/la7aa=="; /.keyを作成 ( 既存の /.keyは上書きされる) rndcコマンドが使用する共通鍵名は rndc-key とした # ls -l /.key アクセス権の確認 rootしか読み込めないようにする -r-------- 1 root root 77 4 月 1 1401 /.key ( 一般ユーザがrndcを使えないようにする ) named.conf の設定 # vi /var/named/chroot/etc/named.conf 今回は共通鍵を外部ファイルから読み込む方法で設定 chroot 環境下なので 実際は include "/.key.chroot"; /var/named/chroot/.key.chroot namedが読み込むファイル名は何でも良い アクセスできるのはローカルシステムのみ inet 127.0.0.1 allow { 127.0.0.1; } keys { " rndckeys "; 使用する共通鍵名は rndckeys にした (/.keyと明確に区別するため) named.conf が読み込むファイルファイルの作成 # cp /.key /var/named/chroot/.key.chroot ( 最初から作るのは面倒なので )/.keyをコピーして # vi /var/named/chroot/.key.chroot 共通鍵名はnamed.confで指定した rndckeys に変更 key "rndckeys " { secret "i/3whpjtslbveh0hzyv66qodztqaqaha15xmuqe9grvl3rb9 hnpmw9l6fw/f8k34u24se7dw0jjyc+g6/la7aa=="; # chown namednamed /var/named/chroot/.key.chroot アクセス権の変更 named しか読み込めないようにする # chmod 400 /var/named/chroot/.key.chroot # ls -l /var/named/chroot/.key.chroot -r-------- 1 named named 77 4 月 1 1505 /var/named/chroot/.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がおかしい場合は正常に終了できない)
リモート上の named サービスの制御 192.168.24.54のホスト上で動作するnamedサービスに対して 192.168.24.60からrndcコマンドの実行ができるようにする named サービス (192 192.168 168.24 24.54 54) 側の設定共通鍵の作成 # rndc-confgen -a -b 512 -c /tmp/rndckey -k rndc-test 既存の /.keyはそのまま使用するので wrote key file "/tmp/rndckey 上書きしないように別ファイルに出力 # more /tmp/rndckey 内容の確認 key "rndc-test" { (/tmp/rndckey ファイルは後で削除する ) 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 "/.key.chroot"; inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndckeys"; key "rndc-test" { secret "fltqarfkihfkvjpabtkoapmdatgah+v9ittxamjgujlkgiejwvt ohn9kibo2l9c4k7u88lwytjisluuotb2ieg=="; 上記の検証で作成したローカルからの rndc 用の設定ファイル 今回は共通鍵を外部ファイルから読み込まずに keyステートメントで指定した方法で設定することとし 作成した /tmp/rndckeyの内容をそのままコピー 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 192.168 168.24 24.60 60) 側の設定 # vi /.conf リモートのBINDも制御するため /.confを使用する options { default-server localhost; default-key "rndckey"; server localhost { key "rndckey"; secret "E03MOKBPayBRkKeUMNGK4WmGkN63jgbcYVhvw1ap e9ytdbwhylytvqpk9rwz"; server 192.168.24.54 { key "rndckey2"; ローカル (192.168.24.60) のnamedサービスを制御するための rndcの設定新しく設定を追加 192.168.24.54に対しては 共通鍵名 rndckeys2を使用 key "rndckey2" { 共通鍵の設定 共通鍵名は rndckeys2 secret "fltqarfkihfkvjpabtkoapmdatgah+v9ittxamjgujlkgiejwvto 共通鍵は 192.168.24.54のnamed.confで指定したものと同じ Hn9kIBo2L9c4k7u88LWyTjisLUUotB2Ieg=="; # chmod 400 /.conf アクセス権の確認 root だけが読み込めるように変更 # ls -l /.conf ( 一般ユーザが rndc を使えないようにする ) -r-------- 1 root root 438 4 月 1 1826 /.conf
192.168 168.24 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 013238 notepc01 named[9386 loading configuration from '/etc/named.conf' Jul 30 013238 notepc01 named[9386 /etc/named.conf54 open /.key permission denied Jul 30 013238 notepc01 named[9386 loading configuration permission denied Jul 30 013238 notepc01 named[9386 exiting (due to fatal error) [ 対応 /.key のアクセス権を named サービスを実行するユーザが読み込めるように変更する rndc が使用使用するする 共通鍵共通鍵が記述記述されたされたファイル (/etc rndc.conf conf または /etc rndc.key key) が見つからない # rndc status rndc neither /.conf nor /.key was found [ 対応 /.key または /.conf を用意して設定を行う 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(/.conf または /.key の中 ) と named.conf の使用する key(named.conf 内か読み込んでいる外部ファイル ) の共通鍵 ( 鍵名は不一致でも良い ) を合わせる
rndc の設定設定がおかしいためがおかしいため named サービスが正常正常に終了終了できない # service named stop named を停止中...[ 失敗. [ 対応 named を強制的に終了させ rndc 関係の設定を確認する [ 解決例 # ps -ef grep named named 8344 1 0 1359? 000000 /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 1531? 000000 /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 rndcconnection~は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 /.conf nor /.key was found 残っているのでまだ起動できない named は停止していますがサブシテムがロックされています # ls -l /var/lock/subsys/named ロックファイルが存在する -rw-r--r-- 1 root root 0 4 月 1 1308 /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 サービスを起動させる