unionfs jail

unionfsを用いるjailの作り方。
俺はportsを試したり弄ったりする場合に使用してる。

特徴

  • jail内でファイル変更が可能。
  • ディスク使用量はthin jailより大きいが、fat jailより小さい。
  • ホストの更新のみで、(不完全ではあるが)jailも更新される。

手順

exp.my.domain (192.168.0.102)を/home/jail/expに作る場合。
なお、以下の手順には書いてないが、/etc/rc.d/jail start expする前に$J/etc/以下の設定も行う。

set J = /home/jail/exp
set N = /home/jail/null
mkdir -p $J $N
chmod -w $N
chflags schg $N

mkdir $J/{,bin,lib,libexec,sbin,usr}
vi /etc/fstab
mount $J/bin
mount $J/lib
mount $J/libexec
mount $J/sbin
mount $J/usr
mount $J/usr/src
mount $J/usr/obj
mount $J/usr/ports
cd /usr/src
make -k hierarchy DESTDIR=$J
cd /usr/src/etc
make -k distribution DESTDIR=$J -DNO_MAKEDEV_RUN

vi /etc/rc.conf
/etc/rc.d/jail start exp
jexec `jls | awk '/exp/{print $1}'` /bin/csh

設定例

必要に応じて設定する。
以下は俺の設定。

/etc/fstab
/bin		/home/jail/exp/bin	unionfs	rw,below,noatime 0 0
/lib		/home/jail/exp/lib	unionfs	rw,below,noatime 0 0
/libexec	/home/jail/exp/libexec	unionfs	rw,below,noatime 0 0
/sbin		/home/jail/exp/sbin	unionfs	rw,below,noatime 0 0
/usr		/home/jail/exp/usr	unionfs	rw,below,noatime 0 0
/usr/ports	/home/jail/exp/usr/ports unionfs rw,below,noatime 0 0
/home/jail/null	/home/jail/exp/usr/src	unionfs	rw,below,noatime 0 0
/home/jail/null	/home/jail/exp/usr/obj	unionfs	rw,below,noatime 0 0
/etc/rc.conf
jail_enable="YES"
jail_list="exp"

jail_exp_rootdir="/home/jail/exp"
jail_exp_hostname="exp.my.domain"
jail_exp_ip="192.168.0.102"
jail_exp_interface="re0"
jail_exp_devfs_enable="YES"
jail_exp_devfs_ruleset="devfsrules_jail"
$J/etc/rc.conf
hostname="exp.my.domain"

# Sendmail
sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="YES"

syslogd_flags="-ss"
cron_flags="-J 60"
$J/etc/pw.conf
minuid  20000
maxuid  29999
mingid  20000
maxgid  29999
$J/etc/crontab

以下の行をコメントアウトする。

1,31	0-5	*	*	*	root	adjkerntz -a
$J/etc/periodic.conf
daily_show_success="NO"
daily_status_disks_enable="NO"
daily_status_network_enable="NO"
daily_status_security_chksetuid_enable="NO"
daily_status_security_chkmounts_enable="NO"
daily_status_security_chkuid0_enable="NO"
daily_status_security_passwdless_enable="NO"
daily_status_security_logincheck_enable="NO"
daily_status_security_ipfwdenied_enable="NO"
daily_status_security_ipfdenied_enable="NO"
daily_status_security_pfdenied_enable="NO"
daily_status_security_ipfwlimit_enable="NO"
daily_status_security_ipf6denied_enable="NO"
daily_status_security_kernelmsg_enable="NO"
daily_status_security_loginfail_enable="NO"
daily_status_security_tcpwrap_enable="NO"
weekly_show_success="NO"
weekly_locate_enable="NO"
monthly_show_success="NO"
その他

以下のファイルも適宜変更する。

$J/etc/hosts
$J/etc/resolv.conf
$J/usr/local/etc/

sshd

  • ユーザ限定
  • ポート変更
  • 公開鍵認証のみ
$J/etc/rc.conf
# SSH
sshd_enable="YES"
sshd_flags="-4p 222"
$J/etc/ssh/sshd_config
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM no
X11UseLocalhost no
UseDNS no
AllowUsers exp

シンボリックリンク

ホスト側のシンボリックリンクをjail内で参照すると、$J/以下の場所になるので注意。
/usr/local/lib/python2.6/sitecustomize.pyをシンボリックリンクにしていたので、これに嵌った。