EN JA
JAIL(2)
JAIL(2) FreeBSD System Calls Manual JAIL(2)

名称

jail, jail_get, jail_set, jail_remove, jail_attachシステム jail (刑務所) を作成して、管理する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/param.h>
#include < sys/jail.h>

int
jail( struct jail *jail);

int
jail_attach( int jid);

int
jail_remove( int jid);

#include < sys/uio.h>

int
jail_get( struct iovec *iov, u_int niov, int flags);

int
jail_set( struct iovec *iov, u_int niov, int flags);

解説

jail() システムコールは、jail (刑務所) を設定して、現在のプロセスをその中にに閉じ込めます。

引数は、jail を記述する構造体へのポインタです:

struct jail { 
 uint32_t version; 
 char  *path; 
 char  *hostname; 
 char  *jailname; 
 unsigned int ip4s; 
 unsigned int ip6s; 
 struct in_addr *ip4; 
 struct in6_addr *ip6; 
};

version”は、使用している API のバージョンを定義します。 JAIL_API_VERSION は、現在のバージョンに対して定義されています。

path”ポインタは、jail のルートとなるディレクトリに設定されるべきです。

hostname”ポインタを jail のホスト名に設定することができます。これを jail の内部から変更することができます。

jailname”ポインタは、例えば、管理目的のために jail に割り当てることができるオプションの名前です。

ip4s”と“ ip6s”は、それらのそれぞれのポインタを通して渡される IPv4 と IPv6 アドレスの数値を与えます。

jail に割り当てられる IPv4 と IPv6 アドレスの配列に“ ip4”と“ ip6”ポインタを設定することができるか、または何もなければ、NULL に設定することができます。 IPv4 アドレスは、ネットワークバイト順でなければなりません。

これは、パラメータ path, host.hostname, name, ip4.addrip6.addr があり、 JAIL_ATTACH フラグがある jail_set() システムコール (下記参照) と同等です。

jail_set() システムコールは、新しい jail を作成するか、または既存のものを変更して、オプションで現在のプロセスをそれに閉じ込めます。 jail パラメータは、 niov 要素を含んでいる配列 iov の名前-値の組の配列として渡されます。パラメータ名は、ヌル文字で終了する文字列であり、値は、文字列、整数、または他の任意のデータであるかもしれません。いくつかのパラメータは、ブール値であり、値を持ちませんが (それらの長さは、0 である)、例えば persist または nopersist のような“no”接頭辞のあるなしにかかわらず名前単独で設定されます。設定されないパラメータは、一般的に現在の環境に基づいてデフォルト値が与えられます。

jail には、1 組のコアパラメータがあり、モジュールは、それら自身の jail パラメータを追加することができます。利用可能なパラメータの現在のセットとそれらの形式を、 security.jail.param sysctl MIB エントリを通して検索することができます。注目すべきパラメータは、作成されるか、または変更される jail を識別する jidname と同様に、上記の jail() の説明で述べたものを含んでいます。コア jail パラメータの詳しい情報については、 jail(8) を参照してください。

flags 引数は、次のフラグの 1 つ以上から成ります:

JAIL_CREATE
新しい jail を作成します。 jid または name パラメータが存在しているなら、それらは、既存の jail を参照してはいけません。
JAIL_UPDATE
既存の jail を変更します。 jid または name パラメータの 1 つが存在していなければならなくて、既存の jail を参照しなければなりません。 JAIL_CREATEJAIL_UPDATE の両方が設定されているなら、jail は、まだ存在していないなら作成され、存在しているなら、変更されます。
JAIL_ATTACH
jail を作成するか、または変更することに加えて、 jail_attach() システムコールのように現在のプロセスをそれにアタッチします。
JAIL_DYING
削除されている途中である jail の設定ができます。

jail_get() システムコールは、 iovniov 引数の jail_set() として同じ名前-値リストを使用して、jail パラメータを検索します。リスト中に jid または name のパラメータを含むことによって、それらのいずれかによって、読み込みのための jail を指定することができます。

それらが含まれていますが、検索キーとなることを目的としていなら、それらは、(それぞれ、0 と空文字列に) クリアされるべきです。すべての jail のリストを検索するために特別のパラメータ lastjid を使用することができます。それは、上記の jid があり、渡された値に近い jail を取って来ます。 0 の lastjid を渡すことによって、最初の jail (通常、常に jid 1 ではない) を見つけることができます。

