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