仮想環境に関する基礎知識

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次


==============================================================================
第3特集 1台で実現する複数の仮想環境
						広瀬雄二 / yuuji@koeki-u.ac.jp
						東北公益文科大学
==============================================================================


電算化が進み、計算機が日常業務に占める割合が大きくなって来た昨今では、サー
バマシンの停止は業務の停止を意味する。そのような意味で、新たなサーバを導
入することよりも、稼動中のサーバマシンを「安定した状態に保つ」ことと「ト
ラブルなくOSのアップグレードを行なう」ことのほうが責任は重く、経験を要す
る大仕事といえよう。そのような作業を行なう場合、「仮想環境」を活用するこ
とでスムーズかつ安全に遂行できることが多い。

本特集では、Unix上で利用できる仮想環境実現機構をとりあげ、運用中のシステ
ムの機能喪失を未然に防ぐための仮想環境活用法を紹介する。

Part2ではUnix上の歴史ある仮想環境機構であるchrootの効果的な運用設定技術
について解説する。そして、Part3, Part4ではそれぞれ、FreeBSD独自の機構で
あるjail、LinuxのUMLをとりあげ効果的な活用例を紹介していく。

■
■ Part1 仮想環境に関する基礎知識
■

●仮想環境とは

Unixを動かすにせよ、他のシステムを動かすにせよ、一台のコンピュータの中で
はひとつのシステムが動くのが一般的である。別のシステムを動かしたかったら、
もう一台のコンピュータを用意することになる。このような原則を外れ、ひとつ
のオペレーティングシステムの上で、本来のシステム環境とはある程度独立した
システム環境を構築することができる。このようにして生み出されるものが仮想
環境であり、その実現方法には様々なものがある。

---[図 い]------------------------------------------------------------

    【システムから見た場合】

  +-------------------------------------+
  |					|
  |					|
  |  +-------+ +-------+ +-------+	|
  |  | 利用  | | 利用  | | 利用  |	|
  |  | 環境1 | | 環境2 | | 環境3 |	|
  |  +-------+ +-------+ +-------+	|
  |					|
  |					|
  |	本来のシステム環境		|
  |	   (基本となるOS)		|  ←1台のコンピュータ
  +-------------------------------------+
      各々の利用環境は基本システムから見たら
      普通のプロセス


    【ユーザから見た場合】

  +----------------------+
  |                      |
  |  本来のシステム環境  |   +-------+ +-------+ +-------+
  |     (基本となるOS)   |   | 利用  | | 利用  | | 利用  |
  |                      |   | 環境1 | | 環境2 | | 環境3 |
  +----------------------+   +-------+ +-------+ +-------+

	独立した利用環境に見える

-----------------------------------------------------------------------


●仮想環境の利用意義

単一のシステム上で仮想環境を動かすことにはいくつかの利点があるが、代表的
なものを挙げるとセキュリティ面の利点と、安定したシステム運用に役立つ利点
が考えられる。

・安全性の確保
なんらかのUnixシステムを運用する場合、それが重い意味を持つものであればそ
れだけシステムを正常な状態に保つことが重要になってくる。とくにインターネッ
トを通じてWebサービスなどの公開をしている場合には、つねにクラックの危険
性と隣合わせになっているため、データの改ざんやシステムそのものの破壊の可
能性を考慮しなければならない。しかし、どんなに万全にしているつもりでも、 
Webサーバプログラムにセキュリティホールが見付かり、運悪くその穴を自分の
管理しているサーバがつかれて予期せぬ改ざんを加えられる可能性がないとはい
えない。そのような場合にWebサービス自体を仮想環境の中に閉じ込めておけば、
万が一の被害をその環境内に留められる可能性が高くなる。

どのようなクラッキングでも、クラック対象となるホストで任意のプログラムを
起動できるようにすることを第一の目標とする。典型的にはネットワークサービ
スを行っているデーモンプログラムを異常動作させ、プログラムの動作している
のと同じ権限でシェルをプログラムを起動する。シェルさえ起動できてしまえば
あとは対象ホストの任意のコマンドを自由に起動できるようになるので、その後
はまさに「やりたい放題」となってしまう。もし、デーモンプログラムがroot権
限で動いているとすれば、対象ホストの全てのファイルを好き放題にアクセスで
きることになる【註: このため多くのネットワークサービスデーモンは可能な限
りroot権限で動かないようにするのが主流となっている】。

クラッキングの目的が単なるいたずらの場合は、侵入したホストは、さらに別の
ホストを攻撃する拠点となる「踏み台」にするだけで、ホスト自体にはあまり興
味を示さないかもしれない。しかし、もし侵入したホストから何らかの情報を手
に入れようと考えていたならば、root権限がなくても「次の悪事への手立て」と
なる情報を手に入れることが出る。たとえば、パスワードファイルやグループファ
イルを見ることでそのホストやネットワークを管理しているのが誰なのかといっ
たことの察しがおよそついてしまう。もし、暗号化されたパスワードが入手でき
たとしたら、強大なCPUパワーを使って力ずくで破ることも不可能ではないだろ
う。現在のパソコンは、少し前のスーパーコンピュータ並の能力を持っている。

