home FreeBSD Bike Misc Memorandum About

jail環境の構築

注FreeBSD4.5-Release時点の記述です。5.0以上では当てはまらない項目もある可能性が大きいです。

jail環境の構築

 基本的にman jailの通りです。jail環境を構築するディレクトリを決めます。私は/usr/jail以下にjail環境を構築しています。mail,www,proxy,cvsupの4つのjail環境を構築しています。

bell@leon> ls /usr/jail
cvsup/ mail/ proxy/ www/
bell@leon> ls /usr/jail/cvsup/
COPYRIGHT etc/ modules/ sys@
bin/ home@ proc/ tmp/
boot/ kernel@ root/ usr/
dev/ mnt/ sbin/ var/
bell@leon>

こんな風に/usr/jail/*/以下に普通の環境が構築されている雰囲気になります。man jailの通りに構築していきましょう。なお、/usr/src以下にソースが展開されていることが必要です。展開されていない人は/stand/sysinstallからでもよいからソースを展開させておいてください。

ここでは/usr/jail/cvsup以下にjail環境を作ってみたいと思います。

bell@leon# set D=/usr/jail/cvsup
bell@leon# cd /usr/src
bell@leon# make world DESTDIR=$D
--------------------------------------------------------------
>>> elf make world started on Sun Apr 28 22:34:43 JST 2002
--------------------------------------------------------------
--------------------------------------------------------------
>>> Rebuilding the temporary build tree
--------------------------------------------------------------
---snip!----コンパイルされて/usr/jail/cvsup以下にjail環境が構築されます
bell@leon# cd etc (cd /etcではないので、ご注意を。/usr/src/etcですね)
bell@leon# make distribution DESTDIR=$D -DNO_MAKEDEV
bell@leon# cd $D/dev
bell@leon# sh MAKEDEV jail
bell@leon# cd $D
bell@leon# ln -sf dev/null kernel

注:
5.0-Releaseなどdevfsが有効になっている場合、上記の
bell@leon# sh MAKEDEV jail
ではなく、
mount -t devfs devfs $D/dev
でデバイスを作ります。

以上の手続きを構築するjail環境の数だけ繰り返すのですが、ソースのコンパイルをその都度繰り返していては時間がかかりますので、一度作ったjail環境をtarで固めてこれを展開することにしました。ただ、devだけは心配なのでその都度作り直しました。

bell@leon# cd /usr/jail/cvsup
bell@leon# tar cvzf ../jail.tar.gz .
bell@leon# cd /usr/jail
bell@leon# mkdir www
bell@leon# cd www
bell@leon# tar xvzf ../jail/tar.gz
bell@leon# cd dev
bell@leon# sh MAKEDEV jail
==以下繰り返す==

ホスト(実システム)環境を変更

 さて、jail環境を実行する実際のシステムの環境も少し変更する必要があります。たとえばインターネットスーパーデーモン(inetd)などで起動させているプログラムがどのIPに対してListenするのかを明示的に指定する必要があります。また、ほかにもホストでもjail環境の中でもsendmailなどを動かすことなどは避けたほうがよいようです。この場合ホストではサービスを停止してjail環境内で実行させるほうがよいようです(manより)。

 私はinetdは起動させていません(どのjail環境でも)。そしてSMTPに関してはjail環境でqmailを動かすつもりなのでsendmailはとめました。それからportmapperは動かしてはいけません。つまりnfsは使うことができません。したがって私のホストの/etc/rc.confに以下の記述を追加します。

inetd_enable="NO"
portmap_enable="NO"

なお、inetdを起動する上でListenするIPを明示的に指定する場合は、

inetd_flags="-wW -a ホストのIPアドレス"

を/etc/rc.confに追加します。

 jail環境に与えるIPアドレスをネットワークインターフェースにつけます。私の場合、ホストの内側についているrl1にaliasをつけることにします。

ifconfig rl1 inet alias 192.168.1.4/32

また、起動するときに自動的に設定されるように/etc/rc.dに以下の様に付け加えておきます。

ifconfig_rl1_alias0="inet 192.168.1.2 netmask 255.255.255.255 broadcast 192.168.1.255"
ifconfig_rl1_alias1="inet 192.168.1.3 netmask 255.255.255.255 broadcast 192.168.1.255"
ifconfig_rl1_alias2="inet 192.168.1.4 netmask 255.255.255.255 broadcast 192.168.1.255"
ifconfig_rl1_alias3="inet 192.168.1.5 netmask 255.255.255.255 broadcast 192.168.1.255"

 ホストのカーネルをnfsを利用しないように再構築しておくのもいいでしょう。

jail環境の起動と設定

 さて、ここまで来たら(再起動などしておいたほうがいいでしょう。)いよいよjail環境の起動です。ここでは/usr/jail/cvsup以下のjail環境をFQDN:cvsup.f-bell.net、IP:192.168.1.4として起動してみます。jailコマンドは、

jail jail環境のディレクトリ ホスト名 使用するIPアドレス はじめに起動するプログラム

です。初めてjailを起動するときは設定をする必要がありますので、初めに起動するプログラムは/bin/shとします。したがって、

jail /usr/jail/cvsup cvsup.f-bell.net 192.168.1.4 /bin/sh

として実行すると、シェルプロンプトでとまります。これは起動したjail環境内でshが待っている状態です。この後、manに従ってjail環境内のいくつかの設定を済ませます。

o 空の /etc/fstab を作成し、空の fstab に関する起動警告を解消します。
o ポートマッパを無効化します (/etc/rc.conf: portmap_enable="NO") 。
o newaliases(1) を実行し、 sendmail(8) の警告を解消します。
o インタフェース設定を無効化し、ifconfig 関連の起動警告を解消します (network_interfaces="") 。
o /etc/resolv.conf を設定し、jail 内の名前解決が正しく動作するようにします。
o root のパスワードを設定します。実ホストシステムとは異なっても良いです。
o タイムゾーンを設定します。
o jail 環境内のユーザにユーザアカウントを追加します。
o jail 環境に必要なパッケージを追加します。

exitでシェルから抜けるとjailから抜けます。

jailの本格的な起動

procfsをマウントします。

mount -t procfs proc /data/jail/cvsup/proc

jailを起動します。

jail /usr/jail/cvsup cvsup.f-bell.net 192.168.1.4 /bin/sh /etc/rc

いくつかのエラーが表示されますが問題ないと思います。ホスト環境のシェルプロンプトに戻ります。jail環境にログインしてみましょう。

bell@leon> ssh cvsup
The authenticity of host 'cvsup.f-bell.net (192.168.1.4)' can't be established.
RSA1 key fingerprint is hogeehogehogehoge
Are you sure you want to continue connecting (yes/no)? yes
bell@cvsup.f-bell.net's password:
Last login: Mon Apr 29 11:53:17 2002 from hicky.f-bell.net
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 4.5-RELEASE (LEON) #13: Sun Apr 28 10:29:02 JST 2002
bell@cvsup>

ぱちぱちぱちぱち。jail環境で動いているサーバにログインできました。

あとはホスト環境がリブートしたときに自動的にjail環境が起動できるようにしてみましょう。私はこのようなjail.shを/usr/local/etc/rc.dにおき、実行権限を与えた上で、/etc/rc.confに以下の記述を付け加えて、ホストがリブートしたときにjail環境が自動的にスタートするようにしています。

jail_hosts0="/usr/jail/mail mail.f-bell.net 192.168.1.2 /bin/sh /etc/rc"
jail_hosts1="/usr/jail/www www.f-bell.net 192.168.1.3 /bin/sh /etc/rc"
jail_hosts2="/usr/jail/cvsup cvsup.f-bell.net 192.168.1.4 /bin/sh /etc/rc"
jail_hosts3="/usr/jail/proxy proxy.f-bell.net 192.168.1.5 /bin/sh /etc/rc"

あとは頑張ってそれぞれのサーバを構築していきましょう。

説明

FreeBSD4.5-Release

ここではFreeBSDの独自実装であるjail環境を構築します。chrootはファイルシステムを閉じ込めますが、jailではプロセスも閉じ込めることができます。このため稼動しているFreeBSDBoxで仮想的に複数のFreeBSDのサーバを立ち上げることができます。IPアドレスも割り当てられるので、物理的にサーバを立てられない場合などにサービスを分けたjail環境を数個稼動させてセキュリティを向上させることができます。

なお、現状でFreeBSDに実装されているjail環境にはIPv4のアドレス割り当てしかできません。jailNG(New Generationかな?)というのが開発されているようなので、そちらに期待しています。

注意:devf(5-Releaseなど)sの場合は本文中に注を入れてあります。

2003/03/22

Creative Commons License
This work is licensed under a Creative Commons License.