EN JA
JAIL(8)
JAIL(8) FreeBSD System Manager's Manual JAIL(8)

名称

jailシステム jail (刑務所) を管理する

書式

jail [ -dhilqv][ -J jid_file][ -u username][ -U username][ -cmr] param= value ... [ command= command ...]

jail [ -dqv][ -f conf_file][ -p limit][ -cmr][ jail]

jail [ -qv][ -f conf_file][ -rR][ * | jail ...]

jail [ -dhilqv][ -J jid_file][ -u username][ -U username][ -n jailname][ -s securelevel][ path hostname [ ip[ ,...]] command ...]

解説

jail ユーティリティは、新しい jail (刑務所) を作成するか、または既存のjail を修正するか、削除します。 jail は、コマンド行で、または jail.conf(5) ファイルのパラメータによって指定されます。

オプション -c, -m または -r の少なくとも 1 つが指定されなければなりません。これらのオプションは、次を実行する操作を単独、または組み合わされた記述で使用されます:

-c
新しい jail を作成します。 (指定されるなら) コマンド行の jail の jidname パラメータ、またはあらゆる jail は、既存の jail を参照してはなりません。
-m
既存の jail を修正します。 jid または name パラメータのうちの 1 つは、存在し、既存の jail を参照しなければなりません。いくつかのパラメータは、実行している jail で変更されません。
-r
jid または name によって指定された jail を削除します。すべての jail 化されたプロセスは、kill され、この jail のすべての子供も削除されます。
-rc
既存の jail を再起動します。 jail は、最初に削除され、次に、あたかも“ jail -c”と“ jail -r”がセッションで実行されたかのように、再作成されます。
-cm
存在していないなら、jail を作成するか、または存在するなら、jail を変更します。
-mr
既存の jail を修正します。 jail は、パラメータを修正する必要があるなら、再起動され、そうでなければ、変更されることはありません。
-cmr
存在していないなら、jail を作成するか、または存在するなら、 jail を修正します (そして、たぶん再起動されます)。

他の利用可能なオプションは、次の通りです:

-d
allow.dying パラメータと同等の、死んでいる jail に変更を行うことを許可します。
-f conf_file
デフォルトの /etc/jail.conf の代わりに設定ファイル conf_file を使用します。
-h
host.hostname パラメータ (または、 hostname) を解決し、リゾルバによって返されるすべての IP アドレスをこの jail のためのアドレスのリストに追加します。これは、 ip_hostname パラメータと同等です。
-i
新しく作成された (複数の) jail の jail 識別子 (のみ) を出力します。これは、 -q オプションの意味を含みます。
-J jid_file
jail を開始するために使用するパラメータを含んで、 jid_file ファイルを書き込みます。
-l
クリーンな環境でコマンドを実行します。これは、廃止予定で、exec.clean パラメータと同等です。
-n jailname
jail の名前を設定します。これは、廃止予定で、 name パラメータと同等です。
-p limit
同時に実行することができる exec.* からのコマンドの数を制限します。
-q
jail が作成されるか、修正されるか、または削除されるときはいつでも、印刷するメッセージを抑制します。エラーメッセージだけが印刷されます。
-R
設定ファイルを使用せずに、既存の jail を削除する -r オプションの変異形。この jail のための削除関連のパラメータは、使用されません - jail は、単に削除されます。
-s securelevel
kern.securelevel MIB エントリを新たに作成された jail 内の指定された値に設定します。これは、廃止予定で、 securelevel パラメータと同等です。
-u username
jail 化されたコマンドが実行するべきホスト環境のユーザ名。これは、廃止予定で、 exec.jail_userexec.system_jail_user パラメータと同等です。
-U username
jail 化されたコマンドが実行するべき jail 化された環境のユーザ名。これは、廃止予定で、 exec.jail_user パラメータと同等です。
-v
実行しているコマンドとマウントしているファイルシステムのように、すべての操作に関するメッセージを印刷します。

オプションの後に引数が与えられなければ、(削除以外の) 操作は、 jail.conf(5) ファイルで指定されたすべての jail で実行されます。 jail 名の単一の引数は、指定された jail でのみ動作します。また、 -r-R オプションは、name または jid によって指定される jail.conf(5) ファイルにない、実行している jail を削除することができます。

“*”の引数は、それらが jail.conf(5) に現われるかどうかにかかわらず、すべての jail で動作するワイルドカードです。これは、すべての jail を削除する -r のための確実な方法です。階層的な jail が存在するなら、部分的なマッチングのワイルドカード定義を指定することができます。例えば、“foo.*”の引数は、“foo.bar”と“foo.bar.baz”のような名前がある jail に適用します。

