2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

DebianでBINDをchroot(jail)で使う!

CentOS5.x系のBINDは、

# yum bind bind-chroot

でchroot環境を自動で作ってくれる。だけど、Debianでは手動で作らねばならない。
chrootでBINDを動かす意味は、例えば、BINDのモジュールの脆弱性で実行権限が奪われた場合、root権限を奪われたら致命的だからだ。もちろん通常BINDでは、namedユーザとかbindユーザを作って実行権限を委ねている。しかし、もっと安全なのはchroot環境(例えば、 /var/named/chrootとか)を作って、その中を全てnamed権限で操作できるようにすれば、たとえnamedユーザの権限が奪われても /var/named/chroot 内のみの被害で済み、仮に権限が奪われて中を荒らされたなら一度/var/named/chroot以下を消去して再構築することが可能となる。
したがって、ここでは、Debian 4.0r0でBINDのchroot環境を構築してみる。
尚、ここでのchroot化はBINDに限っての話だが、全てのファイルシステムの構造をchroot化する方法もある。その場合は、各ディストリビューションでも構築できるが、 Nature’s Linux は、その構造自体Jailシステムとなっているので構築が容易だ。詳しくは、 ここ を参照してほしい。


1.前提条件
1)Linux環境:Debian 4.0r0 Etch

2)chroot環境は、以下のパス
/var/bind/chroot 以下
3)設定ファイルのパス
/var/bind/chroot/etc/bind
4)killallコマンドを使えるようにする
killallコマンドが無い場合には、セットアップする。
# apt-get update
# apt-get install psmisc


2.BIND9のインスコ
# apt-get install bind9 bind9-host

すかさず、稼働サービス停止
# /etc/init.d/bind9 stop


3.chroot環境を作る
1)chroot用のサービス設定追加(赤字)
# vi /etc/default/bind9
OPTIONS=”-u bind -t /var/bind/chroot
省略

# vi /etc/init.d/bind9
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

OPTIONS=””
RESOLVCONF=yes

test -f /etc/default/bind9 && . /etc/default/bind9

test -x /usr/sbin/rndc || exit 0

. /lib/lsb/init-functions
DISTRO=$(lsb_release -is 2>/dev/null || echo Debian)

case “$1” in
start)
log_daemon_msg “Starting domain name service…” “bind”

modprobe capability >/dev/null 2>&1 || true

# dirs under /var/run can go away on reboots.
mkdir -p /var/bind/chroot/var/run/bind/run
chmod 775 /var/bind/chroot/var/run/bind/run
chown root:bind /var/bind/chroot/var/run/bind/run >/dev/null 2>&1 || true

if [ ! -x /usr/sbin/named ]; then
log_action_msg “named binary missing – not starting”
log_end_msg 1
exit 1
fi
if start-stop-daemon –start –quiet –exec /usr/sbin/named \
–pidfile /var/bind/chroot/var/run/bind/run/named.pid — $OPTIONS; then
if [ “X$RESOLVCONF” != “Xno” ] && [ -x /sbin/resolvconf ] ; then
echo “nameserver 127.0.0.1” | /sbin/resolvconf -a lo.named
fi
log_end_msg 0
else
log_end_msg 1
fi
;;

stop)
log_daemon_msg “Stopping domain name service…” “bind”
if [ “X$RESOLVCONF” != “Xno” ] && [ -x /sbin/resolvconf ] ; then
/sbin/resolvconf -d lo.named
fi
killall named
log_end_msg $?
;;

restart)
$0 stop
sleep 2
$0 start
;;

*)
log_action_msg “Usage: /etc/init.d/bind9 {start|stop|restart|force-reload}”
exit 1
;;
esac

exit 0


2)chroot 用ディレクトリ作成
# mkdir -p /var/bind
# mkdir -p /var/bind/chroot
# mkdir -p /var/bind/chroot/dev
# mkdir -p /var/bind/chroot/etc
# mkdir -p /var/bind/chroot/etc/bind
# mkdir -p /var/bind/chroot/var
# mkdir -p /var/bind/chroot/var/run
# mkdir -p /var/bind/chroot/var/run/bind
# mkdir -p /var/bind/chroot/var/log
# mkdir -p /var/bind/chroot/var/cache
# mkdir -p /var/bind/chroot/var/cache/bind

3)BINDの設定ファイルの移動
# mv /etc/bind/* /var/bind/chroot/etc/bind/

4)ファイルリンクを作る
# ln -s /var/bind/chroot/etc/bind /etc/bind

5)スペシャルファイル作成
# mknod /var/bind/chroot/dev/null c 1 3
# mknod /var/bind/chroot/dev/random c 1 8

6)権限とパーミッション
# chmod 666 /var/bind/chroot/dev/*
# chown -R bind:bind /var/bind/chroot/*

7)syslog の設定
# vi /etc/default/syslogd

SYSLOGD=”-a /var/bind/chroot/var/log

8)syslogd の再起動
# /etc/init.d/sysklogd restart


3.実行してうまく動くか検証する

# /etc/init.d/bind9 start

# ps -ef
省略
bind 5335 1 1 06:38 ? 00:00:00 /usr/sbin/named -u bind -t /var/bind/chroot
省略

プロセスがこのようになっていれば、OK!
以上

コメント