vagrant ユーザよ、その VM は安全なのか? (veewee のすゝめ)

タイトルは単なる煽りなので、気にせず先に進みましょう。

最近 chef や puppet、fabric などの自動化ツールの流行を受けて、
その実験環境として vagrant もかなり使われているようです。
vagrant は virtualbox の CLI ラッパーとして非常に良くできており、実験環境を構築するのに非常に便利なツールです*1
そして、多くの vagrant 紹介記事が書かれているのですが、そこで気になったことがひとつあります。

それは vagrant を利用する際に vagrantbox.es に用意されている VM を利用しようと紹介されていることです。
vagrantbox.es は各々が作った VM イメージ(通称 box)を持ち寄って共有しあうサイトです。
新しくリリースされた distro. のイメージや、ツール(chef, puppet, guest addition など)があたらしいものが提供されているため、
vagrant をすぐ使いはじめることができます。

vagrantbox.es への懸念

一見、特に問題ないようにみえるこの仕組みですが、先程述べた気になるところはこの vagrantbox.es です。
ここは「各々が作った VM イメージ」を共有するサイトです。
自分で VM を作ったら、リストを更新して pull request を投げるだけで、新しいイメージを共有することができます。

では、ここで共有されている VM イメージはどうやって作られたものなのでしょうか?
この VM イメージの設定はどのようになっているのでしょうか?
そこにバックドアはありませんか? トロイは仕掛けられていませんか?

vagrantbox.es の管理者は VM の中身のすべてを見ているわけではありませんから、
このイメージが安全であることは誰も保証していません。
もし VM 作成者の中に攻撃者が混じっていた場合、イントラネットの中で悪意のあるスクリプトを実行させることができるかもしれません。
普段はファイアウォールに守られているサーバにアクセスされる恐れもあります。

もちろんこれは攻撃者が紛れ込んでいた場合のお話で、今公開されている VM イメージがそうであると断定できるものではありません。
しかし、ダウンロードした VM がクラックされたものかどうかを判定することはとても難しいものです。
果たして vagrantbox.es を利用するのは適切なのでしょうか。

僕は判断がつかないため、自分で VM を作るという選択を選んでいます。
そこで利用するのが veewee というツールです。

VM 作成自動化ツール veewee

veewee は vagrant のプラグインとして動作し、新しい VM イメージを作るツールです*2

仕組みは非常に簡単で、各 distro. のインストーラ CD を使って新しい環境をインストールするというものです。
他にも

  • ruby のインストール
  • chef, puppet のインストール
  • vagrant アカウントの作成
  • virtualbox guest additions のインストール

を実行してくれます。

ローカルで OS のインストールを行うため、vagrantbox.es から VM イメージをダウンロードするのと比べると時間はかかりますが、
インストールの実行は(ほぼ)自動的に行われるため、バックグラウンドで動かしておけば問題ありません*3

veewee のインストール

基本的には gem install veewee で使えるようになりますが、知り合いから環境面で苦労したという話を聞いたので、
ここでは既にインストールしている他の gem に影響されない方法をお伝えします。
追記(3/15 21:20): 今日リリースされた vagrant 1.1 では gem を使わないようになったようなので、この方法では最新版は利用できなくなりました…

僕もこの記事を書くにあたって gem install しようとしたら、他の gem とバッティングしてインストールに失敗しました orz*4

まずは作業ディレクトリを作り、その中に Gemfile を作ります。

$ mkdir veewee-work
$ cd veewee-work
$ bundle init
Writing new Gemfile to /Users/tkomiya/veewee-work/Gemfile

もし bundle コマンドが入っていない場合は、gem install bundler してみてください。

そして、生成された Gemfile のひな形を書き換えます。
利用する gem は vagrant と veewee のふたつです。

source "https://rubygems.org"

gem 'vagrant'
gem 'veewee'

そして、bundle コマンドを実行して依存ライブラリをインストールします。
このとき、他の環境に影響を与えないよう --path オプションを指定しておきます。

