【问题标题】:Can't ssh to vagrant VMs using the insecure private key (vagrant 1.7.2)无法使用不安全的私钥通过 ssh 连接到 vagrant VM(vagrant 1.7.2)
【发布时间】:2015-04-12 20:07:52
【问题描述】:

我有一个由 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

输出显示每个主机的不同密钥。我通过 diff 验证了密钥是不同的。

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

我想对所有机器使用不安全密钥的原因是我想使用 ansible 从外部配置它们。我不想使用 Ansible 配置器,而是将虚拟机视为远程服务器。因此,Vagrantfile 仅用于指定集群中的机器,然后将在外部完成配置。

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

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

【问题讨论】:

    标签: ssh vagrant vagrantfile


    【解决方案1】:

    如果您专门使用 Ansible(不是 Vagrant Ansible 供应商),您可能需要考虑使用 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 中的冲突检测)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 真的很有帮助!谢谢!我在授权密钥中放置了错误密钥的虚拟机,因此 vagrant 无法连接到它。你的方法帮我解决了这个问题!
      • 感谢您的想法。将 .vagrant/machines/default/virtualbox/private_key 重命名为 private_key_old 并且 vagrant 创造了一切。
      【解决方案3】:

      当 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
      

      【讨论】:

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

      tldr;

      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 参数计算出适合您的东西。

      【讨论】:

      • ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key 为我工作。
      【解决方案5】:

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

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

      如果你像你一样指定private_key_path,Vagrant 不应该替换不安全的密钥,但是内部逻辑会检查private_key_path 是否指向默认的insecure_private_key,如果是,Vagrant 将替换它。

      更多信息可以在here找到。

      【讨论】:

      • 我现在的问题是:他们为什么要改变它?出于安全原因?为什么然后用自动生成的密钥替换它?
      • 是的,出于安全原因。从长远来看,它不会拯救你,但它只是比使用相同的密钥对运送世界上的每个盒子更安全。
      • 我的虚拟机是不可变的,如果我的 etc 文件不允许,它如何尝试重新生成密钥?
      • 在这种情况下,您应该禁用此行为。
      猜你喜欢
      • 2017-03-16
      • 2019-07-09
      • 2018-05-08
      • 1970-01-01
      • 2016-11-12
      • 2013-11-21
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多