Windows10 + Vagrant + Ubuntu16.04 で環境構築

## Ⅰ. 目的
LANからアクセス可能なUbuntu16.04の仮想環境を作成します。
仮想マシンへのログインは公開鍵認証を用い、パスワード認証は禁止とします。

## Ⅱ. 環境
* Windows10
* Vagrant 1.9.3
* VirtualBox 5.1.18
* Ubuntu 16.04

## Ⅲ. 使用するツールのインストール
#### 1. VirtualBox
[Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)でインストーラを取得します。
Windows環境にインストールするので `Windows hosts` のリンクをクリックし、インストーラをダウンロードします。
#### 2. Vagrant
[Download Vagrant](https://www.vagrantup.com/downloads.html)でインストーラを取得します。
Windows環境にインストールするので「Windows」ラベルの下にある `Universal (32 and 64-bit)` のリンクをクリックし、インストーラをダウンロードします。
#### 3. PuTTY
[Download PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)でインストーラを取得します。
Windows環境にインストールするので「MSI (‘Windows Installer’)」ラベルの下にあるインストーラ(32bit,64bitいずれかを選択)のリンクをクリックし、インストーラをダウンロードします。
## Ⅳ. Vagrant環境構築
#### 1. Vagrant用のフォルダを作成
Vagrant用に任意のフォルダを作成します。
このフォルダにはVagrantの設定ファイルなどを格納します。
今回は `C:\vagrant` フォルダを作成しました。
#### 2. UbuntuのBoxの入手と初期化
##### ⅰ. 作成したフォルダに移動してコマンドプロンプトを起動
##### ⅱ. Vagrantの初期化  
以下のコマンドで行います。  

```
C:\vagrant> vagrant init bento/ubuntu-16.04
```  
Boxファイルは [chef/bento](https://github.com/chef/bento) で公開されているものを使用させていただきます。

##### ⅲ. BoxのダウンロードとVagrant起動  
以下のコマンドで行います。  

```
C:\vagrant> vagrant up --provider virtualbox
```  
イメージのダウンロードと仮想マシンの起動が行われます。

#### 3. 作成した環境にSSH接続
コマンドプロンプト上で `vagrant ssh` コマンドを打つと、以下の画面が表示されます。

```
Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/vagrant/.vagrant/machines/default/virtualbox/private_key
```
puttyなどで上記の接続先にアクセスし、ログインできることを確認します。
初期設定では username, password ともに `vagrant` です。

#### 4. 設定ファイルの編集
起動を確認後、以下のコマンドで仮想マシンを止めて設定ファイルを編集します。

```
C:\vagrant> vagrant halt
``` 
ここまでの作業で作成し、コマンドプロンプトを動かしていた場所 `C:\vagrant` フォルダ内に `Vagrantfile` というファイルがあるので、メモ帳などで開きます。
##### ⅰ. ネットワーク設定(固定IPアドレス割当)
`public_network` の行のコメントアウトを外すことで、ホスト以外からもアクセスすることができます。
コメントアウトを外すだけだと、DHCPでIPアドレスが変更されてしまうので、固定IPを設定しています。
今回は `192.168.1.111` を仮想マシンに割り当てることとします。

```
  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
   config.vm.network "public_network", ip: "192.168.1.111"
```
##### ⅱ. VirtualBoxメモリ、CPU数変更
メモリとCPU数も変更します。
`vb.memory` がメモリ、 `vb.cpus` がCPU数です。

```
  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
   config.vm.provider "virtualbox" do |vb| ← ココのコメントアウトを解除
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
     vb.memory = "2048"
     vb.cpus = "2"
   end ← ココのコメントアウトも解除
```
## Ⅴ. Ubuntuの設定変更
#### 1. ユーザを作成
`vagrant` ユーザでログインするのは好ましくないので、ユーザを作ります。
以下のコマンドを入力し、パスワードなど諸々の情報を入れてユーザを作成します。

```
$ sudo adduser user_name
``` 
#### 2. sudo 権限付与
以下のコマンドで作成したユーザにsudo権限を付与します。

```
$ gpasswd -a user_name sudo
```
#### 3. 公開鍵ログイン環境構築
##### ⅰ. .sshフォルダ作成
以下のコマンドでユーザのホームディレクトリの配下に `.ssh` フォルダを作成し、アクセス権を変更します。

```
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
```
##### ⅱ. authorized_keys作成
以下のコマンドで `authorized_keys` ファイルを作成し、アクセス権変更します。

```
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```
##### ⅲ. 鍵ペア作成
`PuTTYgen` で鍵ペアを作成します。
大まかな流れは以下です。

1. 鍵のbit数を選択
2. アプリの上部の四角い枠内でグリグリとマウスカーソルを動かす
3. プログレスバーが100%まで行くと鍵生成が完了
4. さっきまでグリグリしていたところに公開鍵が表示されるので、コピーしてメモ帳などに貼り付ける

詳細な作成方法は[PuTTYgenで公開鍵/秘密鍵を作成する](https://ja.osdn.net/projects/winscp/wiki/ui_puttygen)をご参照ください。
(丁寧な説明をしてくださっている、外部サイトに飛びます)
##### ⅳ. authorized_keys編集
以下のコマンドで `authorized_keys` を編集します。

```
$ vi /home/user_name/.ssh/authorized_keys
```
`i` でインサートモードに入り、右クリックで貼り付けて `:wq` で保存して閉じます。
##### ⅴ. sshd設定の変更(rootログイン禁止、公開鍵認証許可)
`/etc/ssh/sshd_config` に設定が記載されています。
編集前には以下のようにしてバックアップを取ります。

```
$ cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
```
以下のコマンドで設定ファイルを編集します。

```
$ sudo vi /etc/ssh/sshd_config
```
以下の行を編集し、`:wq`で保存して閉じます。
`PermitRootLogin no` ← rootログイン禁止
`PubkeyAuthentication yes` ← 公開鍵認証許可

編集完了後、以下のコマンドでssh再起動をします。

```
$ sudo service ssh restart
```
##### ⅵ. puTTyで鍵認証を設定
`PuTTY`のログインで公開鍵を使う設定を行います。
大まかな流れは以下です。

1. `PuTTY` のSSH認証のオプションに秘密鍵を登録する
2. `Pagent` に登録する（登録すると便利）

詳細な設定方法は[公開鍵認証によるSSH接続 - PuTTYの使い方](http://webkaru.net/linux/putty-ssh-login-public-key/)をご参照ください。
(丁寧な説明をしてくださっている、外部サイトに飛びます)
##### ⅶ. sshd設定変更(パスワードログインの禁止)
鍵認証によるログインに成功後、以下のコマンドで設定ファイルを編集します。

```
$ sudo vi /etc/ssh/sshd_config
```
以下の行を編集し、`:wq`で保存して閉じます。
`PasswordAuthentication no` ← パスワード認証禁止

編集完了後、以下のコマンドでssh再起動をします。

```
$ sudo service ssh restart
```

## Ⅵ. トラブルシューティング
#### 1. `vagrant up` 時に `guest additions` 警告が表示される
[vagrant-vbguest]
(https://github.com/dotless-de/vagrant-vbguest)を使用して対応します。
##### ⅰ. インストール
以下のコマンドでインストールします。

```
C:\vagrant> vagrant plugin install vagrant-vbguest
```
##### ⅱ. 使用方法
以下のコマンドを実行します。

```
C:\vagrant> vagrant vbguest
```
コンソールに情報が表示され、しばらくすると`guest additions`の更新が完了します。
更新完了ののち、以下のコマンドで再起動を行ってエラーが起きないことを確認します。

```
C:\vagrant> vagrant halt
C:\vagrant> vagrant up
```

## Ⅶ. 参考にさせていただいたリンク
* [VirtualBox + VagrantでUbuntu16.04の環境を構築する](https://yoshinorin.net/2016/06/14/vagrant-ubuntu1604/)
* [ubuntu ユーザを追加して sudo 権限をつける](http://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)
* [SSHを使ってパスワードなしで接続](http://ubuntu.u-aizu.ac.jp/004/index.html)
* [PuTTYgenで公開鍵/秘密鍵を作成する](https://ja.osdn.net/projects/winscp/wiki/ui_puttygen)
* [公開鍵認証によるSSH接続 - PuTTYの使い方](http://webkaru.net/linux/putty-ssh-login-public-key/)
* [Pageant の使い方 （公開鍵認証の設定方法）](https://tipszone.jp/20111205_putty-winscp/#Pageant)
* [VagrantのboxのGuest Additionsのアップデート方法](http://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)