$ bundle --path vendor/bundle --binstubs
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
Installing rake (10.0.3)
Installing libxml-ruby (2.6.0) with native extensions
Installing CFPropertyList (2.0.17)
Installing Platform (0.4.0)
Installing ansi (1.3.0)
Installing archive-tar-minitar (0.5.2)
Installing builder (3.2.0)
Installing ffi (1.4.0) with native extensions
Installing childprocess (0.3.9)
Installing diff-lcs (1.2.1)
Installing json (1.7.7) with native extensions
Installing gherkin (2.11.6) with native extensions
Installing multi_json (1.6.1)
Installing cucumber (1.2.3)
Installing erubis (2.7.0)
Installing excon (0.20.0)
Installing fission (0.4.0)
Installing formatador (0.2.4)
Installing mime-types (1.21)
Installing net-ssh (2.2.2)
Installing net-scp (1.0.4)
Installing nokogiri (1.5.6) with native extensions
Installing ruby-hmac (0.4.0)
Installing fog (1.9.0)
Installing posix-spawn (0.3.6) with native extensions
Installing grit (2.5.0)
Installing highline (1.6.15)
Installing i18n (0.6.4)
Installing log4r (1.1.10)
Installing open4 (1.3.0)
Installing popen4 (0.1.2)
Installing progressbar (0.20.0)
Installing rspec-core (2.13.1)
Installing rspec-expectations (2.13.0)
Installing rspec-mocks (2.13.0)
Installing rspec (2.13.0)
Installing ruby-vnc (1.0.1)
Installing thor (0.17.0)
Installing vagrant (1.0.7)
Installing veewee (0.3.6)
Using bundler (1.1.3)
Your bundle is complete! It was installed into ./vendor/bundle

結構たくさんの gem パッケージが入りましたね。
ここまでで veewee のインストールは完了です*5

veewee を使って VM イメージを作る

では、実際に VM イメージを作成してみましょう。
ここでは CentOS 6.3 をサンプルにご紹介します。

まずは VM の定義ファイルを生成します。

$  bin/vagrant basebox define CentOS-6.3-x86_64-minimal CentOS-6.3-x86_64-minimal

このまま VM のビルドを実行してもよいのですが、そのままの設定では海外から ISO イメージのダウンロードすることになってしまうので
さくっと終わらせるために国内からダウンロードするよう定義を書き換えます。
書き換える対象は definitions/CentOS-6.3-x86_64-minimal/definition.rb の :iso_src と書いてある行です。

  :iso_src => "ftp://ftp.kddilabs.jp/Linux/packages/CentOS/6.3/isos/x86_64/CentOS-6.3-x86_64-minimal.iso",

定義ファイルを書き換えた後、VM のビルドをスタートさせます。
次のコマンドを実行すると virtualbox が起動し、OS のインストールが動き出します。
一番最初の場面で、ISO イメージをダウンロードして良いかの確認が行われるので、yes と答えておきましょう。

$ bin/vagrant basebox build CentOS-6.3-x86_64-minimal

しばらく放置しておくと

[CentOS-6.3-x86_64-minimal] The box CentOS-6.3-x86_64-minimal was build succesfully!

と表示されて、VM のビルドが完了します。

この段階では、VM のインストールが終わった状態(まだ VM は稼働中)なので、VM イメージを抽出するために export します。

$ bin/vagrant basebox export CentOS-6.3-x86_64-minimal CentOS-6.3-x86_64-minimal
$ ls
CentOS-6.3-x86_64-minimal.box	Gemfile.lock			definitions/			tmp/
Gemfile				bin/				iso/				vendor/

ここまで実行すると CentOS 6.3 の VM イメージを取得することができます。
僕の MacBook Air (2011/SSD) では、VM イメージの作成まで、だいたい 10〜20分ぐらいでした(ISO ダウンロード時間除く)。

まとめ

  • vagrantbox.es を信頼していいか僕にはわからない
  • veewee を使えば VM 作れるよ
  • vagrant 便利だね

OSS は信頼の上でなりたっているので、疑ってかかるというのはあまりやりたくないのですが、
VM という大きいものはだれかが検証できるものではないので、仕方がない部分があるのではないかと思います。
この部分は、どこか信頼できる機関(人?)が関わっているともう少し幸せになれるのかもしれません。

似たように AMI も共有がなされているようですが、そっちはどのようになっているのかちょっと興味があります。
どなたか AWS 使いの方、どうなってるのか教えて下さい。

*1:最新版の vagrant 1.1 では AWS, VMWareFusion などの 3rd party プラグインも用意されているようです

*2:単体でも動作しますが、ここでは説明を割愛します

*3:kickstart の仕組みを使っています

*4:net-ssh や net-scp は鬼門のような気がしますね…

*5:メモ: 知り合いは nokogiri のインストールでエラーが出たそうです。ここが参考になったとのこと http://stackoverflow.com/questions/5528839/installing-nokogiri-fails-libiconv-missing