BIND9 系とか(インストール編)

世の中捨てたモンじゃなくて,Chroot-BIND HOWTO に親切な方が詳細なインストール解説をしてくれています.これを読めば誰でもインストールできはずです(僕はできました).なら,ここのドキュメントは不必要な気がするでしょうが,ここではもっと詳細にかつ,Chroot-BIND HOWTO で僕がはまったことも書いておきます.
なお,環境は Vine Linux 2.5 および 2.6 を想定しています.

RPM な BIND との決別,ちょっとその前に

Chroot-BIND HOWTO ではまずユーザの作成から始めてますが,RPM な BIND を削除するときにまっさらに消されてしまいますから,先に RPM な BIND を削除します.
しかし削除の前にやることがあります.各種設定情報と,init スクリプトのバックアップです.RPM を削除しても各種設定は普通残りますが,init スクリプトは削除されてしまいます.バックアップをしてから,RPM を削除します.

 
BIND(nameデーモン)を停止する.
# /etc/rc.d/init.d/named stop

適当にパックアップする.
# cp -r /var/named .
# cp /etc/named.conf .
# cp /etc/rc.d/init.d/named .

RPM な BIND に今までの奉仕に感謝しつつ去ってもらう.
BIND まわりのパッケージを探す.
# rpm -qa | grep bind
bind-8.3.1-0vl1
bind-devel-8.3.1-0vl1
bind-utils-8.3.1-0vl1
ypbind-1.10-0vl1

上3つが BIND 関係パッケージで,これらを削除すればいいはずです.
そのまま3つを削除しようとすると caching-nameserver の依存関係が有るといわれるのでこれも共に削除します.
# rpm -e bind-8.3.1-0vl1 \
bind-devel-8.3.1-0vl1 \
bind-utils-8.3.1-0vl1 \
caching-nameserver-7.1-3vl2

ユーザの作成

Chroot-BIND HOWTO によると BIND を root 権限で走らせるのは余りよい考えではないそうです.僕もそう思います.(←本当に理解しているのか?)で,BIND 専用に named とかいうユーザを用意します(RPM削除前には存在している).今回はがんばって vi を使って編集作業をしてみました. vi の使用方法は @IT LinuxSquare を参考にさせていただきました.

 
# vi /etc/passwd
適当なところに以下を追加します.
ユーザ ID は適当に安全な番号でいいのですが,別に見本に逆らう理由もないので従います.
named:x:200:200:Nameserver:/chroot/named:/bin/false

# vi /etc/group
適当なところに以下を追加します.
named:x:200:

ディレクトリの作成

BIND を閉じ込められた小さなディレクトリツリーの内部に走らせることを "Chroot-Bind" と言うそうです. "Chroot-Bind" とは任意のディレクトリを chroot して BIND にそこがあたかもルートディレクトリであるかのようにすることです.その任意のディレクトリを作成します.

 
Chroot-BIND HOWTO に従ってディレクトリを作成します.
# mkdir -p /chroot/named
# cd /chroot/named
# mkdir -p dev etc/namedb/slave var/run

こんな感じなるはずです.
  /chroot
    +-- named
         +-- dev
         +-- etc
         |    +-- namedb
         |         +-- slave
         +-- var
              +-- run
#tree -d /home/chrootとかして確認して下さい.
なぜか Vine Linux には tree コマンドがなかったので ls -R しました.
上みたいにディレクトリが見えると気持ちいいので後日 tree コマンドはインストールしました.

BIND に必要なファイルを配置

先ほどバックアップしたファイル群を新しい BIND の住処にコピーします. BIND は通常 namedb ディレクトリへの書きこみ権限を必要とするそうです.しかしセキュリティを厳しくするために,これを許可しないことにします.使用予定の BIND があるゾーンをスレーブでサービスする場合は,BIND はそのゾーンファイルを更新できなければなりません.ということで,スレーブ用には別ディレクトリを用意してそこに書き込み許可を与えます.(スレーブ DNS は内向けな DNS の場合関係のない話です.)また,プロセス ID や統計情報を書き込むのにも権限が必要です.

 
BIND の名前解決ファイル群をコピーします.
# cp /root/named/∗ /chroot/named/etc/namedb

BIND の設定ファイルをコピーします.
[root@server /root]#cp named.conf /chroot/named/etc

