それ自体では chroot する機能のない ssh や ftp サーバをユーザに開放する場合、システムを歩き回らせないようにするため chroot 環境を導入したい。或るディレクトリに簡易版のシステムを築いておき、特定のユーザはログインと同時にそこ (牢屋=jail) へ閉じ込め、本来のシステムファイルにはアクセスできないようにするわけだ。本稿では、 Jail というユーティリティによる方法と、手動整備 + PAM による chroot 環境構築を取り上げる。ニーズに応じて環境をよりきめ細かく作り込もうと思うなら、後者の稿が役に立つはずだ。
Jail は chroot 環境の構築を楽にしてくれるツール群。核となる jail バイナリは、本物のシェルとの間のラッパーとして働き、そのユーザを指定した chroot 環境に「閉じ込める」。Jail の最もありがたい点は、 chroot ディレクトリ下のデバイスファイルや基本バイナリの整備を、付属の Perl スクリプトがカバーしてくれることだ。執筆時点でのバージョンは 1.9a。この章では、ログインと、 ssh, scp による被接続が「とりあえず動く」ところまで解説する。ただし Fedora Core 3 (kernel-2.6.x, glibc-2.3.x) では、 Jail ユーティリティで構築した chroot 環境は正常に機能しなかった。うまくいかない場合は次章を読むべし。
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_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/ 下の対応ファイルにコピーするという処理を行う。よって、まず、システム上にそのユーザとグループを作っておく必要がある。
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 のディストリビューションやバージョンによっても異なると思うので、内容を確認してから、リネームするか削除してしまおう。
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 ファイルに重複コピーされてしまうので、二人目以降を登録する際には修正が必要になってくる。