2004-11-30

thin jailの作り方

thin jailとは?

thin jailは俗にミニツリーjailとも呼ばれています。 ミニツリーのjailは最低限のファイルだけを使ってApacheやBINDなど一つのソフトだけが動作するようにjail環境を構築することを指します。単機能の小型サーバーを追加したように運用できます。 フルツリーの場合はmake installworldによって、システムの全てのコマンドをインストールしますが、ミニツリーの場合は必要最小限のディレクトリとコマンドだけをインストールします。 例として「/usr/local/jail2」にwww/apache2が動作するミニツリーを構築する手順を説明します。textproc/expat2も依存関係で必要になります。

ミニツリーの構築

まずミニツリーのディレクトリを作ります。

host# mkdir -p /usr/local/jail2

ディレクトリの作成

そしてBSD.minijail.distというmtreeファイルを作成します。そのファイルを指定してmtreeコマンドを実行してディレクトリを作成します。

host# mtree -deU -f BSD.minijail.dist -p /usr/local/jail2

BSD.minijail.dist

/set type=dir uname=root gname=wheel mode=0755
.
    bin
    ..
    dev
    ..
    etc
    ..
    proc            mode=0555
    ..
    sbin
    ..
    tmp             mode=01777
    ..
    usr
        bin
        ..
        include
        ..
        lib
        ..
        libexec
        ..
        ports
        ..
        sbin
        ..
        local
        ..
    ..
    var
        db
            pkg
            ..
        ..
        log
        ..
        run
        ..
        spool
        ..
        tmp         mode=01777
        ..
    ..
..

最小限のコマンドをインストール

