[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

【廃】 sysjail: NetBSD で jail 環境を作る(systrace + sysjail)

Caution

sysjail は不明瞭な理由により 2007 年末に NetBSD から削除され、それきりです (なげっぱなしって…あなた。 「もう保守されていないソフトウエアなので削除する」なら分かりますが、 デザイン上の問題があるから…とだけで、後継機能も用意せずに削除して それきり投げっぱなしは問題ありすぎだろ、プロジェクト管理として。 「systrace(2)なんて誰が使ってるんだ?削除」とか言ってるし、 あいかわらず OpenBSD と仲が悪いとか、そういうあれが根っこですかねぇ。 まったく、もう)。 一応、似たようなものを実装して提供する(かも)と言ってはいますが、 あいかわらずの放置プレー状態のようです。 よって以下のテクニックは、 NetBSD 2.0 〜 4.0.1 (2002 〜 2007)でしか利用できません。

とほほ…

chroot(2) に逆戻りか、 Xen 使えって言いたい雰囲気を感じますが、 仮想環境だと「+sysctl(2)の制限」の部分が抜けて違うから話になるんだがなぁ。

NetBSD で制限された環境、いわゆる jail 環境をエミュレートすることを考 えます。 jail 環境とは、仮想 OS を走らせるのではなく、 「(サーバにとっての) OS 必須機能だけが使える環境でサーバ(e.g. WWW サー バ)を走らせる」ための環境のことです。

このシステムの二つの柱は systrace(2) と chroot(2) です。 systrace とはシステムコールの利用方法へ制限を加える仕組みです。 システムコールのポリシーを設定するとも言えます。

例によって、systrace の仕組み自体は大変汎用的で良いのですが、 手軽に実行するためのコマンドがありません。 しかしながら自力で一つ一つ設定していくのは、かなり大変です。

そこで sysjail という systrace(2) と chroot(2) を使って FreeBSD でいうところの jail 環境を作る手軽なツールが作られました。 GJ !

ただし、カーネルが systrace をサポートしていないといけないので、NetBSD 2.0 以降でないと対応していません。また、pkgsrc (しかも pkgsrc ではなく、 まだ pkgsrc-wip 版にしかない)が sysjail 本家に追従していっていないので、 現状 sysjail をコンパイルするには 2.0 でも 4.0 でも手で少しいじくらな いといけません。 直さないといけないねぇ(直して send-pr しないといけないよなぁ)

sysjail のインストール

/usr/pkgsrc/wip/sysjail つまり pkgsrc-wip にある sysjail 1.0.4 を インストールします。

現在、sysjail 本家は 1.2.27 とかのはずですが、pkgsrc-wip は未だ 1.0.4 のままです。pkgsrc-wip の TODO には update すべしと書いてあるけど、だ れもやってない。しかも 1.0.4 のソースが既に消されていて 1.0.4 を fetch すらできないという状況です。

しょうがないので、以下、できたという仮定の元で話を進めます。 じゃ、ひどいか。 ftp://ftp.fml.org/pub/pkgsrc/distfiles/ に置いておきますね。手動で ftp して /usr/pkgsrc/distfiles/ に置いて下さい。

なお pf (OpenBSD package filter) がないバージョンでは駄目とか、 /usr/src/sys/sys/systrace.h が /usr/include/sys にないと駄目とか、いろ いろ食い違いがあって、素直にコンパイルできるのは、どのバージョンなのか は、よく分かりません。まぁ、てきとうに hack してすすみましょう。

/usr/pkg 以下には、次のものがインストールされます。

/usr/pkg/bin/mksysjail-base
/usr/pkg/bin/mksysjail-dev
/usr/pkg/include/sysjail/sysjail.h
/usr/pkg/lib/libsysjail.a
/usr/pkg/man/man3/sysjail.3
/usr/pkg/man/man8/mksysjail-base.8
/usr/pkg/man/man8/mksysjail-dev.8
/usr/pkg/man/man8/sjls.8
/usr/pkg/man/man8/sysjail-cmd.8
/usr/pkg/man/man8/sysjail.8
/usr/pkg/sbin/sjls
/usr/pkg/sbin/sysjail
/usr/pkg/sbin/sysjail-cmd

本体側のセットアップ(1): jail の OS 環境を用意する。

以下、元の OS を本体と呼び、本体の上で動かす sysjail プログラムがエミュ レートしている環境を jail と呼びます。 また jail の / は本体側の /project/sysjail としましょう。

まずは jail に最低限の OS としての環境を用意しないといけません。単に必 要なものだけをコピーしても駄目です。シェアードライブラリやデバイスファ イルがないといけないから。

さて /usr/INSTALL に NetBSD のインストール用バイナリ(e.g. base.tgz )が あるとします(ftp サーバを指定することもできます)。

OS の基本的な部分 base etc man を jail 以下にインストールします。

例: /usr/INSTALL にバイナリを用意している場合

# mksysjail-base /usr/INSTALL /project/sysjail

例: ftp://ftp.netbsd.org/ から直接インストールする場合

# mksysjail-base -s ftp.netbsd.org \
	/pub/NetBSD/NetBSD-`uname -r`/`uname -m`/binary/sets/ \
	/project/sysjail

次に /dev/ 以下が何もないので、最低限のものだけ作成します。

# mksysjail-dev -c /project/sysjail base
# mksysjail-dev -n /project/sysjail ssh
# mksysjail-dev -n /project/sysjail http
# mksysjail-dev -n /project/sysjail https
-c は /dev 以下をクリア、-n は /dev 以下のクリアをせずに追加していく オプションです。 mem とか kmem とか不要なものは作りません。アプリケーションで必要なもの があれば、そのつど手で MAKEDEV を実行する必要があります。

本体側のセットアップ(2): jail の OS 環境を用意する。

jail は仮想 IP アドレスを使います。 本体側で jail のために仮想 IP アドレスと FQDN を用意してください( 適宜 DNS の設定もしてね)。

ここで /etc/ usr/pkg/etc の下を見直しておく必要があります。listen all とかしているプログラムをそのままにしておくと、なにかのはずみ(restart とかした時)に jail 環境から本体側のアプリケーションが直接見えてしまっ て台無しです。そうならないようにしないといけません。

jail 側のセットアップ

これは、普通の OS のセットアップと変わりません。 /etc/ 以下を編集し、必要最小限のものだけ有効にしましょう。

[/etc/myname]

jail.example.org	

[/etc/mygate]

192.168.0.1

[/etc/resolv.conf]

search example.org
nameserver 192.168.0.2

[/etc/rc.conf]
wscons=no
postfix=no
inetd=no
flushroutes=no
cron=no
syslogd=no
sshd=yes
root パスワードをつける、 ssh で入る際のユーザの作成なども必要です。

jail には、C コンパイラなどがインストールされていません。 必要なら手動で広げる必要があります。

しかしながらコンパイラなどは pkgsrc のコンパイルをするためでしょうから、 他のマシンで pkgsrc のバイナリを作って /usr/sbin/pkg_add (これはベース にあるのでインストールされている)で /usr/pkg 以下へインストールするほ うがよいでしょう。

jail 環境でプログラムを起動する。

本体側から sysjail 環境の「コマンド」を実行するには次のようにします。

# sysjail /project/sysjail jail.example.org 192.168.0.253 コマンド

例: jail のシェル(/bin/sh)を取る(login)
# sysjail /project/sysjail jail.example.org 192.168.0.253 /bin/sh

OS のブートシークセンスを真似して rc.conf に従って全体を起動するなら

# sysjail /project/sysjail jail.example.org 192.168.0.253 /etc/rc < /dev/null &
& に注意。 sysjail プロセスは走らせ続けることに注意してください。

自動で行なうには /etc/rc.local で

nohup /usr/pkg/sbin/sysjail /project/sysjail jail.example.org 192.168.0.253 \
	/etc/rc < /dev/null &
を実行するなどとすれば良いでしょう。 もちろん /etc/rc.d/sysjail とか作っても良いですが & を忘れないよう に気をつけましょう。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >