bind 9.x インストールメモ #--------------------------------------------------------------------------------------------- # bind 9.x 概要 #--------------------------------------------------------------------------------------------- bind 9.x はネームサーバをChroot Jail の内部で、非root ユーザとして実行させることができます。これによりセキュリティが強化され、セキュリティが破られた時も影響を最小限にできます。 なぜ、Chroot Jail が必要なのでしょうか?仮に悪い奴がbind 9.x の穴を使ってアクセスを得たとしても、そのアクセスできる範囲を最小限に制限できるからです。bind 9.x を非root ユーザ権限で動作させるのも同じ理由からです。 #--------------------------------------------------------------------------------------------- # bind 9.x のインストール方法 #--------------------------------------------------------------------------------------------- bind 9.x のソースをインターネットよりダウンロード後、ソースを解凍します。 # su root # cd /usr/local/src/ # wget bind-9.2.3.tar.gz # tar zxvf bind-9.2.3.tar.gz bind 9.x をChroot Jail 環境にて動作させるので、非root ユーザーを作成します。 # groupadd dns # useradd -g dns -d /usr/local/bind -s /bin/nologin named インストールが完了したら、次にChroot Jail に使用するディレクトリ構造を作る必要があります。インストールする際に下記の構造の過半数は作成しますが念のため、構造は下記表1 のようにします。 # mkdir /usr/local/bind # mkdir /usr/local/bind/dev # mkdir /usr/local/bind/etc # mkdir /usr/local/bind/etc/zone # mkdir /usr/local/bind/etc/zone/slave # mkdir /usr/local/bind/var # mkdir /usr/local/bind/var/run ------------------------------------------------------------ /usr/local/bind +-- dev +-- etc +-- zone +-- slave +-- var +-- run ------------------------------------------------------------ 表1 :Chroot Jail の構造 上記ディレクトリ構造を作成した後、bind 9.x が必要とするシステムファイルをChroot Jail 内部に作成します。 ● bind 9.x 設定ファイル まずはbind 9.x が必要とするnamed.conf 及び、ゾーンファイルを/usr/local/bind/etc 以下にコピー、又は作成します。便宜上、ゾーンファイルは/usr/local/bind/etc/zone ディレクトリ配下に置くこととします。 named.conf の場所 ・・・ /usr/local/bind/etc/ 配下 ゾーンファイルの場所 ・・・ /usr/local/bind/etc/zone/ 配下 bind 9.x をスレーブでサービスするためにはbind 9.x は/usr/local/bind/etc/zone/slave ディレクトリを更新できなくてはいけません。また、bind 9.x は統計情報をダンプできますので、それもこのディレクトリに書けるようにしてやる必要があります。これらの理由から、このディレクトリ(とその中身) の所有者はdnsユーザにしておくべきでしょう。 # chown -R named:dns /usr/local/bind/etc/zone/slave ● PID ソケットファイル bind 9.x はpid ファイルを作成するために、Chroot Jail 環境用のrun ディレクトリにも書き込み権を必要とします。次のコマンドでこれを可能にしてあげましょう。 # chown named:dns /usr/local/bind/var/run ● システムのサポートファイル bind 9.x がChroot Jail 内部での実行を始めると、Chroot Jail 外部のファイルへは一切アクセスできなくなります。bind 8.x よりかは少ないですが、SSL のキーを作成するなど、やはりシステム依存のファイルを使用する必要があります。 bind 9.x がChroot Jail の内部に必要とするファイルのひとつに/dev/null があります。また、SSL キー作成のためには/dev/random も作成しておきます。 # mknod /usr/local/bind/dev/null c 1 3 # mknod /usr/local/bind/dev/random c 1 8 # chmod 666 /usr/local/bind/dev/{null,random} 最後に、さらに、bind 9.x に正しい時刻でログを記憶させるためetc/localtime が必要となります。 # cp /etc/localtime /usr/local/bind/etc/ 通常bind 9.x はログをシステムのロギングデーモンであるsyslogd 経由で記録します。このタイプのログ記録は、特殊なソケットである/dev/log を通してログエントリを送信することで行われます。しかし、これはChroot Jail の外部にありますから、bind 9.x からは使えません。syslog にて-a スイッチを利用してログエントリをChroot Jail 内部からsyslog へ送る必要があります。 /etc/rc.d/init.d/syslog ファイルを以下のように-a スイッチを使用する形で修正します。 ↓ ココから ------------------------------------------------ daemon syslogd -m 0 ↓ daemon syslogd -m 0 -a /usr/local/bind/dev/log ↑ ココまで ------------------------------------------------ ※ Red Hat 系linux では、上記オプションの追加は/etc/sysconfig/syslog に記述します。 修正後、syslog を再起動し/usr/local/bind/dev 以下にlog ファイルが作成できていれば成功ということになります。 必要なファイル類を作成できた時点で、セキュリティーのためにファイル、ディレクトリのパーミッションを設定します。 今回はbind 9.x をChroot Jail 環境にて動作させるので/usr/local/bind はbind 9.x が書き込める最低限の権限だけを設定します。 # chown named:dns /usr/local/bind # chmod 700 /usr/local/bind Chroot Jail で用いるbind 9.x のコンパイルは、bind 8.x の時よりもずっと快適な作業となるでしょう。実のところ、しなければならないことは特に何もなく、標準的な”./configure”と”make”だけで良いのです。 # cd /usr/local/src/bind-9.2.3 # ./configure --prefix=/usr/local/bind # make 最後に、必要なバイナリをインストールします。この作業は非常に簡単で、”make install”を実行するだけで終わりです。最終的にbind 9.x が必要とするファイルは全て/usr/local/bind 配下にインストールされます。 #--------------------------------------------------------------------------------------------- # rndc ユーティリティー 概要及び、使い方 #--------------------------------------------------------------------------------------------- bind 9.x には、rndcというユーティリティコマンドが含まれています。それを使用することで、ローカルホスト又はリモートホストからのnamed デーモンのコマンドライン管理ができるようになります。 他のシステムの権限のないユーザーによってサーバーのbind 9.x が制御されるのを防ぐため、共有秘密鍵方式を使用して、特定のホストに明示的に特権を与えます。このことは/etc/named.conf とrndc の 設定ファイルである/etc/rndc.conf の両方で同一の鍵を所有する必要があることを意味します。 同一キーは両ファイルの”secret”ステートメントにより定義されています。 ● /etc/named.conf の設定 rndc がnamed サービスに接続するためには、bind 9.x サーバーの/etc/named.conf ”controls”ステートメントがなくてはいけません。 以下の例に示す”controls”ステートメントにより、ローカルホストからrndc を利用することができます。具体的には、named にループバックアドレスのデフォルトTCPポート953 をLISTEN するように指示し、適切な鍵が与えられた場合にローカルホストからのrndc コマンドを許可します。 また、”rndc-key”によって、共有暗号鍵を定義します。”<共有暗号鍵名>”は下記のような”key”ステートとして定義しますが、通常”key”ステートメントの内容は非常に重要なので、/etc/named.conf とは別にROOT のみが閲覧できる権限を持つ/etc/rndc.key ファイルとして保存し、/etc/named.conf から”include”ステートメントによってインクルードします。 ------------------------------------------------------------ include "/etc/rndc.key" controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "<共有暗号鍵名>"; }; }; ------------------------------------------------------------ ------------------------------------------------------------ key "<共有暗号鍵名>" { algorithm hmac-md5; secret "<共有暗号鍵文字列>"; }; ------------------------------------------------------------ ● /etc/rndc.conf の設定 このファイルは接続するnamed デーモンが動作するサーバー、ポート、および共有暗号鍵を記憶します。通常は下記のような内容になります。 ------------------------------------------------------------ key "<共有暗号鍵名>" { algorithm hmac-md5; secret "<共有暗号鍵文字列>"; }; options { default-server localhost; default-key "<共有暗号鍵名>"; }; ------------------------------------------------------------ ”<共有暗号鍵文字列>”は接続先サーバーの/etc/rndc.key と同様の暗号鍵でなくてはいけません。また、”options”ステートメントによって、ディフォルトで接続するサーバーや、暗号鍵を指定することができます。なお、rndc.key ファイルは named デーモンを起動するユーザーが読み込める権限が必要です。 ● 共有暗号鍵の作成方法 rndc にて用いる共有暗号鍵は次のコマンドにて作成することができます。 # /usr/local/bind/sbin/rndc-confgen > /etc/rndc.conf 実行の後/etc/rndc.conf 後半の # Use with the following in named.conf から末尾までを、コメント文字(#) を解除したうえで/etc/rndc.key に記憶し、同時に/etc/named.conf ”control””include”ステートメントを追加します。 #--------------------------------------------------------------------------------------------- # Dynamic DNS (DDNS) に関して #--------------------------------------------------------------------------------------------- Dynamic DNS とは、DNS のゾーン情報を動的に変更できる仕組みのことです。近年、フレッツADSL,ISDN などの常時接続が復旧したことで自前にサーバーを立てる方が増えていますが、接続してリースされるIP は固定ではありません。そこで、毎回変動するIP を固定ホスト名でひも付けしようとの考え方がDynamic DNS なのです。 Dynamic DNS をサービスする業者は増えていますが、そのほとんどが自社のサブドメインを、変動するIP にひも付けするサービスです。最近はホスト名だけでなく、MX レコードやドメイン自体もIP アドレスをひも付けできるようになっています。 ● bind 9 におけるDymanic DNS の設定 Dynamic DNS によるゾーン自動更新の機能を誰にでも使えるようにすることはセキュリティー上好ましくありません。そこで、通常は/etc/named.conf のゾーン定義部にゾーンごとにDynamic DNS を許可するIP アドレスを記載し、利用制限を行います。 ------------------------------------------------------------ zone "spicy-islands.com" { type master; file "spicy-islands.com.zone" allow-update { 192.168.100.0/24; 192.168.1.10; }; ------------------------------------------------------------ ※ allow-update はzone ディレクティブ内でしか有効でありません 上記のように設定した場合、192.168.100.0/24、または192.168.1.10 からのみDynamic DNS の機能が有効となります。 ● nsupdate コマンド 実際、bind 9 に対してゾーン自動更新を行うにはnsupdate コマンドを用います。使い方は下記を参考にしてください。 > 対話的にnsupdate コマンドを用いる場合 1.test.spicy-islands.com 100 in a 192.168.100.1 レコードを発行する $ nsupdate > server spicy-islands.com ← DNS レコード更新対象のサーバーを指定する > update add test.spicy-islands.com 100 in a 192.168.100.1 > show ← 今回の更新分を表示する > send ← 更新する 2.test.spicy-islands.com レコードを削除する $ nsupdate > server spicy-islands.com ← DNS レコード更新対象のサーバーを指定する > update delete test.spicy-islands.com > send ← 更新する > 非対話的にnsupdate コマンドを用いる 1.test.spicy-islands.com 100 in a 192.168.100.1 レコードを発行する $ echo -e 'update add test.spicy-islands.com 100 in a 192.168.100.1\n' | nsupdate 2.test.spicy-islands.com レコードを削除する $ echo -e 'update delete test.spicy-islands.com\n' | nsupdate