スレーブゾーンのディレクトリに許可を与えます.
# chown -R named.named /chroot/named/etc/namedb/slave
この後にスレーブゾーン用のファイルをコピーします(内向き DNS には関係なし).

プロセス ID や統計情報を書き込む許可を与えます.
# chown named.named /chroot/named/var/run

システムのサポートファイル

BIND が小さなディレクトリツリーの内部での実行を始めると, その外部のファイルへは一切アクセスできなくなるそうです.しかし,いくつかの重要なファイルには実行後もアクセスできなければならないそうです.
BIND が必要とするシステムファイルは /dev/null と /dev/random です.これと同じものを小さなディレクトリツリーの内部に用意します.
また,BIND に正しい時刻でログ記録をさせるには /etc/localtime ファイルが必要です.

 
/dev/null /dev/random を作成します.
# mknod /chroot/named/dev/null c 1 3
# mknod /chroot/named/dev/random c 1 8
# chmod 666 /chroot/named/dev/null
# chmod 666 /chroot/named/dev/random

/etc/localtime をコピーします.
# cp /etc/localtime/ /chroot/named/etc

ログ記録

BIND はログを,システムのロギングデーモンである syslogd 経由で記録するそうです.しかしこの種のログは特殊なソケット /dev/log を使用します.しかしこのデバイスファイルは BIND から見ることができません.これを解決するために syslogd の動作を少し変えます.

 
/etc/sysconfig/daemons/syslog を開き,
SYSLOGD_OPTIONS="-m 0" となっている所を

SYSLOGD_OPTIONS="-m 0 -a /chroot/named/dev/log" と変更します.
変更がすんだら,syslogd を再起動します.
# /etc/rc.d/init.d/syslog restart

コンパイル&インストール

コンパイルおよびインストールはとても簡単です.ソースを取得してきて ./configure と make するだけです.

 
# cd /usr/local/src/bind
wget とかで取得してきます.
# wget --passive-ftp ftp://ftp.isc.org/isc/bind9/9.2.1/bind-9.2.1.tar.gz
(パッシブモードの FTP は任意)
# tar xvzf bind-9.2.1.tar.gz
# cd bind-9.2.1
# ./configure
# make
# make instal

init スクリプト

バックアップした init スクリプトを少し書き換えて,元に戻します.
ポイントは3つです.

  1. * -u named,これは BIND をユーザ root ではなく named で実行します.
  2. * -t /chroot/named,これにより BIND は自分自身を (先に用意した) jail に chroot します.
  3. * -c /etc/named.conf,これは BIND に, jail の内部における設定ファイルのありかを教えます.
    すなわち,絶対パスでの /chroot/named/etc/named.conf を指します.
 
# vi bind
L20,22,29,45,53,59あたりを書き換えます.
#!/bin/bash
#
# 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 /usr/local/sbin/named ] || exit 0

[ -f /chroot/named/etc/named.conf ] || exit 0

RETVAL=0

start() {
      # Start daemons.
      echo -n "Starting named: "
      daemon /usr/local/sbin/named -u named -t /chroot/named -c /etc/named.conf
      RETVAL=$?
      [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
      echo
      return $RETVAL
}
stop() {
      # Stop daemons.
      echo -n "Shutting down named: "
      killproc named
      RETVAL=$?
      [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
      echo
      return $RETVAL
}
rhstatus() {
      /usr/local/sbin/rndc status
      return $?
}
restart() {
      stop
      start
}
reload() {
      /usr/local/sbin/rndc reload
      return $?
}
probe() {
      # named knows how to reload intelligently; we don't want linuxconf
      # to offer to restart every time
      /usr/local/sbin/rndc reload >/dev/null 2>&1 || echo start
      return $?
}

# See how we were called.
case "$1" in
      start)
              start
              ;;
      stop)
              stop
              ;;
      status)
              rhstatus
              ;;
      restart)
              restart
              ;;
      condrestart)
              [ -f /var/lock/subsys/named ] && restart || :
              ;;
      reload)
              reload
              ;;
      probe)
              probe
              ;;
              *)
              echo "Usage: named {start|stop|status|restart|condrestart|reload|probe}"
              exit 1
esac

exit $?

# cp bind /etc/rc.d/init.d

自動起動の設定

BIND をマシン起動時に自動起動するように設定します.

 
# chkconfig --add bind
# chkconfig --level 2345 bind on

これで,BIND のインストールは完了です.