jail は、コマンド行で直接パラメータを指定されます。この場合、 jail.conf(5) ファイルは、使用されません。また、後方互換性のために、コマンド行は、名前なしの、次の 4 つの固定のパラメータがあります: path, hostname, ipcommand。このモードは、常に新しい jail を作成し、 -c-m オプションは、適用されません (そして、存在してはなりません)。

jail パラメータ

jail.conf(5) ファイルの、またはコマンド行のパラメータは、一般的に“name=value”形式です。いくつかのパラメータは、ブール値で、値がありませんが、単独の名前によってか、または“no”接頭辞なしで設定されます、例えば、 persist または nopersist。または、それらは、値“true”た“false”を与えることができます。他のパラメータは、設定ファイルで (詳細については、 jail.conf(5) を参照) コンマで区切られたリストまたは“+=”をつけて指定されて、2 つ以上の値があります。

jail ユーティリティは、2 つのクラスのパラメータを認識します。 jail が作成されるとき、 (通常) “ jail -m”で変更することができる、 jls(8) で見ることができる、カーネルに渡される true jail パラメータがあります次に、 jail 自体によってのみ使用される疑似パラメータがあります。

jail は、設定されたコアパラメータがあり、カーネルモジュールは、それら自体の jail パラメータを追加するることができます。利用可能なパラメータの現在のセットを“ sysctl -d security.jail.param”によって検索することができます。設定されないあらゆるパラメータは、現在の環境にしばしば基づいて、デフォルト値を与えられます。コアパラメータは、次の通りです:

jid
jail 識別子。これは、自動的に新しい jail に割り当てられ、(または、明白に設定することができ)、後の変更のため、または jls(8) または jexec(8) のようなコマンドのために jail を識別するために使用することができます。
name
jail 名。これは、 (‘.’を含まないことを除いて) jail を識別する任意の文字列です。 jid のように、後の jail コマンド、または、 jls(8) または jexec(8) にそれを渡すことができます。 name が供給されないなら、デフォルトは、 jid と同じと仮定されます。 name パラメータは、 jail.conf(5) ファイル形式によって暗黙に定義され、設定ファイルを使用するとき、明示的に設定される必要はありません。
path
jail のルートとなるディレクトリ。 jail によって、または、 jexec(8) からのいずれかの、jail の内部で実行されるあらゆるコマンドは、このディレクトリから実行されます。
ip4.addr
jail に割り当てられた IPv4 アドレスのリスト。これが設定されるなら、jail は、これらのアドレスのみを使用するように制限されます。他のアドレスを使用するあらゆる試みは、失敗し、ワイルドカードのアドレスを使用する試みは、代わりに jail 化されたアドレスを黙って使用します。 IPv4 に関して、与えられた最初のアドレスは、より良いマッチを見つけることができない、バインドされていないソケットでソースアドレスの選択の場合にソースアドレスとして使用し続けられます。 jail のいずれにも、それ自体に割り当てられた、この単一のオーバラップする IP アドレスより多くなければ、同じ IP アドレスがある複数の jail のみを開始することはできます。
ip4.saddrsel
以前に述べられた振る舞いを変更し、jail の主要な IPv4 アドレスに賛成して、 jail のための IPv4 ソースアドレスの選択を無効にするブール値のオプション。ソースアドレス選択は、すべての jail に対してデフォルトで有効にされ、親の jail の ip4.nosaddrsel 設定は、あらゆる子供の jail に継承されません。
ip4
IPv4 アドレスの利用可能性を制御します。指定できる値は、すべてのシステムアドレスへの制限されていないなアクセスを許す“inherit、”上記の ip4.addr を通してアドレスを制限する“new”と IPv4 を使用する jail を完全に停止する“disable”です。 ip4.addr パラメータを設定すると、“new”の値の意味も含みます。
ip6.addr, ip6.saddrsel, ip6
上記の ip4.addr, ip4.saddrselip4 に対応する、jail のための 1 組の IPv6 オプション。
vnet
それ自体のネットワークインタフェース、アドレス、ルーティングテーブル (経路表) などと共に、それ自身の仮想ネットワークスタックがある jail を作成します。カーネルは、利用可能とするために、これに対する VIMAGE option でコンパイルされなければなりません。指定できる値は、たぶん制限された IP アドレスがある、システムメットワークスタックを使用する“inherit”と新しいネットワークスタックを作成する“new”です。
host.hostname
jail のホスト名。他の同様のパラメータは、 host.domainname, host.hostuuidhost.hostid です。
host
ホスト名と関連情報の元を設定します。指定できる値は、システム情報を使用する“inherit、”上記のフィールドからの情報を使用する jail のための“new”です。上記のフィールドのいずれかを設定すると、“new”の値の意味も含みます。
securelevel
jail の kern.securelevel sysctl の値。 jail は、デフォルトのシステムより低いセキュルティレベル (securelevel) の状態に決してなりませんが、このパラメータを設定することによって、より高いものとすることができます。システムのセキュルティレベルが変更されるなら、あらゆる jail のセキュルティレベルは、少なくとも同じくらい安全となります。
devfs_ruleset
この jail のマウントされた devfs のために強制される devfs のルールセットの数。 0 の値 (デフォルト) は、ルールセットが強制されないことを意味します。子孫の jail は、親の jail の強制される devfs ルールセットを継承します。 jail の内側で devfs をマウントすることは、 allow.mountallow.mount.devfs のパーミッションが有効で、 enforce_statfs が 2 よりも低い値に設定されている場合にのみ可能です。 devfs のルールとルールセットを、jail の内側から見たり、修正することはできません。