flags 引数は、1 つ以上の次のフラグから成ります:

JAIL_DYING
削除されている途中である jail を取得できます。

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

jail_remove() システムコールは、 jid によって識別された jail を削除します。それは、jail に属しているすべてのプロセスを kill して、その jail のすべての子供を削除します。

戻り値

成功すれば、 jail(), jail_set() と jail_get() は、jail 識別子 (JID) と呼ばれる負でない整数を返します。それらは、失敗すれば、-1 を返し、 errno にエラーを示す値を設定します。


The jail_attach() and jail_remove() functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

jail() システムコールは、次の場合に失敗します:
[ EPERM]
このプロセスは、スーパユーザでないためか、または jail の children.max の制限を超えているからのいずれかのために、jail を作成できません、
[ EFAULT]
jail が、プロセスの割り付けられたアドレス空間の外のアドレスを指している。
[ EINVAL]
引数のバージョン番号が、正しくない。
[ EAGAIN]
空いている JID を見つけることができませんでした。

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

[ EPERM]
このプロセスは、スーパユーザでないためか、または jail の children.max の制限を超えているからのいずれかのために、jail を作成できません、
[ EPERM]
jail パラメータが、現在の環境でなく、制限されていない値に設定されている。
[ EFAULT]
iov またはその中に含まれたアドレスの 1 つが、プロセスに割り付けられたアドレス空間の外のアドレスを指している。
[ ENOENT]
jid または name パラメータによって参照された jail が存在しません、そして、 JAIL_CREATE フラグが設定されていません。
[ ENOENT]
jid によって参照される jail が、プロセスが異なった jail にあるので、プロセスによってアクセス可能ではありません。
[ EEXIST]
jid または name パラメータによって参照された jail が存在し、そして、 JAIL_UPDATE フラグが設定されていません。
[ EINVAL]
供給されたパラメータが間違ったサイズです。
[ EINVAL]
供給されたパラメータが範囲外です。
[ EINVAL]
供給された文字列パラメータがヌル文字で終了していません。
[ EINVAL]
供給されたパラメータ名が知られているパラメータにマッチしていません。
[ EINVAL]
JAIL_CREATE または JAIL_UPDATE フラグの 1 つが設定されていません。
[ ENAMETOOLONG]
供給された文字列パラメータが許されでいるより長い。
[ EAGAIN]
jail ID が残っていません。

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

[ EFAULT]
iov またはその中に含まれたアドレスの 1 つが、プロセスに割り付けられたアドレス空間の外のアドレスを指している。
[ ENOENT]
jid または name パラメータによって参照された jail が存在しません。
[ ENOENT]
jid によって参照される jail が、プロセスが異なった jail にあるので、プロセスによってアクセス可能ではありません。
[ ENOENT]
lastjid パラメータが最も大きな現在の jail ID より大きい。
[ EINVAL]
供給されたパラメータが間違ったサイズです。
[ EINVAL]
供給されたパラメータ名が知られているパラメータにマッチしていません。

jail_attach() と jail_remove() システムコールは、次の場合に失敗します:

[ EPERM]
スーパユーザ以外のユーザが、jail にアタッチするか、または削除しようとしました。
[ EINVAL]
jid によって指定された jail が存在していません。

さらに、 jail(), jail_set() と jail_attach() は、内部的に chroot(2) を呼び出すので、すべて同じ理由で失敗するかもしれません。詳細については、 chroot(2) マニュアルページを調べてください。

関連項目

chdir(2), chroot(2), jail(8)

歴史

jail() システムコールは、 FreeBSD 4.0 で登場しました。 jail_attach() システムコールは、 FreeBSD 5.1 で登場しました。 jail_set(), jail_get() と jail_remove() システムコールは、 FreeBSD 8.0 で登場しました。

作者

jail の機能は、それを FreeBSD に寄贈した Poul-Henning Kamp によって R&D Associates “ http://www.rndassociates.com/”のために書かれました。 James Gritton は、拡張可能な jail パラメータと階層的な jail を追加しました。
February 8, 2012 FreeBSD