Edited at

Vagrantで自分の作成した公開鍵と秘密鍵を使う方法

More than 5 years have passed since last update.

【前提条件】


  • VagrantのBoxが用意できている

  • 公開鍵と秘密鍵を作成できている(ssh-keygen等を利用)

  • 仮想環境で使用されるOSの知識がある

  • ターミナル操作になれている

ホストPC: Mac

仮想環境: VirtualBox

このBoxではUbuntu14.04をPackerで作成し確認しました。

使われる頻度の多いCentOSなどでもファイルの場所などが同様で使えると思います。異なる場合は、該当箇所へファイルを転送してください。

最終的に自分の公開鍵を内包したBoxを作ります。


仮想環境を立ち上げる


  • 公開鍵を設定したいVagrantのBoxを用意し、仮想環境を立ち上げる

ターミナル: 【Mac側】仮想環境を立ち上げる

$ vagrant up    #仮想環境が立ち上がります


公開鍵の転送

ターミナル: もう一つタブを開く

ターミナル: 仮想環境にsshにて接続 > 【仮想環境側】となる

$ vagrant ssh       #仮想環境にsshにて入る

下記のどちらかの方法を使って公開鍵を仮想マシンへ転送する



  • scpのコマンド を使って仮想環境に公開鍵を転送する。

ターミナル: 【Mac側】に切り替える

$ vagrant ssh-config    # port番号を確認して次のコマンドのportに使います

#scp -P ポート番号 -i 秘密鍵のファイル 公開鍵のファイル 仮想マシン:仮想マシンのディレクトリ へコピーする
#今回は"authorized_keys"という名前で保存します
#このファイル名の設定は別のサーバー設定に依存します
$ scp -P port -i ~/.ssh/xxxx ~/.ssh/xxxx.pub vagrant@127.0.0.1:~/.ssh/authorized_keys


WARNING が表示される場合

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

上記の様な注意が表示された場合は、ホストマシン(Mac側)の~/.ssh/known_hostsの中の該当のホストを削除するなりをしてください。



  • Vagrant の共有 を使ってファイルを転送する。

ターミナル: 【Mac側】の作業

$ cp ~/.ssh/xxxx.pub authorized_keys    #公開鍵を名前変更しながら作業ディレクトリへコピーする

ターミナル: 【仮想環境】の作業

$ mv /vagrant/authorized_keys ~/.ssh    #共有フォルダのファイルを.ssh以下に移動

$ sudo chown vagrant:root ~/.ssh/authorized_keys #所有者の変更

ターミナル: 【Mac側】の作業

$ vi Vagrantfile        #秘密鍵の環境設定をVagrantfileに記述する

ただし、公開鍵のパーミッションは600


転送した鍵の確認

公開鍵が転送されたかはssh-keygen -vlf ファイルパス/ファイル名で調べる事ができます。

ターミナル: 【仮想環境】に切り替える

$ ssh-keygen -vlf ファイルパス/ファイル名

# 例えば、仮想環境に転送されたファイルの指紋をみるには
$ ssh-keygen -vlf ~/.ssh/authorized_keys

転送したファイルの指紋を表示する

ターミナル: 【Mac側】に切り替える

$ ssh-keygen -vlf ~/.ssh/xxxxxx.pub #転送したファイル

これで指紋を確認して同じであるかチェックしてください。


ホストマシンの Vagrantfile に 秘密鍵のパスを設定する

config.ssh.private_key_path = "~/.ssh/xxxxx"

パス設定は、ホストマシンの自分が作成した秘密鍵の場所

"xxxxx"は秘密鍵を設定してください。

$ vagrant reload


公開鍵と秘密鍵でssh接続できる事を確認

ターミナル: 【仮想環境】に切り替え

ターミナル: exit で一旦ログアウトし再度タブを開き接続する

$ vagrant ssh

秘密鍵と公開鍵の設定があっていれば接続出来るはずです。

できあがったところで Vagrant パッケージ を作成します。


パッケージを作成する(自分の公開鍵設定したBox)

$ vagrant package       #package.boxが出来上がる

$ vagrant box add [box_name] package.box # box_nameはご自身の好きな名前にしてください


自分のBoxを利用するには

ディレクトリを作成してそこで下記のコマンドを行ってください。

それまでのディレクトリはデフォルトのBoxイメージで作成された環境になっています。

$ vagrant init my_box_name  #必ず秘密鍵のパス設定を記述する

$ vagrant up #仮想環境を立ち上げる


Vagrantfile に設定する秘密鍵のパスについて

いろいろと自分の公開鍵と秘密鍵を使ってvagrant upからできそうなものがなく探しているとpluginがありました。しかし、どこか違う様な気がしました。

それは、公開鍵を設定するvagrant設定が無いためです。

また、vagrant ssh-configで表示される秘密鍵のパスは~/.vagrant.d/以下のファイルパスを示していますが本来の場所は、自分の秘密鍵のファイルパスにしたいはずです。

これをVagrantfileで設定するのがconfig.ssh.private_key_pathです。

っということで、公開鍵は自分で転送する必要があることが分かります。ただし、vagrant destroyをすると消えてしまうのでパッケージとして固める他に方法はありません。

幸い vagrant にはパッケージするコマンドがあり、秘密鍵のファイルパスを設定するコマンドがありますので仮想環境を固めることにしました。

当然、デフォルトの秘密鍵がありますが、公開されているので意味をなしません。内包されていますが上記の方法で対となる公開鍵の書き換えを行っているので鍵があいません。

よって、Vagrantfile には必ず 秘密鍵のパスを設定してください。


なぜ公開鍵を内包したBoxを作りたかったか?

Macはストレージが以前のHDD時代と違い圧倒的に少ないのでvagrant haltで長期間ホールドしておきたくなかった。

できれば、vagrant destroyをしてVirtualBoxには仮想環境が何も無い状態にしておきたかった。

誤って秘密鍵を消してしまった場合は、Boxが使えなくなるので作り直してください。


追記

scpのコマンド間違いにより仮想マシンへコピーされない状況になっていました。

scpコマンドの記述に転送先のマシンの指定を追加修正しました。

2014.07.20 追記

package したものを次回vagrant up すると共有フォルダが設定されていないとか virtualbox に関するエラーがでたりします。

種々の問題がからまって起こっている問題の様でそれぞれで解決しないとだめなようです。

centos, ubuntuどちらでも同様の問題が発生しました。

また、先日centosで作成したときには正常にできました。

どうやら動作が不安定なので利用される方はご注意のほど。

また、ぐるぐると解決方法が掲載されていますのでそちらを参照していただけるとありがたいです。