注: devfs の適切なデバイスのみが jail に見えるようになっていることは、重要です。 jail 中でディスクデバイスへのアクセスは、jail の外側のファイルを修正することによって jail のサンドボックス (訳注: セキュリティ上の許可) を通り抜けてるように jail 中のプロセスに許可します。 jail ごとの devfs のエントリへのアクセスを制限するために devfs のルールをどのように使用するかの情報については、 devfs(8) を参照してください。 jail のための単純な devfs ルールセットは、 /etc/defaults/devfs.rules のルールセット #4 として利用可能です。

children.max
この jail によって (またはこの jail の下の他の jail によって) 作成されることを許可される子供の jail の数。この制限は、jail が子供の jail を作成することが許可されないことを示す、デフォルトで 0 です。詳細については、 階層的な jail セクションを参照してください。
children.cur
それ自体の子供の jail とそれらの下で作成されたあらゆる jail を含む、この jail の子孫の数。
enforce_statfs
これは、どの jail の情報プロセスがマウントポイントに関して取得することができるかを決定します。それは、次の syscall の振る舞いに影響します: statfs(2), fstatfs(2), getfsstat(2)fhstatfs(2) (同様の互換性のある syscall と同様に)。 0 に設定されるとき、すべてのマウントポイントは、あらゆる制限なしで利用可能です。 1 に設定されるとき、jail の chroot ディレクトリ下のマウントポイントのみ目に見えます。それに加えて、jail の chroot ディレクトリへのパスは、それらのパス名の前部から削除されます。 2 (デフォルト) に設定されるとき、上記の syscall は、jail の chroot ディレクトリが位置しているマウントポイントでのみ動作することができます。
persist
このブール値のパラメータを設定することによって、jail は、プロセスなしで存在することができます。通常、コマンドは、jail 作成の一部として実行され、次に、jail は、最後のプロセスの終了時に破壊されます。新しい jail には、 persist パラメータか、または exec.start または command 疑似パラメータセットのいずれかがなければなりません。
cpuset.id
cpuset の ID は、この jail (読み込み専用) に関連しています。
dying
これは、jail が、(読み込み専用) のシャットダウン中のプロセスであるなら、真です。
parent
この jail の親の jid または、これが、トップレベル (top-level) の jail (読み込み専用) であるなら、 0 です。
allow.*
jail 環境のいくつかの制限は、jail ごとを基本として設定されます。 allow.set_hostname を除いて、これらのブール値のパラメータは、デフォルトでオフです。
allow.set_hostname
jail のホスト名は、 hostname(1) または sethostname(3) を通して変更されます。
allow.sysvipc
jail 内のプロセスは、System V IPC 基本関数にアクセスできます。現在の jail 実装では、System V 基本関数は、jail 内のプロセスが jail の外側のプロセスと他の jail の内側のプロセスとの通信 (と潜在的に干渉する) できることを意味する、ホストと jail 環境に渡って単一の名前空間を共有します。
allow.raw_sockets
jail の root は、生のソケットを作成することを許可されます。このパラメータを設定することによって、 ping(8)traceroute(8) のようなユーティリティは、jail の内側で動作できます。これが設定されるなら、発信元 IP アドレスは、 IP_HDRINCL フラグが、ソケットで設定されたかどうかにかかわらず、 jail にバインドされた IP アドレスに強制的に従います。様々なネットワークサブシステムを設定して、情報をやりとりするために生のソケットを使用できるので、特権的な jail へのアクセスが信頼されていないパーティに配布されているところで、特別の注意をするべきです。
allow.chflags
通常は、jail の内側の特権ユーザは、 chflags(2) によって特権がないものとして扱われます。このパラメータが設定されるとき、そのようなユーザは、特権があるものとして扱われ、 kern.securelevel で通常の制限に従ってシステムファイルフラグを操作します。
allow.mount
jail の内側の特権ユーザは、jail フレンドリとしてマークされたファイルシステムタイプをマウントして、アンマウントすることができます。 jail の中からマウントのために利用可能なファイルシステムタイプを見つけるために lsvfs(1) コマンドを使用することができます。 enforce_statfs が 2 より小さな値に設定される場合のみ、このパーミッションは、有効です。
allow.mount.devfs
jail の内側の特権ユーザは、devfs ファイルシステムをマウントして、アンマウントすることができます。このパーミッションは、 allow.mount に加えて、 enforce_statfs が 2 より小さな値に設定される場合のみ、有効です。 devfs_ruleset オプションで devfs ルールセットを制限することを考慮してください。
allow.mount.nullfs
jail の内側の特権ユーザは、nullfs ファイルシステムをマウントして、アンマウントすることができます。このパーミッションは、 allow.mount に加えて、 enforce_statfs が 2 より小さな値に設定される場合のみ、有効です。
allow.mount.procfs
jail の内側の特権ユーザは、procfs ファイルシステムをマウントして、アンマウントすることができます。このパーミッションは、 allow.mount に加えて、 enforce_statfs が 2 より小さな値に設定される場合のみ、有効です。
allow.mount.tmpfs
jail の内部の特権ユーザは、tmpfs ファイルシステムをマウントし、アンマウントすることができます。このパーミッションは、 enforce_statfs が 2 よい少ない値に設定されるなら、 allow.mount と一緒のみ有効です。
allow.mount.zfs
jail の内側の特権ユーザは、ZFS ファイルシステムをマウントして、アンマウントすることができます。このパーミッションは、 allow.mount に加えて、 enforce_statfs が 2 より小さな値に設定される場合のみ、有効です。 jail の中から操作する ZFS ファイルシステムを設定する方法に関する情報については、 zfs(8) を参照してください。
allow.quotas
jail の root は、jail の (複数の) ファイルシステムでクォータ (quota) を管理できます。これは、jail が他の jail またはシステムの jail 化されていない部分を共有することができるファイルシステムを含んでいます。
allow.socket_af
通常、jail 中のソケットは、IPv4、IPv6、ローカル (UNIX) とルート (route) に制限されます。これによって jail の機能性をそれらに追加していない他のプロトコルスタックへアクセス可能となります。

