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 しないといけないよなぁ)
/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
以下、元の 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 を実行する必要があります。
jail は仮想 IP アドレスを使います。 本体側で jail のために仮想 IP アドレスと FQDN を用意してください( 適宜 DNS の設定もしてね)。
ここで /etc/ usr/pkg/etc の下を見直しておく必要があります。listen all とかしているプログラムをそのままにしておくと、なにかのはずみ(restart とかした時)に 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=yesroot パスワードをつける、 ssh で入る際のユーザの作成なども必要です。
jail には、C コンパイラなどがインストールされていません。 必要なら手動で広げる必要があります。
しかしながらコンパイラなどは pkgsrc のコンパイルをするためでしょうから、 他のマシンで pkgsrc のバイナリを作って /usr/sbin/pkg_add (これはベース にあるのでインストールされている)で /usr/pkg 以下へインストールするほ うがよいでしょう。
本体側から 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 とか作っても良いですが & を忘れないよう に気をつけましょう。
Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >