JAIL(2) FreeBSD システムコールマニュアル JAIL(2)
名称
jail, jail_attach − 現在のプロセスとその将来の子孫を閉じ込める |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/param.h> int |
jail(struct jail *jail); int |
jail_attach(int jid); |
解説 |
jail() システムコールは牢屋をつくり、現在のプロセスをその中に閉じ込めま す。 引数は牢屋を記述する構造体へのポインタです。 struct jail { |
version; |
|||||
*path; |
|||||
*hostname; |
|||||
ip_number; |
}; ‘‘version’’ には使用する API のバージョンを定義します。今のところ 0 に設 定します。 ‘‘path’’ ポインタには牢屋のルートになるディレクトリを設定します。 ‘‘hostname’’ ポインタには牢屋のホスト名を設定します。これは牢屋の中から変 更できます。 ‘‘ip_number’’ は牢屋に割り当てる IP 番号を設定します。 jail_attach() システムコールは、 jid によって識別される既存の jail を現在 のプロセスにアタッチします。 |
戻り値
成功の場合には、 jail() は jail 識別子 (JID) と呼ばれる負ではない整数を返 します。失敗の場合には −1 を返し、そのエラーを示すために errno を設定しま す。 関数 jail_attach() は、処理が成功すると値 0 を返します。そうでない場合、 値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。 |
牢屋?
プロセスは一度牢屋に入れられると、それ自身とその子孫は牢屋から逃れること はできません。 牢屋の中では ‘‘スーパユーザ’’ の概念はとても弱まっています。一般に全体が 牢屋の中にあるわけではないものを牢屋の中から台無しにすることはできないと 考えられます。例えば ‘‘path’’ の下のディレクトリツリーは ‘‘rm -rf /*’’ も 含めて、root が普通にできるように操作できますが、デバイス型特殊ノードは共 有されたリソース (カーネルの中のデバイスドライバ) を参照するので、新しく 作ることはできません。プロセスにとっての実際の ‘‘セキュアレベル’’ は、グ ローバルな ‘‘セキュアレベル’’ と、jail 毎の ‘‘セキュアレベル’’ (存在する 場合) の大きい方です。 IP 活動はすべて指定された IP 番号に制限されます。指定された IP 番号はネッ トワークインタフェースのうちの 1 つの別名であるべきです。 ‘‘/proc/<pid>/status’’ を調べることで閉じ込められたプロセスを識別すること ができます。行末のフィールドが、閉じ込められていないプロセスではハイフン 1 つ、閉じ込められたプロセスでは現在牢屋に設定されているホスト名になりま す。 |
エラー
jail() システムコールは次の場合に失敗します: |
[EINVAL]
引数のバージョン番号が正しくありません。 さらに jail() は内部で chroot(2) を呼ぶので、全く同じ理由で失敗する可能性 があります。詳しくは chroot(2) のマニュアルページを参照して下さい。 関連項目 |
歴史
jail() システムコールは FreeBSD 4.0 で登場しました。 jail_attach() システ ムコールは FreeBSD 5.1 で登場しました。 |
作者
jail の機能は Poul-Henning Kamp によって R&D Associates ‘‘http://www.rndassociates.com/’’ のために書かれ、 FreeBSD に寄贈されまし た。 FreeBSD 10.0 April 8, 2003 FreeBSD 10.0 |