chroot jail

移転しました

独自ドメインサイトへ移行しました。5秒後に

https://straypenguin.winfield-net.com/

へジャンプします。

それ自体では chroot する機能のない ssh や ftp サーバをユーザに開放する場合、システムを歩き回らせないようにするため chroot 環境を導入したい。或るディレクトリに簡易版のシステムを築いておき、特定のユーザはログインと同時にそこ (牢屋=jail) へ閉じ込め、本来のシステムファイルにはアクセスできないようにするわけだ。本稿では、 Jail というユーティリティによる方法と、手動整備 + PAM による chroot 環境構築を取り上げる。ニーズに応じて環境をよりきめ細かく作り込もうと思うなら、後者の稿が役に立つはずだ。

Table of Contents

Jailユーティリティによるchroot

オフィシャルサイト:
JMC Research - Juan M. Casillas Web Site

Jail は chroot 環境の構築を楽にしてくれるツール群。核となる jail バイナリは、本物のシェルとの間のラッパーとして働き、そのユーザを指定した chroot 環境に「閉じ込める」。Jail の最もありがたい点は、 chroot ディレクトリ下のデバイスファイルや基本バイナリの整備を、付属の Perl スクリプトがカバーしてくれることだ。執筆時点でのバージョンは 1.9a。この章では、ログインと、 ssh, scp による被接続が「とりあえず動く」ところまで解説する。ただし Fedora Core 3 (kernel-2.6.x, glibc-2.3.x) では、 Jail ユーティリティで構築した chroot 環境は正常に機能しなかった。うまくいかない場合は次章を読むべし。

Jailのインストール

user$ tar xzvf jail_1.9a.tar.gz
user$ cd jail/src

各種「説明書」はソースディレクトリ下のいろんな階層に混在しているが、doc/ にあるもの以外はバージョンが古い。 doc/ 下の README や INSTALL などを読むべし。src/Makefile の冒頭の変数設定を確認して、必要であれば修正。Linux であれば、たいていは必要ない。デフォルトでは、アーキテクチャはLinux、インストールベース dir は /usr/local となる。準備ができたら、jail/src に居たまま:

user$ make
user$ su
root# make install

インストールされるファイル (すべて /usr/local 下) :

bin/: jail(バイナリ), mkjailenv, addjailsw, addjailuser(Perl スクリプト)
etc/: jail.conf
lib/: libjail.pm
lib/arch/archs/: definitions, functions

chroot基本環境の作成

以下設定例の前提 chroot_dir:
jail されるユーザ:
jail されるユーザのグループ:
hanako の HOME:
/home/jails/
hanako
jails
/home/jails/home/hanako

上記の仮定で hanako がログインすると /home/jails/ がルートディレクトリ "/" に見え、ホームディレクトリ /home/jails/home/hanako /home/hanako に見える。通常のユーザ作成時のように、jail されるユーザ毎に個別のグループを作ってもいいが、今回は共通のグループ jails を作成し、すべての被jailユーザのプライマリグループとする。

基礎環境を作る

まず、chroot_dir 下に基本的なディレクトリ構造とデバイスファイル、chroot_dir/etc/passwd ファイルなどを作る。

root# mkjailenv /home/jails

基本的なバイナリ (シェル, cp, mv, ln など) をシステムからコピーする。必要なライブラリも調査してコピーしてくれる。

root# addjailsw /home/jails

パスワードファイルの微調整

mkjailenv でコピーされた chroot_dir/etc/passwd, shadow, group ファイルに調整を加える。

個別プログラムの追加

※ chroot 環境を X アプリの提供のために構築することは滅多にないだろう。アプリケーションによっては、 strace の結果は X 上で検証するか通常の仮想コンソール上で行うかによって少々異なることがあるため、 addjailsw も X から出て行なったほうが確実。

続いて、上記の行程ではコピーされない追加のバイナリやライブラリをコピーする。おそらく必要なものとしては、chgrp, chown, chmod, pwd, id などがあるだろう。この場合は addjailsw を -P オプション付きで使用する。 addjailsw は必要なライブラリや関連ファイルを調べるために strace を行うが、対象のプログラムがインタラクティブな性格のものの場合 (例えば vi や ssh など) には、すぐに exit するようなオプションを一緒に渡す必要がある。バージョンを表示させるオプションを与えるか、ヘルプを表示するために「実在しない」オプションを指定するのが常套手段。 ssh, scp によるログインやファイルアップ/ダウンロードも目論んでいる場合には、ssh, scp、それに groups というシェルスクリプトも必要となる。

root# addjailsw /home/jails -P chgrp
root# addjailsw /home/jails -P chown
root# addjailsw /home/jails -P chmod
root# addjailsw /home/jails -P id  <= これは既にあるかも
root# addjailsw /home/jails -P test <= これも既にあるかも
root# addjailsw /home/jails -P [   <= これも既にあるかも
root# addjailsw /home/jails -P ssh -V
root# addjailsw /home/jails -P scp -v
root# addjailsw /home/jails -P groups 

ssh, scp を使う場合にはもうひとつ、やることがある。 sshd のサブプログラムである sftp-server は addjailsw ではコピーされないので、手動でコピーしてやらなければならない。

root# mkdir -p /home/jails/usr/libexec/openssh
root# cp /usr/libexec/openssh/sftp-server /home/jails/usr/libexec/openssh

共有ライブラリの補完

少なくとも Fedora Core 3 では、 glibc 絡みのライブラリの一部がコピーされないようだったので、下記のものを確認して、無ければ追加でコピーしておく。

root# cp -dp /lib/libnss* /home/jails/lib

ユーザの作成

chroot ディレクトリにユーザを追加するには addjailuser というスクリプトを使う。このスクリプトは、chroot ディレクトリの下にそのユーザのホームディレクトリを作成し、システムの /etc/passwd, /etc/shadow, /etc/group から、当該の行を chroot_dir/etc/ 下の対応ファイルにコピーするという処理を行う。よって、まず、システム上にそのユーザとグループを作っておく必要がある。

システムにグループとユーザを作成 (GID は任意)

root# groupadd -g 900 jails
root# useradd -u 901 -g jails -d /home/jails/home/hanako -s /usr/local/bin/jail hanako
root# passwd hanako

通常なら、上記でホームディレクトリの作成とスケルトンファイルのコピーまで実行されるはずだ。ただし、このままでは /etc/passwd の記述に問題があるので編集する。赤字の部分を:

hanako:x:901:900::/home/jails/home/hanako:/usr/local/bin/jail

以下のように変更:

hanako:x:901:900::/home/jails:/usr/local/bin/jail

なお、useradd でホームディレクトリにコピーされたスケルトンファイルのうち .bash_logout は、 X-window を使わせないなら要らない。あると逆に、余分なプログラムを addjailsw しなくてはならず無駄。 OS のディストリビューションやバージョンによっても異なると思うので、内容を確認してから、リネームするか削除してしまおう。

ユーザをchroot環境に登録

addjailuser の書式は:

addjailuser <chroot_dir> <home_under_chroot> <shell> <user>

つまり本稿の例なら:

root# addjailuser /home/jails /home/hanako /bin/bash hanako

/etc/passwd, group, shadow の hanako に関する行が chroot_dir/etc/passwd などに、加工されてペースとされる。ただし、本稿の例のようにグループが共通の場合、ユーザを登録する度にグループ "jails" の行が chroot_dir/group ファイルに重複コピーされてしまうので、二人目以降を登録する際には修正が必要になってくる。