labunix's blog

labunixのラボUnix

debian Wheezyにbind9を導入、chroot-bindを設定する。

■debian Wheezyにbind9を導入、chroot-bindを設定する。
 debianでもbind9をchroot環境にしましょう。

■まずは通常のbind9の導入

$ sudo apt-get install -y bind9
$ sudo /etc/init.d/bind9 stop
[ ok ] Stopping domain name service...: bind9.

■権限は3パターンあるが、「root:bind」で統一する。
 後でログを見ながら修正する。

$ ls -l /etc/bind | awk '{print $3,$4}' | sort -u

bind bind
root bind
root root

■ユーザ名はbind。

$ grep "named\|bind" /etc/passwd | awk -F\: '{print $1}'
bind

■chroot環境のディレクトリを作成

$ sudo mkdir -p /var/chroot/bind/{dev,etc,var/cache/bind,var/run/named,usr/lib,var/log}
$ sudo chown -R root:bind /var/chroot/bind

■必須デバイスの確認

$ sudo find /dev -type c -perm -o=rw -exec env LANG=C ls -l {} \; | \
  awk '($5=1 && $6>2 && $6<10) {print $NF}'
/dev/urandom
/dev/random
/dev/full
/dev/zero
/dev/null

■必須デバイス作成スクリプトの準備

$ echo '#!/bin/bash' | tee chrootdev.sh >/dev/null
$ sudo find /dev -type c -perm -o=rw -exec env LANG=C ls -l {} \; | \
  awk '($5=1 && $6>2 && $6<10) {print "mknod -m 666","/var/chroot/bind"$NF,"c",$5,$6";"}' | \
  tee -a chrootdev.sh >/dev/null

$ cat chrootdev.sh
#!/bin/bash
mknod -m 666 /var/chroot/bind/dev/urandom c 1 9;
mknod -m 666 /var/chroot/bind/dev/random c 1 8;
mknod -m 666 /var/chroot/bind/dev/full c 1 7;
mknod -m 666 /var/chroot/bind/dev/zero c 1 5;
mknod -m 666 /var/chroot/bind/dev/null c 1 3;

■chroot環境にデバイスを作成

$ sudo /bin/bash chrootdev.sh
$ ls -l /var/chroot/bind/dev
合計 0
crw-rw-rw- 1 root root 1, 7  518 00:16 full
crw-rw-rw- 1 root root 1, 3  518 00:16 null
crw-rw-rw- 1 root root 1, 8  518 00:16 random
crw-rw-rw- 1 root root 1, 9  518 00:16 urandom
crw-rw-rw- 1 root root 1, 5  518 00:16 zero

■必要なファイルをコピー。
 ※opensslモジュールは一部だけでよいかも知れない。

$ sudo find /usr/lib -type d -name "openssl-*" -exec cp -Rav /var/chroot/bind/usr/lib/ {} \; >/dev/null
$ sudo cp -av /etc/localtime /var/chroot/bind/etc/ >/dev/null
$ sudo cp -Rav /var/cache/bind /var/chroot/bind/var/cache/bind/ >/dev/null

■「/etc/bind」の移動と再リンク。
 ※必ず、bind9は停止していること。

$ sudo mv /etc/bind /var/chroot/bind/etc/
$ sudo ln -s /var/chroot/bind/etc/bind/ /etc/bind

■chrootで起動するよう、initスクリプトを変更

$ sudo sed s%"PIDFILE=.*"%"PIDFILE=/var/chroot/bind/var/run/named/named.pid"% /etc/init.d/bind9 | grep ^PID
PIDFILE=/var/chroot/bind/var/run/named/named.pid

$ sudo sed -i s%"PIDFILE=.*"%"PIDFILE=/var/chroot/bind/var/run/named/named.pid"% /etc/init.d/bind9
$ cat /etc/init.d/bind9 | grep ^PID
PIDFILE=/var/chroot/bind/var/run/named/named.pid

■chrootで起動するよう、デーモンの起動オプションを変更

$ sudo grep "^[A-Z]" /etc/default/bind9
RESOLVCONF=no
OPTIONS="-u bind"

$ sudo sed s%"OPTIONS=.*"%"OPTIONS=\"-u bind -t /var/chroot/bind/\""% /etc/default/bind9 | grep ^OPT
OPTIONS="-u bind -t /var/chroot/bind/"

$ sudo sed -i s%"OPTIONS=.*"%"OPTIONS=\"-u bind -t /var/chroot/bind/\""% /etc/default/bind9
$ cat /etc/default/bind9 | grep ^OPT
OPTIONS="-u bind -t /var/chroot/bind/"

■その他

$ sudo touch /var/chroot/bind/var/run/named/named.pid
$ sudo chown root:bind /var/chroot/bind/

■bindの起動。
 「dpkg-reconfigure」するときは、入力の問い合わせが異なっていても、何も変更しない。

$ sudo dpkg-reconfigure bind9
#
[ ok ] Starting domain name service...: bind9.

$ sudo /etc/init.d/bind9 restart
[....] Stopping domain name service...: bind9waiting for pid 5027 to die
. ok
[ ok ] Starting domain name service...: bind9.

■動作確認

$ ps -ef | grep chroot | grep -v grep | sed s%".*[0-9] /"%"/"%
/usr/sbin/named -u bind -t /var/chroot/bind/

$ dig @127.0.0.1 localhost | grep ^[A-z]
localhost.              604800  IN      A       127.0.0.1
localhost.              604800  IN      NS      localhost.
localhost.              604800  IN      AAAA    ::1

■システムログの設定
 ※rsyslogにログを出力するには/dev/logを使用。
 postfixの設定を参考に。

$ grep -v ^# /etc/rsyslog.d/postfix.conf
$AddUnixListenSocket /var/spool/postfix/dev/log

$ echo '$AddUnixListenSocket /var/chroot/bind/dev/log' | sudo tee /etc/rsyslog.d/chroot-bind.conf
$AddUnixListenSocket /var/chroot/bind/dev/log

■bindのログの設定

$ ls -l /etc/bind
lrwxrwxrwx 1 root root 26  518 00:22 /etc/bind -> /var/chroot/bind/etc/bind/

$ head -12 /etc/bind/named.conf.options
logging {
        channel "default-log" {
        file "/var/log/bind.log" versions 10 size 100k;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
        };

        category default { "default-log"; };
        category lame-servers { null; };
};

■chroot-bind単体でログを出力するにはファイルを作成し、
 bindユーザの権限で書き込めるようにする。

$ sudo touch /var/chroot/bind/var/log/bind.log
$ sudo chown bind:bind /var/chroot/bind/var/log/bind.log
$ sudo tail -5 /var/chroot/bind/var/log/bind.log
18-May-2013 00:45:54.567 general: info: zone 255.in-addr.arpa/IN: loaded serial 1
18-May-2013 00:45:54.568 general: info: zone localhost/IN: loaded serial 2
18-May-2013 00:45:54.568 general: error: managed-keys.bind.jnl: create: permission denied
18-May-2013 00:45:54.568 general: error: managed-keys-zone ./IN: sync_keyzone:dns_journal_open -> unexpected error
18-May-2013 00:45:54.582 general: notice: running

■「permission denied」を修正

$ sudo chown -R bind:bind /var/chroot/bind/var/*
$ sudo named-checkconf && sudo /etc/init.d/bind9 restart