2003-09-18 10741歩

λ [FreeBSD] nullfsを用いた jailの構築

/usrと/homeをread-onlyマウントすることで領域をケチる計画。

初期 rc.conf を用意しておく。

network_interfaces=""
local_startup="" # /usr/local/etc/rc.d を実行しないのが重要. jail固有のディレクトリを指定するという手もアリ。
sendmail_enable="NONE"
cron_enable="NO"
inetd_enable="NO"
syslogd_enable="NO" # syslog は必要に応じて
syslogd_flags="-ss"

以下のスクリプト実行するとjail環境ができる。make -k installworld がミソ。あとmake buildworld済みであるという前提なので注意。

#!/bin/sh
J=/var/jail/192.168.1.61
# prepare directories
mkdir -p $J
mkdir -p $J/etc
mkdir -p $J/usr
mkdir -p $J/var/local/pkg
mkdir -p $J/stand
mkdir -p $J/home
(cd $J; ln -s var/local)
# mount by nullfs
mount -t null -r /usr  $J/usr
mount -t null -r /home $J/home
# make world
(cd /usr/src; make -k installworld DESTDIR=$J)
(cd /usr/src/etc; make -k distribution DESTDIR=$J -DNO_MAKEDEV_RUN)
(cd $J/dev; sh MAKEDEV jail)
# configure
(cd $J; ln -sf dev/null kernel)
cp /stand/sysinstall $J/stand
# mergemaster -i -D $J -t $J/var/tmp/temproot
cp /usr/share/zoneinfo/Asia/Tokyo $J/etc/localtime
touch $J/etc/wall_cmos_clock
touch $J/etc/fstab
cp /etc/resolv.conf $J/etc/

こうやって出来たjail環境のHDD消費は20MB弱。/usrは共有なので、ほとんどのパッケージは本体のアップデートに追従する。 例外はqmailぐらいだ。

/homeが不要のサービスだったらマウントしないのも可。

/usrをマウントしないわけにはいかないので、パスワードに類するものを/usr/local/etcに置かない方針が必要。 ぱっと見でやばそうなのは/usr/local/etc/mpd/,/usr/local/etc/snmpd.confあたりか。

あとは、 sudo jail /var/jail/192.168.1.61 www.tenforward.org 192.168.1.61 /bin/sh とjail内でシェルを起動してアカウントの整備等を行う。

自動起動の設定(未完)

本体の /etc/fstab に以下のエントリを追加しておく。

# for jail
/usr    /var/jail/192.168.1.61/usr      null    ro              0       0
/home   /var/jail/192.168.1.61/home     null    ro              0       0

jail /var/jail/192.168.1.61 www.tenforward.org 192.168.1.61 /usr/local/bin/svscan /var/service を更にdaemontoolsの管理下に置くってアリなのかなあ…

TODO: chroot後の / になる部分もnullfsでread-onlyにしたいなあ。 qmailだと/var/qmail/binにバイナリが置かれるのでchflags schgで保護する方がいいか ?

本日のツッコミ(全1件) [ツッコミを入れる]
λ おとうりん (2003-11-26 11:23)

FreeBSD 5.1 p10ですが、jail環境にログイン後にman hogeすると、刺さる。FreeBSDそのものは生きているけど、プロセスが新規に生成できない様子で電源切るしか無い状態。nullfsの代わりにunionfsで/usrをjail環境にマウントした場合はOKだった。

[]