.\" .\"Copyright (c) 2000 Robert N. M. Watson .\"All rights reserved. .\" .\"Redistribution and use in source and binary forms, with or without .\"modification, are permitted provided that the following conditions .\"are met: .\"1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\"2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\"THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\"ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\"IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\"ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\"FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\"DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\"OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\"HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\"LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\"OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\"SUCH DAMAGE. .\" .\" .\"---------------------------------------------------------------------------- .\""THE BEER-WARE LICENSE" (Revision 42): .\" wrote this file. As long as you retain this notice you .\"can do whatever you want with this stuff. If we meet some day, and you think .\"this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp .\"---------------------------------------------------------------------------- .\" .\"%FreeBSD: src/usr.sbin/jail/jail.8,v 1.13.2.3 2000/11/01 19:10:06 rwatson Exp % .\" .Dd April 28, 1999 .\" jpman %Id: jail.8,v 1.3 2000/05/22 03:23:14 takamune Stab % .Dt JAIL 8 .Os FreeBSD 4.0 .Sh 名称 .Nm jail .Nd プロセスとその子孫を閉じ込める .Sh 書式 .Nm jail .Ar path .Ar hostname .Ar ip-number .Ar command .Ar ... .Sh 解説 .Nm コマンドはプロセスとその将来の子孫を閉じ込めます。 .Pp 詳細は .Xr jail 2 のマニュアルページを参照してください。 .Sh 使用例 .Ss jail 用ディレクトリツリー設定 この例は jail 用ディレクトリツリーをどのように構築するかを示しています: .Bd -literal D=/here/is/the/jail cd /usr/src make hierarchy DESTDIR=$D make obj make depend make all make install DESTDIR=$D cd etc make distribution DESTDIR=$D NO_MAKEDEV=yes cd $D/dev sh MAKEDEV jail cd $D ln -sf dev/null kernel .Ed .Ss jail の設定 jail 用ディレクトリツリーの構築のためには、 .Sx jail 用ディレクトリツリー設定 に記述されている手順を実行してください。 この例では、jail された IP アドレス用に .Pa /data/jail/192.168.11.100 に構築するものと仮定します。 以降、 あなたが必要とするディレクトリ、IP アドレス、ホスト名で置き換えてください。 .Pp まず、実システムの環境を .Dq jail に適した環境 にします。 一貫性のために、親となる実マシンを .Dq ホスト環境 と呼び、jail される仮想マシンを .Dq jail 環境 と呼びます。 jail は IP エイリアスを使用して実装されていますので、 最初にすべきことのひとつは、 ホストシステムの IP サービスで、 全ローカル IP アドレスに対してサービスを listen しているものを、 無効化することです。 これは、 .Xr inetd 8 を修正して、適切な IP アドレスのみ listen させるといった ことを意味します。 次の設定を、ホスト環境の .Pa /etc/rc.conf に追加します: .Bd -literal -offset indent sendmail_enable="NO" inetd_flags="-wW -a 192.168.11.23" portmap_enable="NO" syslogd_flags="-ss" .Ed .Pp この例では、 .Li 192.169.11.23 はホストシステムの元々の IP アドレスです。 .Xr inetd 8 から実行されるデーモンは、指定されたホスト IP アドレスを使用するよう、 簡単に設定可能です。 他のデーモンは手動での設定が必要です -- いくつかに対しては、 .Xr rc.conf 5 フラグエントリにて可能ですが、他のものに対してはアプリケーション毎の 設定ファイルをいじるか、再コンパイルが必要です。 実行に使用する IP アドレスを指定不可能なアプリケーションに対しては、 可能であればこれらを無効にする方が良いです。 .Pp ベースシステムに付属する多くのデーモンは、 jail 中枢環境内で jail から実行されると、問題を持ち得ます。 これには .Xr syslogd 8 , .Xr sendmail 8 , .Xr named 8 , .Xr portmap 8 が含まれます。 sendmail と named は、自身の設定ファイルを使用して、 特定の IP のみ listen するよう設定可能ですが、 ほとんどの場合、 デーモンを単に jail 内でのみ実行して、ホスト環境では実行しない方が簡単です。 syslogd は単一 IP のみに bind するよう設定できませんが、 ネットワークポートに bind しないようにするために、``-ss'' 引数を使用可能です。 ホスト環境からの NFS にサービスしようとすると、 混乱が生じるかもしれませんし、 特定の IP だけを使用するようには簡単には再設定できません。 これは、NFS のサービスには、直接カーネルが実行するものがあるからです。 ホスト環境内で動作している すべてのサードパーティネットワークソフトウェアもまた確認および設定して、 すべての IP アドレスに bind しないようにすべきです。 結果として、これらのサービスもまた、 jail 環境から提供されているように見えるでしょう。 .Pp ひとたびこれらのデーモンが無効化またはホスト環境内に固定化されたなら、 後の混乱 (jail へメールを送るときに、jail の sendmail がダウンしていて、 メールがホストへ配送されてしまうなど) の可能性を減らすために、 リブートして全デーモンが既知の状態となるようにするのが最良です。 .Pp 最初に jail を起動するときには、 ネットワークインタフェースを設定しないでください。 これは、ネットワークインタフェースを少し整理したり、 アカウントを設定するためです。 どんなマシンでも (仮想であってもそうでなくても)、 root のパスワードやタイムゾーンといった情報を設定する必要があるでしょう。 始める前に、 .Xr sysinstall 8 を jail のツリーにコピーすることにより、簡単に設定できます。 次のように行います: .Bd -literal -offset indent # mkdir /data/jail/192.168.11.100/stand # cp /stand/sysinstall /data/jail/192.168.11.100/stand .Ed .Pp それから、jail を開始します: .Bd -literal -offset indent # jail /data/jail/192.168.11.100 testhostname 192.168.11.100 /bin/sh .Ed .Pp 最後に、エラー無しで、jail 内の、シェルプロンプトで終るでしょう。 ここで、 .Pa /stand/sysinstall を実行し、インストール後の設定で様々な設定オプションを設定できます。 また、同様のことを実現するために、rc.conf 等を手動で編集できます。 .Pp .Bl -bullet -offset indent -compact .It 空の /etc/fstab を作成し、空の fstab に関する起動警告を解消します。 .It ポートマッパを無効化します (rc.conf: portmap_enable="NO")。 .It .Xr newaliases 1 を実行し、sendmail の警告を解消します。 .It インタフェース設定を無効化し、ifconfig 関連の起動警告を解消します (network_interfaces="")。 .It /etc/resolv.conf を設定し、jail 内の名前解決が正しく動作するようにします。 .It root のパスワードを設定します。 実ホストシステムとは異なっても良いです。 .It タイムゾーンを設定します。 .It jail 環境内のユーザにユーザアカウントを追加します。 .It jail 環境に必要なパッケージを追加します。 .El .Pp パッケージ固有の設定 (ウェブサーバや SSH サーバ等) や、 好みのログを取るための /etc/syslog.conf の修正等を行ってください。 .Pp シェルから抜ければ、jail はシャットダウンします。 .Ss jail の開始 jail を再開し、 全デーモンと他のプログラムと共に環境を立ち上げる準備ができました。 これを実行するには、まず仮想ホストのインタフェースを立ち上げ、 それから jail の .Pa /etc/rc スクリプトを jail 内から実行します。 .Pp 注: 信頼できないユーザに jail 内で root アクセスを許す予定なら、 jail.set_hostname_allowed を 0 に設定することを検討すると良いでしょう。 管理上の理由を参照して、何故これが良い考えなのかを見てください。 この変数を設定することにしたならば、 すべての jail の起動前にこれを設定することが必要であり、 またブートの度に 1 度必要です。 .Bd -literal -offset indent # ifconfig ed0 inet alias 192.168.11.100 netmask 255.255.255.255 # 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 .Ed .Pp ほとんどの .Xr sysctl 8 設定変数は jail 内から設定不可であるため、若干の警告が表示されます。 なぜなら、 これらの設定変数は、すべての jail 環境とホスト環境に渡って大域的だからです。 しかしながら、すべて正しく動作することでしょう。 .Xr inetd 8 , .Xr syslogd 8 および他のプロセスが jail 内で動作していることは、 .Xr ps 1 を使用することにより、jail されたプロセスの横に .Dq J フラグが付いていることにより確認可能です。 jail された環境へは、ホスト名または IP アドレスで telnet 可能であり、 前述の手順で作成したアカウントを使用してログイン可能です。 .Ss jail の管理 通常のマシンのシャットダウンコマンド、例えば .Xr halt 8 , .Xr reboot 8 , .Xr shutdown 8 は jail 内ではうまく使えません。 jail 内の全プロセスを殺すためには、jail に root でログインし、 やりたいことに依存して次のいずれかのコマンドを使用します: .Pp .Bl -bullet -offset indent -compact .It .Li kill -TERM -1 .It .Li kill -KILL -1 .El .Pp これにより、 .Dq TERM または .Dq KILL のシグナルを、jail 内から jail 内の全プロセスに通知します。 jail の用途に依存して、jail 内で .Pa /etc/rc.shutdown を実行したいかもしれません。 現在のところ、jail 内に新規プロセスを挿入する手段はありませんので、 これらの動作を行う前にまず jail へログインする必要があります。 .Pp jail 外からプロセスを殺すためには、 殺すプロセスの個々の PID を判別することが必要です。 .Pa /proc/ Ns Va pid Ns Pa /status ファイルの最後のフィールドには、 プロセスが動作している jail のホスト名か、 このプロセスが jail 内で動作していないことを示すために .Dq - を含みます。 .Xr ps 1 コマンドもまた、jail 内のプロセスに対して .Dq J フラグを示します。 しかし、jail 用のホスト名はデフォルトでは jail 内から書き換え可能であるため、 デフォルトでは .Pa /proc の status エントリは信頼できません。 jail 内からのホスト名設定を禁ずるには、ホスト環境の sysctl 変数 .Dq Va jail.set_hostname_allowed を 0 に設定します。 これはすべての jail に影響します。 .Xr sysctl.conf 5 を使うことにより、ブートのたびにこの sysctl 設定を行えます。 次の行を sysctl.conf に追加するだけです: .Bd -literal -offset indent jail.set_hostname_allowed=0 .Ed .Pp 将来のバージョンの FreeBSD では、jail を管理するための機構は、 より良くなっているでしょう。 .Ss Sysctl MIB エントリ jail 封鎖環境の特定の側面は、ホスト環境から、 .Xr sysctl 8 MIB 変数を使用して変更可能です。 現在のところ、これらの変数はシステム上のすべての jail 環境に影響しますが、 将来的にこの機能はより細粒度となる予定です。 .Bl -tag -width XXX .It jail.set_hostname_allowed 本 MIB エントリは、jail 内のプロセスが .Xr hostname 1 または .Xr sethostname 3 を使用して、ホスト名を変更可能か否かを指定します。 現在の jail 実装では、 jail 内からホスト名を設定できてしまうと、 .Pa /proc 内の jail 情報が正確であることに依存している管理ツールへ影響します。 このため、 信頼できない団体に jail への特権アクセスを許している環境においては、 本機能は無効化するべきです。 .It jail.socket_unixiproute_only jail 機能は、単一の IPv4 アドレスを各 jail へ bind し、 IPv4 空間における他のネットワークアドレスへのアクセスを制限します。 これらは、ホスト環境ではアクセス可能であるかもしれません。 しかしながら jail は現在のところ、 jail 機能を持たない他のネットワークプロトコルスタックへの アクセスを制限できません。 このためデフォルトでは、jail 内のプロセスは .Dv PF_LOCAL , .Dv PF_INET , .Dv PF_ROUTE ドメインのプロトコルにのみアクセス可能ですので、 UNIX ドメインソケット、IPv4 アドレス、ルーティングソケットにアクセス可能です。 他のドメインへアクセスを有効にするには、 本 MIB エントリを 0 に設定します。 .It jail.sysvipc_allowed 本 MIB エントリは、jail 内のプロセスが System V IPC プリミティブへの アクセスを持つか否かを指定します。 現在の jail 実装では、System V プリミティブは、 ホスト環境と jail 環境に跨がる単一の名前空間を共有します。 これは、jail 内のプロセスが jail 外のプロセスや他の jail 内のプロセスと 通信可能である (また潜在的に妨害も可能である) ことを意味します。 このため、この機能はデフォルトで無効ですが、 本 MIB エントリを 1 に設定することで有効にできます。 .El .Sh 関連項目 .Xr chroot 2 , .Xr jail 2 , .Xr procfs 5 , .Xr rc.conf 5 , .Xr sysctl.conf 5 , .Xr halt 8 , .Xr inetd 8 , .Xr named 8 , .Xr portmap 8 , .Xr reboot 8 , .Xr sendmail 8 , .Xr shutdown 8 , .Xr sysctl 8 , .Xr syslogd 8 .Sh 歴史 .Fn jail ファンクションコールは .Fx 4.0 ではじめて登場しました。 .Sh 作者 jail の機能は .An Poul-Henning Kamp によって R&D Associates .Dq Li http://www.rndassociates.com/ のために書かれ、 .Fx に寄贈されました。 .Pp Robert Watson が追加の文書を書き、少々バグを見つけ、 新規機能を少々追加し、ユーザランドの jail 環境を綺麗にしました。 .Sh バグ jail は現在のところ、強力な管理機構を持ちません。 これには例えば、jail 内の全プロセスにシグナルを送る、 .Xr procfs 5 に対して特定の jail 情報を .Xr ps 1 経由でアクセスできるようにすることが含まれます。 また、アドレスエイリアスフラグを追加して、 全 IP (INADDR_ANY) 上で listen するようなデーモンが このフラグを持つアドレスには bind しないようにすると良いかもしれません。 これにより、jail 内から提供されるサービスに対して ホストデーモンが負担をかけない、安全なホスト環境を構築可能とします。 現在のところ、 最も単純な答えはホスト上で提供するサービスを最小化することであり、 おそらく簡単に設定可能な .Xr inetd 8 から提供されるものに限定することでしょう。