このような可能性を考えると、ネットワークサービスデーモンプログラムの動作
する環境からシステム管理ファイル(/etc 以下のファイルなど)が見えることが
好ましくないのは理解できるだろう。本来のシステムと分離した仮想環境を用意
し、そこでサービスデーモンを起動することで「もしも」の時の耐性が確実に向
上する。

・システム改変の事前調査

日常行うOSのパッチ当てやバージョンアップの必要がある場合も、「ぶっつけ本
番」で行なうのは避けたいところである。このようなときに、本来のシステムと
近い環境で仮想環境を作っておくことで、「事前演習」を行うこともできる。

たとえばOSのアップグレードを行なう場合、現在動かしているバージョンと全く
同じように機能するかを実際に確かめたい。理想的には、もう一台同じ構成の、
「予備」となるマシンを用意して、予備マシンでアップグレード作業を確認して
から稼動中のマシンの処理をするのが良いだろうが、実際にはそうした予備機を
用意すべきと痛感するのがサーバマシンが本格的に利用されるようになったあと
だったりするケースも多い。あるいは、負荷の低い予備機ではうまく動いたもの
が、負荷の高い本番機ではうまく行かないということもあったりして、予備機が
あれば万全だとも一概には言えない。

いずれにせよ稼動中のシステムのアップグレード作業はリスクをともなう非常に
繊細な作業である。このような場合も仮想環境を利用すると、作業を安全に進め
る助けとなる。たとえば、

	・サーバプログラムの動作自体を仮想環境に閉じ込めることで、仮想環
	境をまるごと別のマシンにコピーして実地調査が行なえる

	・新しいOSを仮想環境内で動かして動作確認

といったことも可能となる。

%%%%% ↑↑↑↑UMLの解説とあってますか??????????



●仮想環境のタイプ

ひとつのシステム上で、それとは独立した利用環境を生み出す、という意味では
多くの種類が存在するが、ここではUnixシステムで利用できるものに限定して話
を進めよう。Unix上で仮想環境を実現するものにはいくつかあるが、それらは大
きく

	* エミュレータタイプ
	* OS内プロセスタイプ

の二つに分けることができる。以下の説明では、図[い]の本来のシステムが走っ
ている利用環境のことを「ホスト環境」と呼ぶことにして、仮想環境により得ら
れるものと区別することにする。

・エミュレータタイプ

CPUを含めたコンピュータそのものの動作をエミュレートして、ホスト環境とは
違うOSをホスト環境内で動かすことができる。コンピュータの電源ONから始めて、
OSのブートシーケンスを全て動作中のコンピュータとは独立して動かすもので、
代表的なものに VMware 【註: http://www.vmware.com/ 】 や
Bochs 【註: http://bochs.sourceforge.net/ 】 などがある。

  【VMware】

  VMwareは、i386アーキテクチャのPC-AT互換機の完全なエミュレーションを行
  なう VMware Inc. の商用ソフトウェアである。対応OSは、Windows と Linux 
  で、Linux版はFreeBSDやNetBSDのもつ Linux emulation 機能を介して利用す
  ることができる【註: FreeBSD/NetBSD では現在のところ VMware version 3ま
  で対応】。VMwareは実際の機械と同様のBIOSも内蔵し、セットアップ画面で設
  定変更することもできる【図 ろ】。

---[図 ろ]------------------------------------------------------------
%img vmware-bios.png
----------------------------------------------------------------------

  VMwareでは、命令コードの実行は本来のCPUを利用するので、実効速度は本来
  のCPU速度より若干落ちる程度である。メモリさえ十分に登載していれば仮想
  環境として利用することも現実的である。実際、大学の授業で利用する教室の
  PC で複数のOSを利用させる目的でVMwareを利用している例もある【註:
  UNIXUSER 2003年???月号 ルート訪問日記 参照】。ちなみに、本稿執筆に当たっ
  ての実験環境の構築も VMware を利用している。


---[コラム FreeBSD 5.1-RELEASE on VMware]-----------------------------

FreeBSD 5.1-RELEASE(以下 5.1R)を VMware にインストールすると、ゲストOSと
して動く5.1Rのパフォーマンスが激烈に低下するという症状が出る。コマンドを
一個打った反応が返るまで数分かかったりするという実用には程遠い状態になっ
てしまうものだが、これはゲストOSのカーネルを再構築することで解決できる。

カーネルソースを展開し、/usr/src/sys/i386/conf にある NOTES ファイルを参
照すると、

