JAIL(2)

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

ライブラリ
libc

書式
<sys/types.h> <sys/jail.h> int jail(struct jail *jail)

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

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

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

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

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

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

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

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

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

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

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

エラー
jail() は次の場合に失敗します。

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

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

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

歴史
jail() 関数呼び出しは FreeBSD 4.0 で登場しました。

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