カーネルに渡されない疑似パラメータがありますが、jail が作成されるか、または削除されるとき、しばしば指定されたコマンドを実行することによって、 jail 環境をセットアップするために jail によって使用されます。 exec.* コマンドパラメータは、システムまたは jail 環境のいずれかで実行される sh(1) のコマンド行です。それらは、指定されたコマンドを順序どおり実行する、複数の値を与えることができます。すべてのコマンドは、(0 の終了状態を返す) 成功しなければなりません、さもなければ、jail が作成されないか、または削除されません。

疑似パラメータは、次の通りです:

exec.prestart
jail が作成する前に、システム環境で実行する (複数の) コマンド。
exec.start
jail が作成するとき、jail 環境で実行する (複数の) コマンド。実行する代表的なコマンドは、“sh /etc/rc”です。
command
コマンド行で jail を直接指定するとき使用する exec.start の同意語。値が単純な文字列である他のパラメータと異なり、 command は、それ自体の引数として jail コマンド行残りを使用します。
exec.poststart
jail が作成された後、そして任意の exec.start コマンドが完了した後に、システム環境で実行する (複数の) コマンド。
exec.prestop
jail が削除される前にシステム環境で実行する (複数の) コマンド。
exec.stop
jail が削除される前、そして任意の exec.prestop コマンドが完了した後に、jail 環境で実行する (複数の) コマンド。実行する代表的なコマンドは、“sh /etc/rc.shutdown”です。
exec.poststop
jail が削除される後にシステム環境で実行する (複数の) コマンド。
exec.clean
クリーンな環境でコマンドを実行します。環境変数は、 HOME, SHELL, TERMUSER を除いて廃棄されます。 HOMESHELL は、ターゲットのログインのデフォルト値に設定されます。 USER は、ターゲットのログインに設定されます。 TERM は、現在の環境からインポートされます。ターゲットのログインのためのログインクラスケーパビリティデータベースからの環境変数も、設定されます。
exec.jail_user
jail 環境で実行しているとき、コマンドを実行するユーザ。デフォルトは、カレントのユーザとしてコマンドを実行することです。
exec.system_jail_user
このブール値のオプションは、jail のファイルの代わりに、システムの passwd(5) ファイルの exec.jail_user を検索します。
exec.system_user
システム環境で実行しているとき、コマンドを実行するユーザ。デフォルトは、カレントのユーザとしてコマンドを実行することです。
exec.timeout
コマンドが完了するのを待つ時間の最大の時間。コマンドが、この多くの秒が経過した後にまだ実行しているなら、 jail は、作成されないか、または削除されません。
exec.consolelog
コマンドの出力 (stdout と stderr) を向けるファイル。
exec.fib
jail の内側のコマンドを実行するとき、設定する FIB (ルーティングテーブル (経路表))。
stop.timeout
それらに ( exec.stop コマンドが完了した後に起こる) SIGTERM シグナルを送った後に、jail のプロセスが終了するのを待つ時間の最大時間。この多くの秒が経過した後に、あらゆる残っているプロセスを kill して、 jail は、削除されます。これが 0 に設定されているなら、 SIGTERM は、送られず、jail は、直ちに削除されます。デフォルトは、10 秒です。
interface
jail の IP アドレス ( ip4.addrip6.addr) を追加するネットワークインタフェース。 jail が作成される前に各アドレスの別名は、インタフェースに追加され、 jail が削除された後に、インタフェースから削除されます。
ip4.addr
カーネルに渡される IP アドレスに加えて、インタフェースおよび/またはネットマスクも、形式“ interface| ip-address/ netmask”で指定されます。インタフェースが IP アドレスの前に与えられるなら、アドレスのための別名は、それが interface のパラメータがあるように、そのインタフェースに追加されます。ドット付き 4 つ組または CIDR 形式のいずれかで、ネットマスクが IP アドレスの後に与えられるなら、それは、IP の別名を追加するとき、使用されます。
ip6.addr
カーネルに渡される IP アドレスに加えて、インタフェースおよび/または接頭辞も形式“ interface| ip-address/ prefix”で指定されます。
vnet.interface
vnet が有効にされた jail の後に与えるネットワークインタフェースは、作成されます。インタフェースは、jail が削除されるとき、自動的に返されます。
ip_hostname
host.hostname パラメータを解決して、この jail のためのアドレス ( ip4.addr または ip6.addr) のリストにリゾルバ (resolver) よって返されたすべての IP アドレスを追加します。これは、jail の発信 IPv4 接続のためのデフォルトアドレス選択に影響します。各アドレスファミリのためにリゾルバ (resolver) よって最初に返されたアドレスは、プライマリ (primary) アドレスとして使用されます。
mount
単一の fstab(5) 行として与えられる、jail (と、それを削除した後にアンマウントする) を作成する前にマウントするファイルシステム。
mount.fstab
jail を作成する前にマウントするファイルシステムを含んでいる fstab(5) 形式のファイル。
mount.devfs
chroot された /dev ディレクトリに devfs(5) ファイルシステムをマウントし、 jail の内側で目に見えるデバイスを制限するために、 devfs_ruleset パラメータ (またはルールセット 4: devfsrules_jail のデフォルト) のルールセットを適用します。
mount.fdescfs
chroot された /dev/fd ディレクトリに fdescfs(5) ファイルシステムをマウントします。
allow.dying
dying (死んでいる) jail に変更を行うことを可能にします。
depend
この jail が依存する jail (または複数の jail) を指定します。あらゆるそのような jail は、あらゆるアクションが、この jail を作成するために取られる前に、最後の exec.poststart コマンドまで、完全に作成されなければなりません。 jail が削除されるとき、反対 (opposite) は、真です: この jail は、それが依存する (複数の) jail が停止される前に、最後の exec.poststop コマンドまで、完全に削除されなければなりません。

