jailはファイルシステムやプロセスの隔離を行う、一種の仮想OS環境です。ここではFreeBSD 6系列を対象としています。
まずはjailのために各種コマンドやファイル群を用意します。
# setenv JD /here/is/jail # mkdir -p $JD # cd /usr/src # make -j4 buildworld # make installworld DESTDIR=$JD # cd /usr/src/etc # make distribution DESTDIR=$JD # mount_devfs devfs $JD/dev
jail 環境の初期設定を行います。上に引き続き、chroot 環境下で作業を行います。
# touch /etc/fstab
rpcbind_enable="NO"
network_interfaces=""
sshd_enable="YES" sshd_flags="-4"
syslogd_flags="-ss"
*.err;kern.debug;auth.notice;mail.crit /dev/console
# newaliases
# touch /etc/wall_cmos_clock # chmod 444 /etc/wall_cmos_clock # ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# passwd root
# adduser
1,31 0-5 * * * root adjkerntz -a
初期設定が終了したらシェルを終了させ、chroot 環境から抜けます。
それぞれのjail環境内でportsツリーを用意し、最新の状態に保つのはリソースの無駄ですので、親環境のportsツリーをjail環境内でも使用できるようにします。
まず、jail環境内にportsディレクトリーを作成します。
# mkdir $JD/usr/ports
次に、作成したディレクトリーに親環境の /usr/ports 以下を読み込み専用で、マウントします。
# mount_nullfs -o ro /usr/ports $JD/usr/ports
親環境の起動時にマウントされるように、/etc/fstab に以下の内容を書き加えます。
/usr/ports /here/is/jail/usr/ports nullfs ro 0 0
読み込み専用でマウントしていますので、このままではjail環境内でpackageを作成するのに不都合が生じます。
そこで、jail環境内の /etc/make.conf 内に以下の内容を書き加えます。
WRKDIRPREFIX=/var/tmp DISTDIR=/var/tmp/usr/ports/distfiles
jail 環境に割り当てる IP アドレスを、実空間で仮想インターフェイスとして起動します。
# ifconfig em0 inet alias 192.168.1.100/32
上記の処理を OS の起動時に自動で行わせるために、実空間の /etc/rc.conf に以下の内容を追記します。
ifconfig_em0_alias0="inet 192.168.1.100 netmask 255.255.255.255"
jail環境を起動します。
# jail /here/is/jail/ jail_host 192.168.1.100 /bin/sh /etc/rc
OS 起動とともに jail 環境を有効とするために以下の内容を実空間の /etc/rc.conf に追記します。
jail_enable="YES" # Set to NO to disable starting of any jails jail_list="jail1" # Space separated list of names of jails jail_set_hostname_allow="NO" # Allow root user in a jail # to change its hostname jail_socket_unixiproute_only="YES" # Route only TCP/IP within a jail jail_sysvipc_allow="NO" # Allow SystemV IPC use from within a jail jail_stop_jailer="NO" # Only stop jailer. Requires jail_*_exec be set # to use sysutils/jailer port to start the jail. # jail_host in jail jail_jail1_rootdir="/here/is/jail" # Jail's root directory jail_jail1_hostname="jail_host" # Jail's hostname jail_jail1_ip="192.168.1.100" # Jail's IP number jail_jail1_exec="/bin/sh /etc/rc" # command to execute in jail jail_jail1_devfs_enable="YES" # mount devfs in the jail jail_jail1_fdescfs_enable="NO" # mount fdescfs in the jail jail_jail1_procfs_enable="YES" # mount procfs in jail jail_jail1_devfs_ruleset="123" # devfs ruleset to apply to jail
セキュリティアドバイザリへの対処を行うために、システムの再構築が必要な場合があります。また、OS のアップデート行う際にもシステムの再構築を行わなければなりません。
この場合、jail 環境の再構築も行う必要があります。 jail 環境の再構築は以下の手順で行います。
まず jail 環境を止めます。
# jls JID IP Address Hostname Path 1 192.168.1.100 jail_host /here/is/jail # killall -j 1
その後、 jail 環境の再構築を行います。
# setenv JD /here/is/jail # cd /usr/src # make -j4 buildworld # mergemaster -p -D $JD # make installworld DESTDIR=$JD # mergemaster -i -C -D $JD
まず jail 環境を止めます。
# jls JID IP Address Hostname Path 1 192.168.1.100 jail_host /here/is/jail # killall -j 1
FreeBSD Jail Software and Docs http://memberwebs.com/nielsen/freebsd/jails/