# CPU_DISABLE_CMPXCHG disables the CMPXCHG instruction on > i386 IA32 
# machines.  VmWare seems to emulate this instruction poorly, causing 
# the guest OS to run very slowly.  Enabling this with a SMP kernel
# will cause the kernel to be unusable.

という記述が見つかる。この指示にあるとおり、カーネルコンフィグファイルに

	options CPU_DISABLE_CMPXCHG

を追加してコンパイルし、でき上がったカーネルでブートすることで速度低下の
問題は解決する。
----------------------------------------------------------------------

  【bochs】

  i386のソフトウェアエミュレーションを行なうのがbochsである。このため、
  実行速度はネイティブに比べてかなり遅くなる反面、i386アーキテクチャマシ
  ン以外でも利用できる【註:
  http://bochs.sourceforge.net/doc/docbook/user/x200.html 参照】。

  【図 は】は bochs-2.0.2 を起動し、FreeBSD 5 のインストーラを動かしてみ
  たものである。
---[図 は]------------------------------------------------------------
%img bochs-1.png
%img bochs-2.png
----------------------------------------------------------------------

  bochsは、CPUインストラクションを含めて全てソフトウェアエミュレートして
  いるので実機よりもかなり速度は低下する。このため、別のOSを実用的な速度
  で動かすことは向かない。実際にはi386アーキテクチャで動くOSやデバイスド
  ライバの実装の勉強やデバッグ、DOSなど古いアーキテクチャでしか動かない
  ソフトウェアの動作環境確保というのがbochsの有効な利用目的といえる。

・OS内プロセスタイプ

エミュレータタイプが、全く別のコンピュータをソフトウェア的に作りだし、そ
こでホスト環境とは全く独立したOSを動かすのにたいし、仮想環境をホスト環境
の通常プロセスとして生成するのがこちらのタイプである。Unix系OSに古くから
存在する `chroot' が代表的なもので、本来のOS環境がもつ資源のうち、一部の
みを利用できるように制限を加えたものを仮想環境として提供する。chrootでは

---[図 に]------------------------------------------------------------
  +--------------------- ファイルシステム -----------------------------+
  |                    (/)                                             |
  |                     |                                              |
  |         v----v---...+-------v----------------v---.....             |
  |       bin/ boot/ ...       etc/             usr/  ....             |
  |        |     |              |                |                     |
  | v--v---+-.. v+----v-...  v--+---- ..    v----+-------v---...       |
  | [  cat ..  boot0 boot1. hosts     .. X11R6/ bin/     |             |
  |                                        +---------chrootdir/ ---+   |
  |                                        |           (/)         |   |
  |                                        |            |          |   |
  |                                        |  v----v----+---v---.. |   |
  |                                        | bin/ etc/     usr/    |   |
  |                                        |       〜 〜 〜 〜     |   |
  |                                        +-----------------------+   |
  +--------------------------------------------------------------------+

----------------------------------------------------------------------

ファイルシステム中の特定のディレクトリを基準として、そのディレクトリをルー
トディレクトリと見なしたプロセスを生成する。chroot内で起動される全てのプ
ロセスは基準ディレクトリをルートとするディレクトリツリー内部のファイルし
かアクセスできない。こうすることでホスト環境の持つ /etc ディレクトリなど
は一切アクセスできなくなるのでシステム管理上重要な意味を持つファイルの漏
洩事故などが未然に防げる。


%%%% 以下はPart4(UML)の内容によって劇的に変えた方が良いような…
%%%% どうまとめていいもんかわかっていません……
●タイプ別のメリット/デメリット

いずれの仮想環境機構も、「もうひとつの利用環境」を生み出すものであるから、
その中で何をやりたいかによっておのずとどのタイプの利用が適しているかが決
まってくる。エミュレータタイプ最大の利点はなんといっても、その中でどんな
OSでも起動できるという点だろう。全く新規のOSをインストールできるので、新
しいOSに乗り換える際の参考になるだろう。エミュレータタイプを利用する場合
の特徴をまとめると以下のようになる。

	1. まったく新しいOSを動かすことができる
	2. 仮想的なハードウェアで動かすので、そのマシンのスペック
	   (メモリ容量、HDD容量)などを簡単に変えられる反面、ホスト環境と
	   の共有ができない
	3. 完全に独立したOSになるので一台のホストを管理するのと全く同じ管
	   理コストがかかる
	4. 環境内で動くBIOSを含めて全てをエミュレーションで行なうのでホス
	   トシステムのCPU負荷が高い

OS内プロセスタイプの特徴はちょうど上記のものと反対の関係にある。別のOSを
動かすといったことができない代わりに、ホスト環境の資源を活用した動作が可
能となる。

%%%%% ここに一文欲しい…

本特集では、OS内プロセスタイプの特徴を利用して、サーバマシンのセキュリティ
を確保し、なおかつ安全なシステムアップグレードを検証するための方法を考え
て行く。


yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]