JAIL(2)

名称
jail, jail_attach - 現在のプロセスとその将来の子孫を閉じ込める

ライブラリ
libc

書式
<sys/param.h> <sys/jail.h> int jail(struct jail *jail) int jail_attach(int jid)

解説
jail() システムコールは牢屋をつくり、現在のプロセスをその中に閉じ込めます。

引数は牢屋を記述する構造体へのポインタです。

    struct jail {
    	u_int32_t	version;
            char 		*path;
            char 		*hostname;
            u_int32_t	ip_number;
    };

“version” には使用する API のバージョンを定義します。 今のところ 0 に設定します。

“path” ポインタには牢屋のルートになるディレクトリを設定します。

“hostname” ポインタには牢屋のホスト名を設定します。 これは牢屋の中から変更できます。

“ip_number” は牢屋に割り当てる IP 番号を設定します。

jail_attach() システムコールは、 jid によって識別される既存の jail を現在のプロセスにアタッチします。

戻り値
成功の場合には、 jail() は jail 識別子 (JID) と呼ばれる負ではない整数を返します。 失敗の場合には -1 を返し、そのエラーを示すために errno を設定します。

牢屋?
プロセスは一度牢屋に入れられると、それ自身とその子孫は牢屋から 逃れることはできません。

牢屋の中では “スーパユーザ” の概念はとても弱まっています。 一般に全体が牢屋の中にあるわけではないものを牢屋の中から台無しにすることは できないと考えられます。 例えば “path” の下のディレクトリツリーは “rm -rf /*” も含めて、root が普通にできるように操作できますが、 デバイス型特殊ノードは共有されたリソース (カーネルの中のデバイスドライバ) を 参照するので、新しく作ることはできません。 プロセスにとっての実際の “セキュアレベル” は、グローバルな “セキュアレベル” と、jail 毎の “セキュアレベル” (存在する場合) の大きい方です。

IP 活動はすべて指定された IP 番号に制限されます。 指定された IP 番号はネットワークインタフェースのうちの 1 つの別名で あるべきです。

“/proc/<pid>/status” を調べることで閉じ込められたプロセスを識別することができます。 行末のフィールドが、閉じ込められていないプロセスではハイフン 1 つ、 閉じ込められたプロセスでは現在牢屋に設定されているホスト名になります。

エラー
jail() システムコールは次の場合に失敗します:

[EINVAL]
    引数のバージョン番号が正しくありません。

さらに jail() は内部で chroot(2) を呼ぶので、全く同じ理由で失敗する可能性があります。 詳しくは chroot(2) のマニュアルページを参照して下さい。

関連項目
chdir(2), chroot(2)

歴史
jail() システムコールは FreeBSD 4.0 で登場しました。 jail_attach() システムコールは FreeBSD 5.1 で登場しました。

作者
jail の機能は Poul-Henning Kamp によって R&D Associates “http://www.rndassociates.com/” のために書かれ、 FreeBSD に寄贈されました。