使用例

jail は、2 つの指針のうちの 1 つを使用して、主としてセットアップされます: 特定のアプリケーション (たぶん特権で実行している) を抑制するか、または様々なデーモンとサービスを実行する“仮想システムイメージ”を作成するかのいずれかです。いずれにしても、必要なコマンド行ツール、デーモン、ライブラリ、アプリケーションの設定ファイルなどを提供するために、 FreeBSD のかなり完全なファイルシステムが、要求されます。しかしながら、仮想サーバの設定について、かなりの量の追加の作業が、“boot” (ブート) プロセスを設定するために、要求されます。このマニュアルページは、これらのステップのいずれかをサポートするために必要な設定ステップを文書化していますが、設定ステップは、ローカルな必要条件に基づいて、洗練されます。

jail ディレクトリのツリーのセットアップ

FreeBSD 配布全体を含んでいる jail ディレクトリのツリーをセットアップするために、次の sh(1) コマンドスクリプトを使用することができます:

D=/here/is/the/jail 
cd /usr/src 
mkdir -p $D 
make world DESTDIR=$D 
make distribution DESTDIR=$D

多くの場合に、この例は、jail に必要なものよりはるかに多くのものを入れるでしょう。ほかの極端な場合に、jail は、たった 1 つのファイルを含むかもしれません: jail で実行される実行形式。

“thin” (細い) jail で始まり、それが動作するまで、物事を追加するより、“fat” (太い) jail で始めて、それが動作を停止するまで、物事を削除するほうがより簡単であり、注意深く実験することをお勧めします。

jail のセットアップ

jail ディレクトリのツリーを構築するためには、 jail ディレクトリのツリーのセットアップ に記述されていることを行います。この例のために、“testjail”という名前が付けられた jail のために、 /data/jail/testjail で、それを構築したと仮定します。自分のディレクトリ、IP アドレスとホスト名で必要なように下記を置き換えます。

ホスト環境のセットアップ

最初に、実際のシステムの環境を“jail フレンドリ”にセットアップする必要があります。一貫性のために、“ホスト環境”として親のコンピュータ (box) を言及し、“jail 環境”として jail 化された仮想マシンを言及します。 jail は、IP 別名を使用して実装されるので、最初に行うことの 1 つは、サービスのためのすべてのローカル IP アドレスで listen する (接続を受け付ける) ホストシステムで IP サービスを無効にすることです。ネットワークサービスが特定の IP アドレスでなく、すべての利用可能な IP アドレスをバインド (bind) するホスト環境に存在しているなら、そして、 jail がポートにバインドされていなかったなら、 jail IP アドレスに送信された要求をサービスできます。これは、適切な IP アドレス、その他で単に listen する (接続を受け付ける) ために inetd(8) を変更することを意味します。ホスト環境で /etc/rc.conf に、次を追加します:

sendmail_enable="NO" 
inetd_flags="-wW -a 192.0.2.23" 
rpcbind_enable="NO"

192.0.2.23 は、この例において、ホストシステムのための元の IP アドレスです。指定されたホスト IP アドレスのみを使用するように inetd(8) から実行されるデーモンを、簡単に設定することができます。他のデーモンは、手動で設定される必要があり—いくらかについては、これは、 rc.conf(5) フラグエントリを通して可能です。他のものについては、アプリケーションごとの設定ファイルを修正するか、アプリケーションを再コンパイルすることが必要です。次の頻繁に展開されるサービスは、特定の IP アドレスを listen している (接続を受け付けている) アプリケーションを制限するために修正されたそれらの個別の設定ファイルがなければなりません。

sshd(8) を設定するためには、 /etc/ssh/sshd_config を修正する必要があります。

sendmail(8) を設定するためには、 /etc/mail/sendmail.cf を修正する必要があります。

named(8) に対しては、 /etc/namedb/named.conf を修正する必要があります。

さらに、多くのサービスは、ホスト環境で、それらを実行するために再コンパイルされなければなりません。これは、 rpcbind(8), nfsd(8)mountd(8) のような rpc(3) を使用してサービスを提供するほとんどのアプリケーションを含んでいます。一般的に、バインド (bind) する IP アドレスを指定することができないアプリケーションは、jail IP アドレスにサービス要求も送るべきでないなら、ホスト環境で実行されるべきではありません。ホスト環境で NFS をサービスする試みは、さらに混乱を引き起こすかもしれません、いくつかの NFS サービスがカーネルから直接サービスされるように、特定の IP だけを使用するように簡単に再設定することができません。また、ホスト環境で実行しているあらゆるサードパーティのネットワークソフトウェアは、jail 環境によっても提供されるように思える、それらのサービスの結果となるかもしれない、すべての IP アドレスをバインド (bind) できないように、チェックされ、設定されるべきです。

いったん、これらのデーモンがホスト環境で無効にされ、固定されると、 (例えば、jail にメールを送るとき、その sendmail がダウンし、メールがホストに配信されるなど、がわかるなど) 後で混乱の可能性を縮小するために、すべてのデーモンが既知の状態とできるように、リブートすることが最も良いことです。

jail の設定

利用者がネットワークインタフェースを少し整理して、アカウントをセットアップすることができるように、ネットワークインタフェースを設定せずに、初めて任意の jail を開始します。あらゆるマシン (仮想またはそうでない) と同様に、 root パスワード、タイムゾーンなどを設定する必要があります。これらのステップのうちのいくつかは、jail の内側の完全な仮想サーバを実行するつもりである場合のみあてはまります。他のものは、特定のアプリケーションの抑制のために、または仮想サーバを実行のための両方にあてはまります。

jail でシェルを開始します:

jail -c path=/data/jail/testjail mount.devfs host.hostname=testhostname \ 
 ip4.addr=192.0.2.100 command=/bin/sh

エラーがないと仮定すると、jail 内のシェルプロンプトで終わります。今 /usr/sbin/sysinstall を実行し、様々な設定のオプションを設定するポストインストール設定を行うか、または /etc/rc.conf などを編集することによって、これらのアクションを手動で実行することができます。

  • jail 内の名前解決が正しく動作できるように /etc/resolv.conf を設定します。
  • sendmail(8) の警告を止めるために newaliases(1) を実行します。
  • 実際のホストシステムと異なるかもしれない、root のパスワードを設定します。
  • タイムゾーンを設定します。
  • jail 環境のユーザのためのアカウントを追加します。
  • 環境が要求するあらゆるパッケージをインストールします。

また、あらゆるパッケージに特有の設定 (ウェブサーバ、SSH サーバなど)、を実行する必要があり、必要なログ記録を行うように、 /etc/syslog.conf を修正するなどを行います。仮想サーバを使用しないなら、jail 環境の syslog ソケットで listen する (接続を受け付ける) ためにホスト環境で syslogd(8) を修正したいかもしれません。この例では、syslog ソケットは、 /data/jail/testjail/var/run/log に格納されるでしょう。

シェルから出ると、jail は、シャットダウンされます。

jail の開始

利用者は、そのデーモンと他のプログラムのすべてを備えた環境を提示して、今、jail を再開する準備ができました。 /etc/jail.conf で jail のためのエントリを作成します:

testjail { 
 path = /tmp/jail/testjail; 
 mount.devfs; 
 host.hostname = testhostname; 
 ip4.addr = 192.0.2.100; 
 interface = ed0; 
 exec.start = "/bin/sh /etc/rc"; 
 exec.stop = "/bin/sh /etc/rc.shutdown"; 
}

仮想のサーバ環境を開始するために、 /etc/rc は、様々なデーモンとサービスを開始するに実行され、 /etc/rc.shutdown は、jail が削除されるときに、それらをシャットダウンするために実行されます。 jail で単独のアプリケーションを実行しているなら、“/bin/sh /etc/rc”のためのアプリケーションを開始するために使用されるコマンドを置き換えます。アプリケーションをきれいにシャットダウンすることができるいくつかのスクリプトがあります、さもなければ、停止コマンドなしで十分に進行し、アプリケーションに SIGTERM を送る jail があります。

次を実行することによって jail を開始します:

jail -c testjail

少しの警告が出されるかもしれません。しかしながら、それは、すべて適切に動作するべきです。 jail 化されたプロセスの横に現われる‘ J’フラグが付けられた ps(1) を使用して、jail の内側で実行している、 inetd(8), syslogd(8) と他のプロセスを見ることができるはずです。 jail のアクティブなリストを見るためには、 jls(8) ユーティリティを使用します。また、jail 化された環境のホスト名または IP アドレスに telnet(1) し、以前に作成されたアカウントを使用してログインすることができるはずです。

ブート時に jail か開始されることも可能です。詳細については、 rc.conf(5) の“jail_*”変数を参照してください。

jail の管理

例えば、 halt(8), reboot(8)shutdown(8) などの通常のマシンのシャットダウンコマンドを jail の内側でうまく使用することができません。 jail の内側からのすべてのプロセスを kill するためには、何を達成したいかによって、次のコマンドの 1 つを使用できます:

kill -TERM -1 
kill -KILL -1

これは、jail 内のすべてのプロセスに SIGTERM または SIGKILL シグナルを送ります - ホスト環境からこれを実行しないように注意してください! いったん、jail のプロセスがすべて死んだら、jail が persist パラメータを付けて作成されたなら、jail は、削除されます。また、jail の用途によって、jail の内側から /etc/rc.shutdown を実行したいかもしれません。

外側から jail をシャットダウンするためには、 exec.stop によって指定されたあらゆるコマンドを実行する、 jail -r で、単にそれを削除し、次に、あらゆる残っている jail 化されたプロセスに SIGTERM と最終的に SIGKILL を送ります。

/proc/pid/status ファイルは、その最後のフィールドとして、プロセスがファイルは、その最後のフィールドとして、プロセスが実行する jail の名前、または jail 内で実行されていないプロセスを示す“ -”を含んでいます。また、 ps(1) コマンドは、jail で処理するために‘ J’フラグを表示します。

また、利用者、それらの jail ID に基づいたプロセスをリスト/kill できます。プロセスとそれらの jail ID を表示するためには、次のコマンドを使用します:

ps ax -o pid,jid,args

jail の番号 3 のプロセスを表示して、次に、kill するためには、次のコマンドを使用します:

pgrep -lfj 3 
pkill -j 3

または:

killall -j 3

jail とファイルシステム

ファイルシステムが jail フレンドリとマークされ、jail の allow.mount パラメータが設定され、jail の enforce_statfs パラメータが 2 より小さくないなら、jail の内側のあらゆるファイルシステムを mount(8) または umount(8) することは不可能です。

同じファイルシステムを共有する複数の jail は、お互いに影響を及ぼすかもしれません。例えば、1 つの jail のユーザは、別の jail のプロセスに対して空間を残さないで、ファイルシステムを満杯にすることもできます。これを防ぐために quota(1) を使用しようとすることは、ファイルシステムのクォータが、 jail に気づかないように、どちらも動作しませんが、ユーザとグループ ID のみ見えます。これは、2 つの jail の同じユーザ ID が、同じファイルシステムのクォータを共有することを意味します。この作業を行うために jail ごとに 1 つのファイルシステムを使用する必要があるでしょう。

