既に BIND が (例えば RPM から) インストール済みなら、
新しい BIND をインストールする前に、それらを削除しておきましょう。
Red Hat のシステムなら、
bind
パッケージと bind-utils
パッケージを削除すればいいです。
もし bind-devel
や caching-nameserver
があったら、
それらも削除しておきましょう。
init スクリプト (/etc/rc.d/init.d/named
)
があったら、パッケージの削除前にコピーを保存しておくといいでしょう。
後で役に立ちます。
これは簡単な方です :-)
make install
を実行すれば全部やってくれます。
chroot でないほうの BIND を間違って実行しないように、
あとで chmod 000 /usr/local/sbin/named
を実行しておくといいかもしれません
(先に私がおすすめした /usr/local/sbin
を選ばなかった人は、
ここでは /usr/sbin/named
になります)。
【訳注: バイナリの再ビルドをしなければ、ここの作業は不要ですね。】
chroot jail の中で生活する必要があるのは 2 つのプログラムだけです。
メインの named
デーモン自身と
named-xfer
です。後者はゾーン転送に用いられます。
ソースツリーからコピーするだけで OK です。
# cp src/bin/named/named /chroot/named/bin
# cp src/bin/named-xfer/named-xfer /chroot/named/bin
【訳注:
バイナリの再ビルドをしなければ、
ここではパッケージに含まれる named
,
named-xfer
を移動すれば良いです。
訳者としましては、
移動先にはデフォルトを反映させて /chroot/named/usr/sbin
の方をおすすめしたいのですが。】
ディストリビューションに含まれている init スクリプトがあれば、
それを /chroot/named/bin/named
を
適切なスイッチとともに起動するよう変更するのが最も簡単でしょう。
スイッチは... (ここでドラムロール...)
-u named
, これは BIND をユーザ root
ではなく named
で実行します。-g named
, これは BIND をグループ root
や wheel
ではなく
named
で実行します。-t /chroot/named
, これはにより BIND は自分自身を
(先に用意した) jail に chroot します。以下の init スクリプトは、著者が自分の
Red Hat 6.0 システムで使っているものです。
おわかりのとおり、ほとんどは Red Hat のものと変わりありません。
ndc restart
コマンドも少々変更し、
chroot を保ったまま正しくサーバを再起動するようにしてあります。
これをそのままコピーしただけでは使えない場合でも、
お使いの init スクリプトに同じ変更は簡単に行えるはずです。
#!/bin/sh # # named This shell script takes care of starting and stopping # named (BIND DNS server). # # chkconfig: 345 55 45 # description: named (BIND) is a Domain Name Server (DNS) \ # that is used to resolve host names to IP addresses. # probe: true # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -f /chroot/named/bin/named ] || exit 0 [ -f /chroot/named/etc/named.conf ] || exit 0 # See how we were called. case "$1" in start) # Start daemons. echo -n "Starting named: " daemon /chroot/named/bin/named -u named -g named -t /chroot/named echo touch /var/lock/subsys/named ;; stop) # Stop daemons. echo -n "Shutting down named: " killproc named rm -f /var/lock/subsys/named echo ;; status) /usr/local/sbin/ndc status exit $? ;; restart) /usr/local/sbin/ndc -n /chroot/named/bin/named "restart -u named -g named -t /chroot/named" exit $? ;; reload) /usr/local/sbin/ndc reload exit $? ;; probe) # named knows how to reload intelligently; we don't want linuxconf # to offer to restart every time /usr/local/sbin/ndc reload >/dev/null 2>&1 || echo start exit 0 ;; *) echo "Usage: named {start|stop|status|restart}" exit 1 esac exit 0
Caldera OpenLinux システムでは、 先頭付近で定義されている変数を修正し、以下のようにすれば OK です。
NAME=named
DAEMON=/chroot/named/bin/$NAME
OPTIONS="-t /chroot/named -u named -g named"
【訳注:
先に述べたように、
ndc
に -c
, -p
, -n
などのオプションを用いれば、
バイナリの再コンパイルは訳者の環境では不要でした。
訳者が Debian で使っている init スクリプト
(/etc/init.d/bind
) を以下に示します。
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin test -x /chroot/named/usr/sbin/named || exit 0 case "$1" in start) echo -n "Starting domain name service: named" start-stop-daemon --start --quiet --exec /chroot/named/usr/sbin/named \ -- -u named -g named -t /chroot/named echo "." ;; stop) echo -n "Stopping domain name service: named" start-stop-daemon --stop --quiet \ --pidfile /chroot/named/var/run/named.pid \ --exec /chroot/named/usr/sbin/named echo "." ;; restart) /usr/sbin/ndc -c /chroot/named/var/run/ndc \ -n /chroot/named/usr/sbin/named \ -p /chroot/named/var/run/named.pid \ "restart -u named -g named -t /chroot/named" ;; reload) /usr/sbin/ndc -c /chroot/named/var/run/ndc \ -n /chroot/named/usr/sbin/named \ -p /chroot/named/var/run/named.pid \ reload ;; force-reload) $0 restart ;; *) echo "Usage: /etc/init.d/bind {start|stop|reload|restart|force-reload}" >&2 exit 1 ;; esac exit 0
named
と named-xfer
) の置場所は
ディレクトリ構造に関する訳注
のところで書いたように、chroot jail 内の /usr/sbin
にしています。】
named.conf
にもいくつか追加・修正を行い、
いろいろなディレクトリが正しく動作するようにする必要があります。
特に、以下を option
セクションに追加 (あるいはすでにあれば修正)
しなければなりません。
directory "/etc/namedb";
pid-file "/var/run/named.pid";
named-xfer "/bin/named-xfer";
これらのファイルは named
デーモンが読むことになるので、
もちろんパスはすべて chroot jail 内部での相対位置になります。
【訳注: named.conf に関する訳注 のところで書きましたが、 directory は一時ファイルの置き場所であると同時に ゾーンファイルのパス指定のベースディレクトリになるところです。
pid-file はデフォルトと同じなので特に指定の必要はなし、
named-xfer は
ディレクトリ構造に関する訳注
で書いたように、バイナリを /chroot/named/usr/sbin
に置けば指定しなくて良いはずです。】
何人かの人のレポートによれば、
以下の余分なブロックを named.conf
に書かないと、
ndc
が正しく動作しない、とのことです。
controls {
unix "/var/run/ndc" perm 0600 owner 0 group 0;
};