BIND は嫌いだが、仕事で使うこともあるのでインストールしてみた。 BIND のセキュリティは信頼していないので、非 root 権限かつ chroot は必須。 以下 Debian GNU/Linux 4.0 (正式リリース前) での話。 標準では chroot 環境が用意されないので構築する必要がある。
bind9 パッケージをインストールし、デーモン (named) を停止する。
# apt-get install bind9
...
/etc/init.d/bind9 stop
Stopping domain name service...: bind.
chroot 環境のディレクトリ階層を作る。
chroot 先は /var/lib/named とした。
# mkdir /var/lib/named
cd /var/lib/named
mkdir -p dev etc/bind var/cache/bind var/run/bind
cp -a /dev/null /dev/random dev/
chroot 環境に見せたいディレクトリをマウントするため、
/etc/fstab に以下のエントリを追加し、マウントする。
/etc/bind /var/lib/named/etc/bind none bind 0 0
/var/cache/bind /var/lib/named/var/cache/bind none bind 0 0
/var/run/bind /var/lib/named/var/run/bind none bind 0 0
# mount -a
rndc.key ファイルの所有ユーザーが意味もなく bind になっているので、
root 所有に変更しておく。
# chown root /etc/bind/rnds.key
chroot 環境からソケット経由で syslog にアクセスさせるため、
/etc/default/syslogd の SYSLOG の値を以下のように変更し、
syslogd を再起動する。
SYSLOGD="-a /var/lib/named/dev/log"
# /etc/init.d/sysklogd restart
Restarting system log daemon: syslogd.
bind9 (named) を chroot させるため、
/etc/default/bind9 の OPTIONS の値を以下のように変更し、
デーモンを起動する。
OPTIONS="-u bind -t /var/lib/named"
# /etc/init.d/bind9 start
Starting domain name service...: bind.
デーモンが動作していることを確認する。
# rndc status
number of zones: 4
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/1000
tcp clients: 0/100
server is up and running
host -t ns example.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:
example.com name server a.iana-servers.net.
example.com name server b.iana-servers.net.
念の為、
非 root 権限で動作しているかどうかを ps コマンドの出力で、
chroot 環境で動作しているかどうかを
/proc/named のプロセス ID/root で確認しておく。
以上でとりあえず動くが、
これだけでは named が CPU の数を知ることができず、
2 CPU 以上の環境でも
found 1 CPU, using 1 worker thread
(syslog より) と誤認識してしまう。
これを回避するにはディレクトリ
/var/lib/named/proc
を作成し、proc ファイルシステムをマウントして cpuinfo を見せてやる必要がある。
曖昧な記憶によると、過去に proc ファイルシステム関連の脆弱性があったような気がするので、
今回は止めておいた。




