无法使用不安全的私钥(vagrant 1.7.2)ssh到vagrant虚拟机

42

我有一个由3个虚拟机组成的集群。这是Vagrantfile:

 # -*- mode: ruby -*-
# vi: set ft=ruby :


hosts = {
  "host0" => "192.168.33.10",
  "host1" => "192.168.33.11",
  "host2" => "192.168.33.12"
}

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.ssh.private_key_path = File.expand_path('~/.vagrant.d/insecure_private_key')

  hosts.each do |name, ip|
    config.vm.define name do |machine|
      machine.vm.hostname = "%s.example.org" % name
      machine.vm.network :private_network, ip: ip
      machine.vm.provider "virtualbox" do |v|
          v.name = name
      #    #v.customize ["modifyvm", :id, "--memory", 200]
      end
    end
  end
end

最近我升级后,这个之前能够正常工作的东西现在突然失效了:

ssh -i ~/.vagrant.d/insecure_private_key vagrant@192.168.33.10

相反,Vagrant要求输入密码。

最近的Vagrant版本(我使用的是1.7.2)为每台机器创建一个安全的私钥。我通过运行以下命令发现了它:

vagrant ssh-config

输出显示每个主机都有不同的密钥。我通过比较它们来验证这些密钥是不同的。

我尝试通过在Vagrantfile中设置config.ssh.private_key_path来强制使用不安全的密钥,但它不起作用。

我想要所有机器都使用不安全的密钥,因为我希望使用ansible从外部配置它们。我不想使用Ansible provisioner,而是将VM视为远程服务器。因此,Vagrantfile仅用于指定群集中的机器,然后将外部进行配置。

文档仍然说默认情况下机器将使用不安全的私钥。

如何使我的虚拟机使用不安全的私钥?

5个回答

49

Vagrant在1.6和1.7版本之间更改了行为,现在将插入自动生成的不安全密钥而不是默认密钥。

您可以在Vagrantfile中设置config.ssh.insert_key = false来取消此行为。

如果您像您所做的那样指定private_key_path,则Vagrant不应替换不安全密钥,但是内部逻辑会检查private_key_path是否指向默认值insecure_private_key,如果是,则Vagrant将替换它。

更多信息可以在这里找到:https://github.com/mitchellh/vagrant/issues/4967


1
我的问题是:他们为什么要改变它?出于安全原因吗?那么为什么要用自动生成的密钥替换它呢? - gitaarik
是的,出于安全原因。这并不能在长期内保护你,但比使用同一密钥对发送给世界上每个盒子要更加安全一些。 - m1keil
我的虚拟机是不可变的,如果我的etc文件不允许它,它如何尝试重新生成密钥? - CMCDragonkai
1
在这种情况下,您应该禁用此行为。 - m1keil

28

当 Vagrant 创建一个新的 ssh 密钥时,默认配置将被保存在 Vagrantfile 目录下的 .vagrant/machines/default/virtualbox/private_key

使用自动生成的密钥,您可以像这样从与 Vagrantfile 相同的目录登录:

ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 vagrant@localhost

要了解有关vagrant box的实际ssh配置的所有详细信息,请使用vagrant ssh-config命令。

# vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/babo/src/centos/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

3
发现我的最新盒子安装的身份文件位置已更改为我的主目录之外的位置,例如:/Users/babo/.vagrant.d/boxes/centos/0/virtualbox/vagrant_private_key幸运的是,执行 vagrant ssh-config 暴露了正确的位置。 - bhfailor

14

在Vagrantfile中添加config.ssh.insert_key = false并删除新的虚拟机私钥.vagrant/machines/default/virtualbox/private_key,Vagrant将自动使用正确的私钥~/.vagrant.d/insecure_private_key更新vagrant ssh-config。我所需要做的最后一件事是ssh进入虚拟机并更新虚拟机上的授权密钥文件。curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys


2
非常有用!谢谢!我在authorized_keys中放入了错误的密钥,导致虚拟机无法连接到它。你的方法帮助我解决了这个问题! - Brazhnyk Yuriy
2
感谢您的想法。将.vagrant/machines/default/virtualbox/private_key重命名为private_key_old后,vagrant创建了所有内容。 - Salyangoz

3

简而言之;

ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key

我无法使其正常工作,所以最终我在ssh.rb Ruby脚本(/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb)中添加了以下内容。

print(*command_options)

在执行ssh调用的这一行之前

SafeExec.exec("ssh", *command_options)

这将打印出传递给ssh调用的所有命令选项,从那里您可以根据vagrant计算出的正确ssh参数找出适合您的东西。


1
对我来说,ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key 是有效的。 - micmia

0
如果您正在使用 Ansible(而不是 Vagrant Ansible provisioner),您可能希望考虑使用来自 Ansible 存储库的 vagrant 动态清单脚本:

或者,您可以手工制作自己的脚本并动态构建自己的vagrant清单文件:

SYSTEMS=$(vagrant status | grep running | cut -d ' '  -f1)

echo '[vagrant_systems]' > vagrant.ini

for SYSTEM in ${SYSTEMS}; do
  SSHCONFIG=$(vagrant ssh-config ${SYSTEM})
  IDENTITY_FILE=$(echo "${SSHCONFIG}" | grep -o "\/.*${SYSTEM}.*")
  PORT=$(echo "${SSHCONFIG}" | grep -oE '[0-9]{4,5}')
  echo "${SYSTEM} ansible_ssh_host=127.0.0.1 ansible_ssh_port=${PORT} ansible_ssh_private_key_file=${IDENTITY_FILE}" >> vagrant.ini
done

然后使用ansible-playbook -i=vagrant.ini

如果您尝试使用~/.ssh/config,则必须动态创建或编辑现有条目,因为ssh端口可能会更改(由于Vagrant中的冲突检测)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接