www/apache2の動作に必要なコマンドだけをミニツリーjail環境にインストールします。 ここではManuel Kasper氏の[miniBSD - reducing FreeBSD] (http://neon1.net/misc/minibsd.html)で提供されているmkmini.plというPerlスクリプトを使用します。

host# fetch http://neon1.net/misc/minibsd/mkmini.pl

まずファイルの一覧をmini_apache2.filesとして用意します。bin/[bin/testのように実体が同じで名前だけが違うファイルは、セミコロンで区切って一行にまとめて記述します。

mkmini.plを実行してコマンドをミニツリー環境にインストールします。

host# perl mkmini.pl mini_apache2.files / /usr/local/jail2

mini_apache2.files

/etc/group
/etc/host.conf
/etc/localtime
/etc/master.passwd
/etc/passwd
/etc/resolv.conf
/etc/services
bin/[:bin/test
bin/cat
bin/chmod
bin/cp
bin/csh:/bin/tcsh
bin/echo
bin/link:bin/ln
bin/ls
bin/mkdir
bin/mv
bin/pwd:bin/realpath
bin/rm:bin/unlink
bin/rmdir
bin/sh
sbin/ldconfig
sbin/nologin
usr/bin/awk
usr/bin/bunzip2:usr/bin/bzcat:usr/bin/bzip2
usr/bin/chgrp:usr/sbin/chown
usr/bin/cmp
usr/bin/gunzip:usr/bin/gzcat:usr/bin/gzip
usr/bin/egrep:usr/bin/fgrep:usr/bin/grep
usr/bin/find
usr/bin/sed
usr/bin/tar
usr/bin/true
usr/bin/uname
usr/sbin/mtree
usr/sbin/pw
usr/sbin/pwd_mkdb
usr/share/misc/termcap
usr/libexec/ld-elf.so.1

ライブラリのインストール

ライブラリのコピーは同じWebサイトにあるmklibs.plというPerlスクリプトを使用します。 mklibs.plを実行して、ミニツリーjail環境に必要なライブラリをリストアップしてjail.libsというファイルに出力します。そのファイルを使用して再びmkmini.plを使用してライブラリをインストールします。

host# fetch http://neon1.net/misc/minibsd/mklibs.pl
host# perl mklibs.pl /usr/local/jail2 > jail.libs
host# perl mkmini.pl jail.libs / /usr/local/jail2

/etc以下のファイルを設定する

/etc/hostsにjailで使うホスト名を指定します。

/etc/hosts (jail)

192.168.1.3 localhost
192.168.1.3 jail2.example.jp

アカウント設定

必要最小限のアカウントを/etc/master.passwdに記述します。また/etc/groupも同様に設定します。ホスト環境からコピーしたものを削除することをお勧めします。

記述が出来たらホスト環境のpwd_mkdbコマンドを実行してpasswd,pwd.db,spwd.dbの3つのファイルを作成します.

host# pwd_mkdb -p -d /usr/local/jail2/etc /usr/local/jail2/etc/master.passwd

/etc/master.passwd (jail)

root:*:0:0::0:0:Charlie &:/root:/sbin/nologin
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin

/etc/group (jail)

wheel:*:0:root
daemon:*:1:daemon
kmem:*:2:root
sys:*:3:root
tty:*:4:root
bin:*:7:
man:*:9:
www:*:80:
nogroup:*:65533:
nobody:*:65534:

デバイスファイルの作成

/dev以下にデバイスファイルを作ります。

FreeBSD 4系

host# cp /dev/MAKEDEV /usr/local/jail2/dev/
host# cd /usr/local/jail2/dev
host# sh MAKEDEV jail

FreeBSD 5系

ホスト環境の/etc/rc.confにjail_jail2_devfs_enable="YES"と指定することでjail専用のdevfsをマウントします。

packageの準備

ミニツリー環境にインストールするためにホスト環境でwww/apache2のpackageを作成します。jailではIPv6が使用できないためビルド時にWITHOUT_IPV6を指定します。またhttpsを使用しないのであればWITHOUT_SSLも指定します。 まず依存portsであるconverters/libiconv,textproc/expat2,sysutils/rc_subrを先に作成し、最後にwww/apache2を作成します。 ホスト環境でwww/apache2を使う場合は、フルツリー環境のjailを構築してpackageを構築することをオススメします。

host# cd /usr/ports/converters/libiconv
host# make package
host# cd /usr/ports/textproc/expat2
host# make package
host# cd /usr/ports/sysutils/rc_subr
host# make package
host# cd /usr/ports/www/apache2
host# make -DWITHOUT_IPV6 -DWITHOUT_SSL package

jail環境にpackageでインストール

(この項目は書きかけです)

環境変数PKG_DBDIRを一時的にミニツリーjail環境の/var/db/pkgに設定します。 /usr/ports/packages/All/に作成されたpackageを使って、ミニツリーjail環境にインストールします。

host# setenv PKG_DBDIR /usr/local/jail2/var/db/pkg
host# cd /usr/ports/packages/All

pkg_addコマンドのpオプションでjail環境の/usr/localを指定し、packageをインストールします。

host# pkg_add -p /usr/local/jail2/usr/local rc_subr-1.31.tgz
host# pkg_add -p /usr/local/jail2/usr/local libiconv-1.9.2_1.tgz
host# pkg_add -p /usr/local/jail2/usr/local expat-1.95.8.tgz
host# pkg_add -p /usr/local/jail2/usr/local apache-2.0.52_1.tgz

共有ライブラリの検索パスを設定する

この時点のミニツリーjail環境は/var/run/ld-elf.so.hintsが存在しないため、ソフトがライブラリを見つけられずにエラーが出ます。エラーを解消するためにldconfigコマンドを使用します。

host# chroot /usr/local/jail2 ldconfig /usr/lib /usr/local/lib

/etc/rc起動ファイルを設定する

ミニツリーjail環境でApacheを起動するために/etc/rcにリストのようにコマンドを指定します。ホスト環境で作成してjail環境にコピーして設置します。

/etc/rc (jail)

#!/bin/sh
/usr/local/sbin/httpd -k start

参考リンク

HK Technical Note コンパクトなJail環境の構築

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 19:45 in
WriteBacks
TrackBack ping me at
http://www.otsune.com/bsd/jail/minijail.
Post a comment

writeback message: