日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、全翻訳済み)
6.4-STABLE-K, 7.2-STABLE-K, 8.0-STABLE-K は現在、 作成中で日々更新されています。 最新の snapshots を元に作成しています。
JAIL(8) FreeBSD システム管理者マニュアル JAIL(8)
名称
jail - プロセスとその子孫を閉じ込める
書式
jail [-i] [-u username] path hostname ip-number command ...
解説
jail ユーティリティはプロセスとその将来の子孫を閉じ込めます。
オプションは次の通りです:
-i 新規に作成された jail (牢屋) に対し、jail の識別子を出力しま
す。
-u username command を実行するユーザ名。
path jail の根となるディレクトリ。
hostname jail のホスト名。
ip-number jail に割り当てられた IP 番号。
command 実行されるべきプログラムのパス名。
典型的には、jail は、2 個の哲学のうちの 1 個を使用して設定されます。それ
ぞれ、特定の単一アプリケーションを束縛すること、様々なデーモンやサービス
が動作する「仮想システムイメージ」を作成することです。どちらの場合であっ
ても、必要なコマンドラインツール、デーモン、ライブラリ、アプリケーション
設定ファイル等が利用可能となるために、十分完全にインストールされた
FreeBSD のファイルシステムが必要です。しかしながら、仮想サーバ設定では、
「ブート」処理の設定のために、もっと多くの作業が必要です。このマニュアル
ページは両者をサポートするための設定ステップを記述していますが、個別の要
件に応じて設定ステップを最適化できるかもしれません。
詳細は jail(2) のマニュアルページを参照してください。
使用例
jail 用ディレクトリツリー設定
この例は、 FreeBSD 配布物全体を含む jail 用ディレクトリツリーをどのように
構築するかを示しています:
D=/here/is/the/jail
cd /usr/src
mkdir -p $D
make world DESTDIR=$D
cd etc
make distribution DESTDIR=$D
mount_devfs devfs $D/dev
cd $D
ln -sf dev/null kernel
注: jail に対し、devfs 中の適切なデバイスのみが見えるようになっていること
が重要です。 jail 中でのディスクデバイスへのアクセスを許すと、 jail 中の
プロセスが jail 外のファイルを修正することで、 jail の砂箱を通り抜けてし
まうかもしれません。 devfs ルールを使用することで、 jail 毎の devfs 中の
エントリへのアクセスを制限する方法については、 devfs(8) を参照してくださ
い。
多くの場合、この例の方法では、必要をはるかに越えた数のものを jail に入れ
てしまうでしょう。もう一方の極端な例では、jail はただ 1 個のファイルのみ
を保持します: すなわち jail の中で実行する実行形式 1 個だけです。
``太い'' jail から開始して動かなくなるまで徐々にものを削除していく方が、
``細い'' jail から開始して動くようになるまで徐々にものを追加していくより
もかなり簡単ですので、試すにはお勧めですが、また用心することもお勧めしま
す。
jail の設定
jail 用ディレクトリツリーの構築のためには、 jail 用ディレクトリツリー設定
に記述されている手順を実行してください。この例では、jail された IP アドレ
ス用に /data/jail/192.168.11.100 に構築するものと仮定します。以降、あなた
が必要とするディレクトリ、IP アドレス、ホスト名で置き換えてください。
ホスト環境の設定
まず、実システムの環境を ``jail に適した環境'' にします。一貫性のために、
親となる実マシンを ``ホスト環境'' と呼び、jail される仮想マシンを ``jail
環境'' と呼びます。 jail は IP エイリアスを使用して実装されていますので、
最初にすべきことのひとつは、ホストシステムの IP サービスで、全ローカル IP
アドレスに対してサービスを listen しているものを、無効化することです。特
定の IP アドレスではなくすべての利用可能な IP アドレスに bind するネット
ワークサービスがホスト環境上に存在する場合、そのサービスは jail IP アドレ
スに送られた要求にサービス可能です。これは、 inetd(8) を修正して、適切な
IP アドレスのみ listen させるといったことを意味します。次の設定を、ホスト
環境の /etc/rc.conf に追加します:
sendmail_enable="NO"
inetd_flags="-wW -a 192.168.11.23"
rpcbind_enable="NO"
この例では、 192.168.11.23 はホストシステムの元々の IP アドレスです。
inetd(8) から実行されるデーモンは、指定されたホスト IP アドレスを使用する
よう、簡単に設定可能です。他のデーモンは手動での設定が必要です -- いくつ
かに対しては、 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 にサービスしようとする
と、混乱が生じるかもしれませんし、特定の IP だけを使用するようには簡単に
は再設定できません。これは、NFS のサービスには、直接カーネルが実行するも
のがあるからです。ホスト環境内で動作しているすべてのサードパーティネット
ワークソフトウェアもまた確認および設定して、すべての IP アドレスに bind
しないようにすべきです。結果として、これらのサービスもまた、 jail 環境か
ら提供されているように見えるでしょう。
ひとたびこれらのデーモンが無効化またはホスト環境内に固定化されたなら、後
の混乱 (jail へメールを送るときに、jail の sendmail がダウンしていて、
メールがホストへ配送されてしまうなど) の可能性を減らすために、リブートし
て全デーモンが既知の状態となるようにするのが最良です。
jail の設定
最初に jail を起動するときには、ネットワークインタフェースを設定しないで
ください。これは、ネットワークインタフェースを少し整理したり、アカウント
を設定するためです。どんなマシンでも (仮想であってもそうでなくても)、
root のパスワードやタイムゾーンといった情報を設定する必要があるでしょう。
これらのステップのいくつかは、完全な仮想サーバを jail 内に作成したい場合
にのみあてはまります。残りは、単一アプリケーションの束縛にも、仮想サーバ
の構築にも、あてはまります。
jail 内でシェルを起動します:
jail /data/jail/192.168.11.100 testhostname 192.168.11.100 /bin/sh
最後に、エラー無しで、jail 内の、シェルプロンプトで終るでしょう。ここで、
/usr/sbin/sysinstall を実行し、インストール後の設定で様々な設定オプション
を設定できます。また、同様のことを実現するために、 /etc/rc.conf 等を手動
で編集できます。
+o 空の /etc/fstab を作成し、fstab が存在しないという起動警告を解
消します (仮想サーバのみ)。
+o ポートマッパを無効化します (/etc/rc.conf: rpcbind_enable="NO")
(仮想サーバのみ)。
+o newaliases(1) を実行し、 sendmail(8) の警告を解消します。
+o インタフェース設定を無効化し、ifconfig 関連の起動警告を解消しま
す (network_interfaces="") (仮想サーバのみ)。
+o /etc/resolv.conf を設定し、jail 内の名前解決が正しく動作するよ
うにします。
+o root のパスワードを設定します。実ホストシステムとは異なっても良
いです。
+o タイムゾーンを設定します。
+o jail 環境内のユーザにユーザアカウントを追加します。
+o jail 環境に必要なパッケージを追加します。
パッケージ固有の設定 (ウェブサーバや SSH サーバ等) や、好みのログを取るた
めの /etc/syslog.conf の修正等を行ってください。仮想サーバを使っていない
場合、ホスト環境の syslogd(8) が jail 環境の syslog ソケットを listen す
るように変更したいかもしれません。この例では、syslog ソケットは
/data/jail/192.168.11.100/var/run/log に格納されます。
シェルから抜ければ、jail はシャットダウンします。
jail の開始
jail を再開し、全デーモンと他のプログラムと共に環境を立ち上げる準備ができ
ました。 jail 内で単一アプリケーションを実行する場合、下記の例の /etc/rc
を、アプリケーション起動のコマンドで置き換えてください。仮想サーバ環境の
立ち上げるために、 /etc/rc が実行され、様々なデーモンやサービスを起動しま
す。これを実行するには、まず仮想ホストのインタフェースを立ち上げ、それか
ら jail の /etc/rc スクリプトを jail 内から実行します。
注: 信頼できないユーザに jail 内で root アクセスを許す予定なら、
security.jail.set_hostname_allowed sysctl 変数を 0 に設定することを検討す
ると良いでしょう。管理に関する後述の議論を参照して、何故これが良い考えな
のかを理解してください。この変数を設定することにしたならば、すべての jail
の起動前にこれを設定することが必要であり、またブートの度に 1 度必要です。
ifconfig ed0 inet alias 192.168.11.100/32
mount -t procfs proc /data/jail/192.168.11.100/proc
jail /data/jail/192.168.11.100 testhostname 192.168.11.100 \
/bin/sh /etc/rc
ほとんどの sysctl(8) 設定変数は jail 内から設定不可であるため、若干の警告
が表示されます。なぜなら、これらの設定変数は、すべての jail 環境とホスト
環境に渡って大域的だからです。しかしながら、すべて正しく動作することで
しょう。 inetd(8), syslogd(8) および他のプロセスが jail 内で動作している
ことは、 ps(1) を使用することにより、jail されたプロセスの横に `J' フラグ
が付いていることにより確認可能です。 jail のアクティブリストを見るには
jls(8) ユーティリティを使用します。 jail された環境へは、ホスト名または
IP アドレスで telnet(1) 可能であり、前述の手順で作成したアカウントを使用
してログイン可能です。
jail の管理
通常のマシンのシャットダウンコマンド、例えば halt(8), reboot(8),
shutdown(8) は jail 内ではうまく使えません。 jail 内の全プロセスを殺すた
めには、jail に root でログインし、やりたいことに依存して次のいずれかのコ
マンドを使用します:
kill -TERM -1
kill -KILL -1
これにより、 SIGTERM または SIGKILL のシグナルを、jail 内から jail 内の全
プロセスに通知します。 jail の用途に依存して、jail 内で /etc/rc.shutdown
を実行したいかもしれません。 jail 外からプロセスを殺すには、 jexec(8)
ユーティリティを上述の kill(1) コマンドと組み合わせて使用するか、
killall(1) ユーティリティを -j オプション付きで使用します。
/proc/pid/status ファイルの最後のフィールドには、プロセスが動作している
jail のホスト名か、このプロセスが jail 内で動作していないことを示すために
``-'' を含みます。 ps(1) コマンドもまた、jail 内のプロセスに対して `J' フ
ラグを示します。しかし、jail 用のホスト名はデフォルトでは jail 内から書き
換え可能であるため、デフォルトでは /proc の status エントリは信頼できませ
ん。 jail 内からのホスト名設定を禁ずるには、ホスト環境の sysctl 変数
security.jail.set_hostname_allowed を 0 に設定します。これはすべての jail
に影響します。 sysctl.conf(5) を使うことにより、ブートのたびにこの sysctl
設定を行えます。次の行を /etc/sysctl.conf に追加するだけです:
security.jail.set_hostname_allowed=0
Sysctl MIB エントリ
jail 封鎖環境の特定の側面は、ホスト環境から、 sysctl(8) MIB 変数を使用し
て変更可能です。現在のところ、これらの変数はシステム上のすべての jail 環
境に影響しますが、将来的にこの機能はより細粒度となる予定です。
security.jail.set_hostname_allowed
本 MIB エントリは、jail 内のプロセスが hostname(1) または
sethostname(3) を使用して、ホスト名を変更可能か否かを指定します。現
在の jail 実装では、 jail 内からホスト名を設定できてしまうと、 /proc
内の jail 情報が正確であることに依存している管理ツールへ影響します。
このため、信頼できない団体に jail への特権アクセスを許している環境に
おいては、本機能は無効化するべきです。
security.jail.socket_unixiproute_only
jail 機能は、単一の IPv4 アドレスを各 jail へ bind し、 IPv4 空間に
おける他のネットワークアドレスへのアクセスを制限します。これらは、ホ
スト環境ではアクセス可能であるかもしれません。しかしながら jail は現
在のところ、 jail 機能を持たない他のネットワークプロトコルスタックへ
のアクセスを制限できません。このためデフォルトでは、jail 内のプロセ
スは PF_LOCAL, PF_INET, PF_ROUTE ドメインのプロトコルにのみアクセス
可能ですので、 UNIX ドメインソケット、IPv4 アドレス、ルーティングソ
ケットにアクセス可能です。他のドメインへアクセスを有効にするには、本
MIB エントリを 0 に設定します。
security.jail.sysvipc_allowed
本 MIB エントリは、jail 内のプロセスが System V IPC プリミティブへの
アクセスを持つか否かを指定します。現在の jail 実装では、System V プ
リミティブは、ホスト環境と jail 環境に跨がる単一の名前空間を共有しま
す。これは、jail 内のプロセスが jail 外のプロセスや他の jail 内のプ
ロセスと通信可能である (また潜在的に妨害も可能である) ことを意味しま
す。このため、この機能はデフォルトで無効ですが、本 MIB エントリを 1
に設定することで有効にできます。
現在、jail 毎の設定を保持する 2 個の MIB 関係変数があります。 jail 内のプ
ロセスによるこれらの変数の変更は、ホスト環境には影響せず、 jail 環境に対
してのみ影響します。変数名は kern.securelevel と kern.hostname です。
関連項目
killall(1), chroot(2), jail(2), jail_attach(2), procfs(5), rc.conf(5),
sysctl.conf(5), devfs(8), halt(8), inetd(8), jexec(8), jls(8),
mount_devfs(8), named(8), reboot(8), rpcbind(8), sendmail(8),
shutdown(8), sysctl(8), syslogd(8)
歴史
jail ユーティリティは FreeBSD 4.0 ではじめて登場しました。
作者
jail の機能は Poul-Henning Kamp によって R&D Associates
http://www.rndassociates.com/ のために書かれ、 FreeBSD に寄贈されました。
Robert Watson が追加の文書を書き、少々バグを見つけ、新規機能を少々追加
し、ユーザランドの jail 環境を綺麗にしました。
バグ
jail は現在のところ、 procfs(5) に対して特定の jail 情報を ps(1) 経由でア
クセスできるようにするという能力がありません。また、アドレスエイリアスフ
ラグを追加して、全 IP (INADDR_ANY) 上で listen するようなデーモンがこのフ
ラグを持つアドレスには bind しないようにすると良いかもしれません。これに
より、jail 内から提供されるサービスに対してホストデーモンが負担をかけな
い、安全なホスト環境を構築可能とします。現在のところ、最も単純な答えはホ
スト上で提供するサービスを最小化することであり、おそらく簡単に設定可能な
inetd(8) から提供されるものに限定することでしょう。
FreeBSD 4.9 December 12, 2001 FreeBSD 4.9