sysctl MIB エントリ

プロセスが jail の内側 (値が 1) で実行されているか、jail の内側でない (値が 0) かどうかを決定するために、読み込み専用のエントリ security.jail.jailed を使用することができます。

変数 security.jail.max_af_ips は、アドレスファミリごとにどのくらいのアドレスが jail にあるかを決定します。デフォルトは、255 です。

いくつかの MIB 変数には、jail ごとの設定があります。 jail 化されたプロセスによって、これらの変数を変更することは、ホスト環境に影響せず、jail 環境のみに影響します。これらの変数は、 kern.securelevel, kern.hostname, kern.domainname, kern.hostidkern.hostuuid です。

階層的 jail

jail の children.max パラメータを設定することによって、jail の内側のプロセスは、それら自体の jail を作成することができます。これらの子供の jail は、それらが作成した jail (または、それらの jail の子供) を見る、および/または変更できる jail でのみ、階層的に保持されます。各 jail には、それを作成した jail の jid を含んでいる、読み込み専用の parent パラメータがあります。 0 の jid は、jail が現在の jail の子供 (または、現在のプロセスが jail 化されていないなら、トップレベル jail である) ことを示します。

jail 化されたプロセスは、それら自体に与えられるより大きなパーミッションを与えることができません、例えば、jail が allow.nomount で作成されるなら、 allow.mount 設定で jail を作成できません。同様に、 ip4.addrsecurelevel のような制限は、子供の jail で迂回されません。

子供の jail は、それ自体の children.max パラメータが設定されるなら (デフォルトで 0 であることを覚えておいてください)、順番にそれ自体の子供の jail を作成できます。これらの jail は、目に見えて、それらの親とすべての先祖によって修正することができます。

jail 名は、ドットによって区切られた MIB タイプの文字列であるフルネームで、この階層構造を反映します。例えば、ベースシステムのプロセスが jail “foo”を作成し、その jail の下のプロセスが別の jail “bar”を作成するなら、2 番目の jail は、基本システムの“foo.bar”として見られます (が、jail “foo”内側のあらゆるプロセスには“bar”としてのみ見られます)。他方では、jid は、単一の空間に存在し、各 jail には、ユニークな jid がなければなりません。

名前のように、子供の jail の path は、作成者自体の path と相対的です。これは、最初の jail の chroot された環境で作成される子供の jail に基づいています。

歴史

jail ユーティリティは、 FreeBSD 4.0 で登場しました。階層的/拡張可能な jail は、 FreeBSD 8.0 で導入されました。設定ファイルは、 FreeBSD 9.1 で導入されました。

作者

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

Robert Watson は、拡張された文書を書き、いくつかのバグを見つけ、いくつかの新しい機能を追加し、ユーザランドの jail 環境をクリーンアップしました。

Bjoern A. Zeeb は、IPv4 のために Pawel Jakub Dawidek によって最初に行われたパッチに基づいて IPv4 と IPv6 のためのマルチ IP jail のサポートを追加しました。

James Gritton は、拡張可能な jail パラメータ、階層的な jail と設定ファイルを追加しました。

バグ

すべての IP ( INADDR_ANY) で listen している (接続を受け付けている) デーモンが、ホストデーモンが jail の内側から提供されたサービスで強制されないような、安全なホスト環境を構築することを容易にする、そのアドレスをバインド (bind) しないようなアドレスの別名フラグを追加することはよい考えであるかもしれません。現在、最も簡単な答えは、たぶん、容易に設定可能な inetd(8) から提供されるサービスを制限して、ホストで提供されるサービスを最小にすることです。

jail の内側の目に見えるディレクトリを管理するとき、最大の注意を払うべきです。例えば、jail 化されたプロセスに jail の chroot から抜け出して移動されるディレクトリにカレントワーキングディレクトリを設定するなら、プロセスは、jail の外側でファイル空間へのアクセスを得るかもしれません。ディレクトリが jail から抜け出して移動されるのではなく、常にコピーされることが勧められます。

さらに、jail の外側の特権がないユーザが jail の内部の特権があるユーザと協力して、それによって、ホスト環境で高い特権を得ることができるいくつかの方法があります。 jail の root がホスト環境で特権がないユーザにアクセス可能ではないことを保証することによって、これらの攻撃のほとんどを軽減することができます。とにかく、一般的な法則として、jail への特権があるアクセス権がある信頼できないユーザは、ホスト環境へのアクセス権を与えられるべきではありません。

October 12, 2013 FreeBSD