世の中捨てたモンじゃなくて,Chroot-BIND HOWTO に親切な方が詳細なインストール解説をしてくれています.これを読めば誰でもインストールできはずです(僕はできました).なら,ここのドキュメントは不必要な気がするでしょうが,ここではもっと詳細にかつ,Chroot-BIND HOWTO で僕がはまったことも書いておきます.
なお,環境は Vine Linux 2.5 および 2.6 を想定しています.
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 は通常 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 スクリプトを少し書き換えて,元に戻します.
ポイントは3つです.
# 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 のインストールは完了です.