【Vagrantドキュメント意訳】06.Vagrant共有

# はじめに

本文章は、Vagrant公式サイト内のドキュメント内の[VAGRANT SHARE](https://www.vagrantup.com/docs/share/)に記載されている内容を意訳に近い形で日本語化したものである。
誤訳が含まれている可能性が十分にあることを踏まえて、参考いただきたい。

# Vagrant共有

Vagrant共有は世界中の人に対して、あなたのVagrant環境を共有できるようにし、たった一つのコマンド`vagrant share`によってどんなネットワーク環境にあるVagrant環境とも直接、協調することを可能とする。

Vagrant共有は3つの基本的なモード、機能をもっている。これらの機能は互いに排他的ではなく、いつでも、どのような組み合わせでも有効化出来ることを意味する。

* **HTTP共有**は誰かに与えることができる、URLを生成する。このURLはあなたのVagrant環境に直接つながる道である。このURLを使う人はVagrantをインストールする必要はないので、誰にでも共有ができるということである。これは、webhookのテストや、クライアントやマネージャーへあなたの仕事ぶりを見せるために有用です。

* **SSH共有**はリモート側で`vagrant connect --ssh`を実行することで、誰かがあなたのVagrant環境へ即席のSSHアクセスを許可する。これは、ペア・プログラミングや、共通の問題に対するデバッグなどに有用である。

* **一般的な共有**はリモート側で`vagrant connect`を実行することで、あなたのVagrant環境の開かれたポートへのアクセスを許可する。これは、リモート側がLAN上のコンピュータであるなど、あなたのVagrant環境にアクセスしたい場合に有用である。

それぞれの詳細については、左側のサイドバー内の個別のセクションで対象としている。同様に、この機能のセキュリティとの密接な関係についての詳細についてのセクションもある。

Vagrant共有は使用するにあたって[HashiCorpのAtlas](https://www.vagrantup.com/docs/other/atlas.html)のアカウントが必要である。

# HTTP共有

Vagrant共有は、Vagrant環境内で稼働したHTTPサーバへのアクセスするために、アクセス可能なURLを生成する。これは"HTTP共有"として知られており、`vagrant share`を使用する際のデフォルトになっている。

この共有のモードはアクセス可能なURLを生成するため、アクセスする側は、そのVagrant環境を見るためにVagrantをインストールする必要はない。

これには多くの有益な使用方法がある。インターネットにVagrant環境を公開することでwebhookをテストすることができ、あなたの作業をクライアントや、チームメイトやマネージャーなどへ見せることができる。

## 使い方

HTTP共有を使う方法は、`vagrant share`を実行するだけである。

```bash
$ vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 192.168.163.152
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: ghastly-wombat-4051
==> default: Your Vagrant Share is running!
    default: Name: ghastly-wombat-4051
==> default: URL: http://ghastly-wombat-4051.vagrantshare.com
```

VagrantはVagrant環境内で稼働しているHTTPサーバを検出し、共有へアクセスするために使用する終点を表示する。共有をしたい誰かにこのURLを教えるだけで、その人々はVagrant環境へアクセスすることができる。

Vagrantが環境内のサーバーのポートの検出に問題が発生した場合、より明確にするために`--http`や`--https` フラグを使用する。

この共有は`vagrant share`が実行されている間、アクセス可能である。`Ctrl-C`を押すことで共有セッションは閉じられる。

> 警告：このURLは、それを知っているだれでもアクセス可能であり、機密事項を共有する場合には十分注意すること。

## 無効化

アクセス可能なURLを生成しないようにするためには、`vagrant share`を`--disable-http`フラグと共に使用する。これはそのほかの方法によって環境を共有し、URLを生成しない。

## 失われたアセット

共有されたWebアプリケーションは**相対パス**を画像、スタイルシート、javascriptなどのアセットを読み込むために使うべきである。

開発中のWebアプリケーションはリモートからアクセスされる。これは、`<img src="http://127.0.0.1/header.png">`のような、ハードコーディングされたアセット(画像、スタイルシートなど)を持つURLの場合、共有にアクセスした人々はロードすることができない。

多くのWebフレームワークやツールキットは相対パスを生成するための設定やヘルパーをもっている。例えば、もしあなたがWordPress開発者であれば、[Root Relative URLs](http://wordpress.org/plugins/root-relative-urls/) プラグインが自動的にこれを行う。

アセットへの相対URLは通常、多くの場合におけるベスト・プラクティスであるので、この通りにするべきである。

## HTTPS (SSL)

Vagrant共有はSSLを介してアクセスされるSSLポートも公開することができる。例えば、`http://foo.vagrantshare.com`にアクセスする代わりに、`https://foo.vagrantshare.com`でアクセスすることができる。

`vagrant share`はデフォルトで開発環境の443番ポートでSSLのトラフィックを監視する。それが見つからなかった場合、SSLはデフォルトで無効となる。

アクセス可能なSSLポートを指定するために`--https`フラグを設定することでSSLを強制することができる。

# SSH共有

Vagrant共有は`vagrant share`に`--ssh`フラグを追加することによって、Vagrant環境にリモートのSSHがアクセスできるようにすることを著しく簡単に行える。

簡単なSSHの共有は、問題解決のために同僚にアクセス権を与えたい場合に、信じられないくらい有用である。加えて、望むのならばVagrant環境でペアプログラミングも可能である。

SSH共有はセキュリティ的な判断からデフォルトでは無効となっている。SSH共有を有効化するには、`vagrant share`を呼び出す際に`--ssh`フラグを単に付与するだけである。

## 使い方

`vagrant share --ssh`を実行するだけである。

SSH共有が有効化されたとき、VagrantはSSHアクセスのための新しい鍵ペアを生成する。公開書きは自動的にVagrantマシンに格納され、秘密鍵はVagrant共有の監視サーバへアップロードされる。秘密鍵は、プロンプトに対して入力したパスワードを使用して暗号化される。このパスワードはVagrantによってネットワークを渡ることは絶対にない、
そして、パスワードは、我々やあなたの共有名を知っている他の誰かが簡単にあなたのマシンにアクセスするのを妨げる、更なるセキュリティ・レイヤである。

`vagrant share --ssh`を実行したあと、あなたの共有の名前を出力する。

```bash
$ vagrant share --ssh
==> default: Detecting network information for machine...
    default: Local machine address: 192.168.163.152
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
    default: SSH Port: 22
==> default: Generating new SSH key...
    default: Please enter a password to encrypt the key:
    default: Repeat the password to confirm:
    default: Inserting generated SSH key into machine...
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: itty-bitty-polar-8667
==> default: Your Vagrant Share is running!
    default: Name: itty-bitty-polar-8667
...
```

先ほど出力された共有の名前をNAMEとして、`vagrant connect --ssh NAME`を実行することで誰でもあなたのVagrant環境にSSHで直接接続できる。

```bash
$ vagrant connect --ssh itty-bitty-polar-8667
Loading share 'itty-bitty-polar-8667'...
The SSH key to connect to this share is encrypted. You will
require the password entered when creating the share to
decrypt it. Verify you have access to this password before
continuing.

Press enter to continue, or Ctrl-C to exit now.
Password for the private key:
Executing SSH...
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Fri Mar  7 17:44:50 2014 from 192.168.163.1
vagrant@vagrant:~$
```

もし、秘密鍵が暗号化されていれば（デフォルトではそうなっている）、接続した人は、秘密鍵を複合するためのパスワードのためのプロンプトが表示される。

SSH共有セッション用のほかのセキュリティレイヤを追加するために`--ssh-once`などのような追加的なフラグが適応可能である。このフラグを使用した場合、鍵ペアが破壊される前の任意の新たな接続を防止するために、たった一つだけ`vagrant connect --ssh`を試みることができる。

# Vagrant接続

VagrantはSSHやHTTPだけでなく、いずれか、または、すべてのポートをVagrant環境のために共有することができる。`vagrant connect`コマンドは接続した人に、共有Vagrant環境と対話するために使用するための静的IPアドレスを与える。このIPアドレスへのいかなるTCPトラフィックも共有Vagrant環境に送信される。

## 使い方

`vagrant share`を呼ぶだけである。これはリモート接続用に多くのポートを自動的に共有する。Vagrant環境が静的IPもしくはDNSアドレスを持っていれば、すべてのポートが利用できる。しかしながら、Vagrantはマシン上の転送用ポートだけ公開することもできる。

`vagrant share`を呼んだ際の共有名を覚えておき、これをあなたのマシンに接続したがっている人に渡す。うけとった彼らは単に`vagrant connect NAME`を実行するだけである。これは彼にあなたのVagrant環境にアクセスできる静的なIPアドレスを与える。

## どうやって動くか？

`vagrant connect`はVagrantが最も適切なように、仮想マシンを管理して動く。`vagrant connect`はVirtualBoxまたはVMWare(より多くのプロバイダが近々サポートされる)を使用して、RAM上で20MB程度を占める小さな仮想マシンを生成する。

この小さな仮想マシンに送られたトラフィックは、直接送られたかのように共有されたVagrant環境の代理となる。

## 気を付ける点：Vagrantの非セキュアな鍵VAGRANT INSECURE KEY

Vagrant環境またはBoxを(多くの公開Boxがそうであるが)Vagrantの非セキュアな鍵ペアを使用している場合、SSHは接続したい誰にでも簡単にできる。

信頼できる誰かと共有しているのが望ましいが、あるクラスや会議と共有するかもしれない環境と、SSHできるようにしたくないだろう。

この場合、我々はVagrantマシンから非セキュアな鍵を変更するか、削除するかを推奨する。

最後に、我々はVagrant共有が使用されているときに、Vagrantの秘密鍵が明確に許可されているものでなければ積極的に拒否するように、開発を進めていることを言っておきたい。しかし、まだその機能は実装されていない。

# セキュリティ

あなたのVagrant環境を共有することは、当然のながらいくつかのセキュリティに対する関心ごとが浮かんでくるだろう。

Vagrant共有の基本的なセキュリティ機構は、SSHの暗号鍵による匿名性を通じて保全される。加えて、アクセス制御とセキュリティ管理を手助けするためにいくつかの設定オプションがある。

* `--disable-http`はHTTPのURLによる公開を行わない。この設定がなされた場合、共有に対しては`vagrant connect`でしかアクセスできない。
* `--ssh-once`は共有環境へのSSHする人間を同時に一人だけ許可する。一人目のSSHアセスがあった以降は、鍵ペアは物理的に削除され、SSHは誰にもアクセスすることができなくなる。

これらのオプションに加えて、補助するために実装したほかの機能もある。

* Vagrant共有はエンド・トゥ・エンドのTLS接続を使用する。暗号化されていないTCPストリームでさえ、様々なプロキシを通じて暗号化され、ローカル・プロキシとVagrant環境の間の最後のローカルな通信経路の間だけ暗号化されないようにする。
* 共有名、たとえばhappy-panda-1234のようなものは、40,000,000を超える名前のプールからランダムに選ばれる。そして、定期的にこのプールを拡大するように単語を追加し続けている。だれかがあなたの共有名を推測するできるようなことは、ありえない。
* SSH鍵はデフォルトで暗号化され、そのパスワードはわれわれのサーバに転送されることなく、さらに、ネットワークを流れることのないパスワードを使用する。
* SSHはデフォルトでは共有されない、明確に`--ssh`フラグによって共有される必要がある。
* 我々が構築したWebインタフェースは、将来的には、共有履歴と基本的なアクセスログが見られるようになるだろう
* 共有セッションは短時間(現状1時間)で終了するが、共有マシンまたはWebインタフェースを介して`ctrl-c`によって手動で終了させることもできる。

`vagrant share`を実行することについて理解しておくべき最も重要なことは、共有名をしているだれでもがあなたのVagrant環境にアクセス可能にするという点である。共有が実行されていないときに、それは不可能である。

後ほど、ACLを追加することでこの機能のセキュリティを拡張していく。それにより誰が接続しているかに基づいて明確なアクセスの許可を行えるようになる。

最大のセキュリティ策は、あなた自身でVagrant共有サーバを実行することも許可することである。このオプションはまだ提供できない。

# カスタム・プロバイダ

> 警告：上級者向け。これはVagrantプラグインの開発に関する内容である。もし、これに関して興味がない、または、Vagrantをただ始めたいだけならば、ここはとばしておくのがよいだろう。

もし、[カスタムVagrantプロバイダ](https://www.vagrantup.com/docs/plugins/providers.html)を開発しているなら、Vagrant共有でそれをよりうまく動作させるためのちょっとしたコツが必要だろう。

今のところ、これはたった１ステップだけである。

`public_address` プロバイダの能力 - Vagrantからゲストへアクセスするために使うことのできるアドレスを指す文字列を返すための、この能力を実装すべきである。これは、グローバルにルート制御できるアドレスである必要はない。ただ、Vagrantが稼働しているマシンからアクセスできる必要があるだけである。アドレスを検出できなければ、`nil`を返す。

# 関連記事

* 前の記事：[【Vagrantドキュメント意訳】05.Vagrantコマンド詳細](http://qiita.com/ringo0321/items/c3720a54855e9c961a91)
* 次の記事：[【Vagrantドキュメント意訳】07.Vagrantfile詳細](http://qiita.com/ringo0321/items/ddf1c8c40014eb88b0b6)