総合手引 | セクション 8 | English | オプション |
オプションは次の通りです:
| 新規に作成された jail (牢屋) に対し、jail の識別子を出力します。 |
| きれいな環境でプログラムを実行します。 HOME, SHELL, TERM, USER 以外の環境は捨てられます。 HOME と SHELL はターゲットログインのデフォルトの値に設定されます。 USER はターゲットログインに設定されます。 TERM は現在の環境からインポートされます。 ターゲットログインのログインクラスケーパビリティデータベースからも 環境変数が設定されます。 |
| |
ホスト環境から command を実行するユーザ名。 | |
| |
jail された環境から command を実行するユーザ名。 | |
path | jail の根となるディレクトリ。 |
hostname | jail のホスト名。 |
ip-number | jail に割り当てられた IP 番号。 |
command | 実行されるべきプログラムのパス名。 |
典型的には、jail は、2 つの哲学のうちの 1 つを使用して設定されます。 それぞれ、特定の単一アプリケーションを束縛すること、 様々なデーモンやサービスが動作する "仮想システムイメージ" を作成することです。 どちらの場合であっても、 必要なコマンドラインツール、デーモン、ライブラリ、 アプリケーション設定ファイル等が利用可能となるために、 十分完全にインストールされた FreeBSD のファイルシステムが必要です。 しかしながら、仮想サーバ設定では、 "ブート" 処理の設定のために、もっと多くの作業が必要です。 このマニュアルページは 両者をサポートするための設定ステップを記述していますが、 個別の要件に応じて設定ステップを最適化できるかもしれません。
詳細は jail(2) のマニュアルページを参照してください。
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 から開始して動くようになるまで徐々にものを追加していくよりも かなり簡単ですので、試すにはお勧めですが、また用心することもお勧めします。
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 /data/jail/192.168.11.100 testhostname 192.168.11.100 /bin/sh
エラーがなければ、jail 内のシェルプロンプトで終わるでしょう。 ここで、 /usr/sbin/sysinstall を実行し、インストール後の設定で様々な設定オプションを設定できます。 また、同様のことを実現するために、 /etc/rc.conf 等を手動で編集できます。
パッケージ固有の設定 (ウェブサーバや SSH サーバ等) や、 好みのログを取るための /etc/syslog.conf の修正等を行ってください。 仮想サーバを使っていない場合、ホスト環境の syslogd(8) が jail 環境の syslog ソケットを listen するように変更したいかもしれません。 この例では、syslog ソケットは /data/jail/192.168.11.100/var/run/log に格納されます。
シェルから抜ければ、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) 可能であり、 前述の手順で作成したアカウントを使用してログイン可能です。
kill -TERM -1 kill -KILL -1
これにより、
SIGTERM
または
SIGKILL
のシグナルを、jail 内から jail 内の全プロセスに通知します。
jail の用途に依存して、jail 内で
/etc/rc.shutdown
を実行したいかもしれません。
jail 外からプロセスを殺すには、
jexec(8)
ユーティリティを上述の
kill(1)
コマンドと組み合わせて使用するか、
killall(1)
ユーティリティを
/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
security.jail.allow_raw_sockets | |
本 MIB エントリは、jail の root が raw ソケットを作成可能か否かを指定します。 この MIB を 1 に設定すると、 ping(8) や traceroute(8) のようなユーティリティを jail 内で実行できるようになります。 この MIB が設定されていれば、 IP_HDRINCL フラグがソケットに設定されているか否かに関わらず、 ソース IP アドレスは jail に bind された IP アドレスに 強制的に従うようになります。 raw ソケットは様々なネットワークサブシステムの設定や相互作用に使われるので、 jail への特権的なアクセス権を信頼できない相手に与える場合には、 さらに注意が必要です。 そのため、デフォルトではこのオプションは無効になっています。 | |
security.jail.getfsstatroot_only | |
本 MIB エントリは、jail 内のプロセスが全マウントポイントのデータを 見られるか否かを指定します。 1 (デフォルト) に設定された場合は、 getfsstat(2) システムコールは (jail 内のプロセスから呼ばれた場合) jail のルートの vnode があるファイルシステムのデータだけを返します。 注: これは /dev, /tmp, /proc のような 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 に設定することで有効にできます。 | |
security.jail.chflags_allowed | |
本 MIB エントリは jail 内の特権ユーザが chflags(2) によってどのように扱われるのかを決めます。 0 であれば、そのようなユーザは非特権ユーザとして扱われ、システムファイルフラグを セットしたりクリアしたりすることはできません。 0 でなければ、特権ユーザとして扱われ、 kern.securelevel による通常の束縛に従ってシステムファイルフラグを操作できます。 | |
現在、jail 毎の設定を保持する 2 個の MIB 関係変数があります。 jail 内のプロセスによるこれらの変数の変更は、ホスト環境には影響せず、 jail 環境に対してのみ影響します。 変数名は kern.securelevel と kern.hostname です。
Robert Watson が追加の文書を書き、少々バグを見つけ、 新規機能を少々追加し、ユーザランドの jail 環境を綺麗にしました。
JAIL (8) | April 8, 2003 |
総合手引 | セクション 8 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.