Edited at

vagrant upコマンド実行時にAuthentication failure.エラーが発生する

More than 3 years have passed since last update.


概要

表題の通り、vagrant up コマンドを実行した時に、延々とAuthentication failureが発生し、その解決にちょっとした時間ハマったので状況と自分の時の解決手段を記載しておきます。


記事情報


  • 投稿日


    • 2015/12/8 初版



  • 環境


    • VirtualBox:5.0.10

    • Host OS:OS X Elcapitan

    • Guest OS:CentOS 6.6

    • vagrant:1.7.4




起こった事象

これまでvagrant 1.6系(アップデートしてしばらく経ったので、バージョン失念)で、問題なくvagrant up/destroy して育ててたVagrantfileが急遽vagrant up で以下のようなエラーを吐くように。


発生エラー

$ vagrant up 

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 => 2200 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2200
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection timeout. Retrying...
default: Warning: Connection timeout. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...

…以下同じ



発生原因

vagrantでは、vagrant sshによる認証時に、公開鍵認証方式を用いる。

*公開鍵認証方式についてはこことか参照。

その際に使用されるクライアントの秘密鍵の配置場所はvagrant ssh-configで確認できる。


秘密鍵(ホストOS側)

$ vagrant ssh-config

Host default
HostName 127.0.0.1
User vagrant
Port 2200
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/username/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL


上記のIdentityFileが秘密鍵の配置場所。

一方、対となる公開鍵は、SSHサーバ側(ゲストOS)の/home/vagrant/.ssh/authorized_keysに存在する。

しかしながら、こちらの記事によると、


Vagrant 1.7 以降では、vagrant up 時に旧来の insecure_key を検知した場合、その仮想マシン用の別の鍵ペアを生成して insecure_key を置き換える。

生成した秘密鍵は .vagrant/machines/default/virtualbox/private_key に置かれ、それ以降そのマシンへのアクセスは新しい鍵が使われるようになり、insecure_key での SSH はできなくなる。


のだそう(insecure_keyはホストOSに配置される公開鍵のこと)。

実際、vagrantの作者であるmitchellh氏もTwitterで、そのような発言をしている。

https://twitter.com/mitchellh/status/525704126647128064

その結果、vagrant1.7以降でvagrant upすると、対象のゲストOSに対して新たな鍵のペアを生成・配置される(*)ため、環境によってはデフォルトのinsecure_private_keyとのアンマッチ等から、当該エラーが発生する。


  • クライアントの秘密鍵は、.vagrant/machines/default/virtualbox/private_keyに作成される


解決方法

vagrant1.7系の動作を理解した上で、それに追従するというのも当然ありだと思うが、これまで同様のデフォルトの鍵ペアによる認証を行うためには、

①VagrantfileにゲストOSの公開鍵を置き換えないように以下の設定を追加する。


Vagrantfile

+ config.ssh.insert_key = false


②デフォルトのinsecure_private_keyとペアになる公開鍵をゲストOS以下の手順で配置する。

以下の手順では、vagrant作者であるmitchellh氏のgithubから入手、配置を行っている。


GuestOS

$ mkdir -p /home/vagrant/.ssh

$ wget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys

後は、.sshdディレクトリのパーミッションを適切に変更するのも忘れない。


GuestOS

$ chmod 0700 /home/vagrant/.ssh

$ chmod 0600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant /home/vagrant/.ssh

以上。


参考