軽量仮想化機能「chroot」と「jail」:FreeBSDのコレ知ってる?(2)(1/2 ページ)
現在主流の仮想化技術は、ハードウェアをソフトウェアで仮想化する方法を採用していますが、そこまで仮想化する必要がないケースもあります。そんな時に便利な2つのリソース・コンパートメント機能を紹介します。(編集部)
非ハイパーバイザ型の仮想化機能
ハイパーバイザタイプの仮想化技術からアプリケーションとして動作する仮想化技術まで、現在はさまざまな仮想化技術が活用されている。メニーコアの時代に入るに従い、こうした仮想化技術はますます活躍の場を広げることになるものとみられる。
しかしながら、マルチコアを備えた強力なマシンが出回る以前の段階から、こうした仮想化技術は利用されていた。現在主流の仮想化技術はハードウェアをソフトウェアで仮想化するという方法を採用しているが、実際にはそこまで仮想化する必要がないケースもある。
今回はそうした仮想化技術の1つとして、最も基本となるchroot(8)を紹介するとともに、chroot(8)の仮想化機能をさらに推し進めたjail(8)を紹介する。これらの技術は簡単に利用できるので、実際にコマンドを試しながら、その効果や感触をつかんでもらえればと思う。
リソース・コンパートメント(資源隔離)による仮想化
例えば、現在複数のUNIXマシンでさまざまなサービスを提供しており、これを1台のマシンに集約したいケースを考える。
単純に考えれば、ハイパーバイザタイプの仮想化ソリューションを導入して、物理マシンを1ゲストOSとして仮想環境で動作させればよいとなる。特に管理の手間がいらないというのであれば、VirtualBoxにそれぞれゲストOSを追加して運用、というスタイルでも十分だろう。
しかし、そのレベルで仮想化しなくても、複数のサービスを1台のマシンに集約することはできる。UNIXではリソースは基本的にファイルとしてアクセスする仕組みになっている。つまり、アクセスできるファイルを制限してやれば、動作しているサービスから見て、その違いに気が付かないようにすることができる。
chroot(2)はこれを実施するための機能(システムコール)だ。chroot(2)を実行すると、ルートパスが指定されたパスに置き換わり、それ以上上部のパスにはアクセスできなくなる。これでサービスを特定のファイル名前空間に隔離することができる。chroot(2)はchroot(8)コマンドを使って利用できる。
chroot(8)で使うファイルを用意
早速chroot(8)を使ってみよう。まず次のように/chroot/a/というパスに、現在動作しているシステムから最低限必要となるファイルをコピーする。
# mkdir -p /chroot/a # cp -Rp /bin /sbin /lib /libexec /usr /var /etc /chroot/a/
デバイスファイルも必要になるので、次のように作成してマウントする。
# mkdir /chroot/a/dev # mount -t devfs devfs /chroot/a/dev
これでchroot向けの閉じた空間の準備ができたので、次のようにchroot(8)を実行して/chroot/a/bin/shを/chroot/a/に閉じ込めた状態で起動する。
# chroot /chroot/a /bin/sh
こうやって起動されたshは/chroot/a/より上のパスにはアクセスできない。shからは/chroot/a/が/として見えるようになる。
名前空間を隔離して上のパスへのアクセスを制限
ファイルシステムの名前空間が隔離されていることを確認してみよう。まず、chrootに入っていない状態で、次のように/testというファイルを作成する。
# ps PID TT STAT TIME COMMAND 1021 v0 Is 0:00.00 login [pam] (login) 1029 v0 I+ 0:00.03 -csh (csh) 1022 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1 1023 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2 1024 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3 1025 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4 1026 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5 1027 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6 1028 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7 1132 0 S 0:00.00 su -l 1133 0 S 0:00.01 -su (csh) 1138 0 R+ 0:00.00 ps # touch /test # ls /test /test #
次にchroot(8)で/chroot/a/に閉じ込めたshから/testを確認してみる。そうすると/testは存在しないというメッセージが出力される。chrootされた状態のshから/testにアクセスしても、実施には/chroot/a/testにアクセスしており、そのようなファイルは存在しないため、このメッセージが出力される。
# ps PID TT STAT TIME COMMAND 1021 v0 Is 0:00.00 login [pam] (login) 1029 v0 I+ 0:00.03 -csh (csh) 1022 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1 1023 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2 1024 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3 1025 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4 1026 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5 1027 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6 1028 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7 1132 0 I 0:00.00 su -l 1133 0 S 0:00.01 -su (csh) 1146 0 S 0:00.00 /bin/sh 1147 0 R+ 0:00.00 ps # ls /test ls: /test: No such file or directory #
もう1つ、ps(1)コマンドの出力に注目してほしい。chrootに入る前とchrootに入った後とで同じプロセス一覧が見えていることが確認できる。chroot(2)はファイルシステムの名前空間を隔離するための機能であり、ほかの要素は隔離しない。つまり、同じプロセスリストが見えるし、ユーザーIDやネットワークインターフェイスも共通だ。
ファイルシステムの名前空間を隔離するというのは、仕組みとして分かりやすい。ほかのリソースは共有するため、仮想化機能としてよりも、セキュリティ強化の目的で使われることが多い。こうしたアプローチはハイパーバイザなどのアプローチと比較してコストが低く、軽量・高速に動作するという特徴がある。
Index
連載:FreeBSDのコレ知ってる?
第2回 軽量仮想化機能「chroot」と「jail」能
Page 1
非ハイパーバイザ型の仮想化機能
リソース・コンパートメント(資源隔離)による仮想化
chroot(8)で使うファイルを用意
名前空間を隔離して上のパスへのアクセスを制限
Page 2
chroot(2)とよく似ているjail(2)の利用手順
ファイルシステムの名前空間以外も隔離できるjail
さらに隔離機能の強化が進むjail
Copyright © ITmedia, Inc. All Rights Reserved.