FreeBSD14.1 ; Jail インストール

Jailとは

FreeBSD環境上に仮想のFreeBSD環境を複数構築することが出来るしくみである。
jailはchrootを発展させたもので、ホスト環上(jailerと呼ぶ)に構築したjail環境(prisonerと呼ぶ)は、ホスト環境とは別に動作するFreeBSDマシンとして振舞う。
prisonerからはjailerおよび並列する別のprisonerに直接アタッチすることが出来ない。

jailの特徴
・エミュレーションではないため、高速に動作する
・prisoner
ごとにjailerとは別のIPアドレスを振ることができる
・jailerとprisonerで同一のファイルシステムが利用されるため、UID/GIDの割り当てに注意する必要がある

今回は、jailer(FreeBSD14.1)内に2つのprisoner(prisoner1、prisoner2)を構築する

Jailの構築

1.prisonerのベースディレクトリの作成
prisoner1、prisoner2のルートディレクトリになるディレクトリ(jail)を作成。今回は/homeに作成するが任意の場所でよい

2.ベースシステムのインストール
prisoner1、prisoner2にベースシステムをインストールする。 FreeBSDのレポジトリからbase.txzをダウンロードして、prisoner1 、prisoner2に展開する

3./etc/resolv.confのコピー
prisoner1 、prisoner2で名前解決ができるよう「resolv.conf」を作成する。
「resolv.conf」の内容は、jailerと同じ設定で問題ないため、このファイルをjailer側からコピーする。

4.prisonerでのkernel関連のログ出力を抑止する
prisoner1、 prisoner2のログに、kernel関係の出力がされないよう、「syslog.conf」を編集して設定。

5.adjkerntzの停止
各prisonerのcronによってkernelのタイムゾーンが設定されないよう、crontabを編集する。
(kernelのタイムゾーン設定はjailer側のcronで定期的に行われるため、prisonerでのcronによる設定は不要。)

6.prisonerの名前解決のための設定
prisoner1 、prisoner2で、自身の名前を解決できるように「hosts」を編集する
prisoner1 、prisoner2に割り当てるIPアドレスとFQDNのペアを追記

7.jailerとprisonerでUID/GIDを重複させないための設定
jailでは、jailerと各prisonerでひとつのファイルシステムを共有するので、jailer側で利用しているUID/GIDをそのままprisoner側で利用してしまうと、jailer側のユーザがprisoner側のユーザのファイルを自分のものとして扱えてしまうことになる。そのため、jailerと各prisonerで重複しないUID/GIDを振る必要がある。

※ ただし、「root」等の予め定義されているユーザ、および「pgsql」や「postfix」等のports経由で追加されるユーザについては、jailerとprisonerで同じUID/GIDが割り当てられる。
これらのユーザのUID/GIDを変更するには、「vipw」を利用して、直接UID/GIDを変更する。
(「vipw」でUID/GIDを変更しても、これらのユーザが所有者となっているファイルのオーナーのUID/GIDは自動的には更新されないのでchown/chgrpする必要がある)

8.prisoner1 、prisoner2のdevfsのマウント
各prisonerでデバイスが利用できるよう、各prisonerのdevをマウントする。

9.prisonerでの設定
「chroot」を利用してprisoner1 、prisoner2のルートディレクトリに移動し設定を行う。
(chrootしたディレクトリからjailer側に戻るときには「exit」を利用する)

それぞれの最後に、そのprisonerにおけるrootのパスワードを設定する(このパスワードはjailerのrootのパスワードとは区別される。)

10.jail環境の起動のための設定
jailer側でprisoner1 、prisoner2側に割り当てるIPアドレス、FQDN等を設定する。
「/etc/rc.conf」の最後に下記を追記する。em0は各自のインターフェース名に合わす

「jail_sysvipc_allow=」は、prisoner上のプロセスからシェアドメモリにアクセスさせるか否かの設定。
セキュリティの観点から「NO」にしておくが、PostgreSQLなどのシェアドメモリを利用するソフトウェアを動かす際には「YES」に設定する。

prisoner1 、prisoner2の設定を下記の通り、「/etc/jail.conf」に記述する

デフォルトでは、prisonerではtracerouteやping、bpfを利用したWIDE-DHCP等のraw socketを利用するプログラムが正常に動作しない。
これらのプログラムを利用するためには、「/etc/jail.conf」内の各prisoner設定内に、「allow.raw_sockets;」の設定を追記する。

システムを再起動
各prisonerを有効にする。

11.prisonerを削除
prisoner環境を再度一から構築しなおす場合には、以下のようにしてprisonerを削除し再構築する。

prisoner1を削除する場合

12.jailerで利用できるjail関連のコマンド

稼動中のprisonerの一覧表示

一番左側に表示される「JID」はprisonerに割り振られたIDで、後述する「jexec」で遷移するprisonerを特定する際に利用する

➁jailerからprisonerに遷移
JIDが「1」のprisonerに「/bin/csh」のシェルを利用して遷移する場合

➂prisonerの起動/停止

13. jail からホストマシンへの ping

JIDが「1」のprisoner1に遷移して実行する

ホストマシン(192.168.11.83)へ3回 ping

タイトルとURLをコピーしました