Kozupon.com    
 
 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!
以上

 


 
 
 



Copyright 2008 Kozupon.com.