流浪者默认情况下不安全?


71

编辑2:TL; DR:答案是在2013年是,但此缺陷已得到修复

按照vagrantup.com上的《入门指南》,我似乎最终得到了一个虚拟机,该虚拟机在端口2222上接受SSH连接,以便任何人都可以使用默认凭据(用户名)对我的VM进行root访问,并读取我的主机工作目录。 = password = vagrant或vagrant_insecure_private_key)。

这是真的?如果是,为什么不将其视为巨大的安全漏洞?如果我已将敏感数据复制到虚拟机怎么办?

编辑:对于那些认为互联网上的任何人都可以读取您的源代码并在您的VM上执行任意代码的人来说,还不错,我建议阅读此博客文章http://blog.ontoilologic中的“突破”部分。 com / blog / 2012/10/31 / in-of-and-of-vagrant /

简而言之:“按预期”运行Vagrant也可以使任何人闯入您的主机/开发计算机(例如,通过使用恶意的git post-commit钩子)。


1
闯入和逃离无业游民的链接已断开。以下当前工作:blog.ontoillogical.com/blog/2012/10/31/...
PND


您如何防范“爆发”漏洞?还是现在已经过时了,因为它可以防止入侵?
user163831

Answers:


99

简短的答案是

为什么?

在构建Vagrant基本框时(手动或使用诸如Veewee之类的工具进行自动化),构建者将遵循vagrant基本框规范,该规范定义了以下内容:

  1. 用户rootvagrant使用流浪汉作为密码
  2. 用户的公共密钥身份验证(无密码)vagrant

Vagrant项目为SSH公钥身份验证提供了不安全的密钥对,因此可以vagrant ssh正常工作。

因为每个人都可以访问私钥,所以任何人都可以使用私钥登录到您的VM(假设他们知道您的主机IP,默认情况下,端口为2222,作为转发规则。)

这不是安全的OOTB。但是,您可以从可信的密钥~vagrant/.ssh/authorized_keys和添加自己的,更改密码vagrantroot,然后认为它是相对安全的。

更新资料

从Vagrant 1.2.3开始,默认情况下SSH转发的端口绑定到127.0.0.1,因此仅允许本地连接[GH-1785]。

重要更新

由于Vagrant 1.7.0(PR#4707),Vagrant将首先使用随机生成的密钥对替换默认的不安全ssh密钥对vagrant up

请参阅CHANGELOG中的内容:使用默认的不安全密钥对,Vagrant会在first上自动将其替换为随机生成的密钥对vagrant upGH-2608


OOTB的配置并未完全受损,但是OOTB的确包括向在VM中具有root访问权限的任何人有效地访问主机环境中运行virtualbox的用户。这是一个相当严重的缺陷,但不足以损害主机。
mc0e 2014年

2
和无密码的须藤!看来您无法忽略?
CMCDragonkai 2014年

10

我已经将它作为问题在github存储库上提出给流浪汉。开发人员表示,将通过外部可用的转发端口来解决此问题。但是,开发人员不接受有关VM损害主机环境的问题。我认为他们是错误的错误。

https://github.com/mitchellh/vagrant/issues/1785

脱离虚拟机比链接的博客文章建议的容易。您不必依赖git钩子来破坏主机,只需将任意的ruby代码放入Vagrant文​​件中即可。

如果可以的话,我会在VM沙箱中运行流浪汉。既然我做不到,我就使用防火墙。

最好有设置规则以添加安全的ssh密钥,并删除不安全的密钥和默认密码。


9

我编写了这个简单的内联shell配置程序,以将我的id_rsa.pub换成authorized_keys。设置后,不能使用insecure_private_key进行身份验证。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

# ...

  config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'" # avoids 'stdin: is not a tty' error.

  config.ssh.private_key_path = ["#{ENV['HOME']}/.ssh/id_rsa","#{ENV['HOME']}/.vagrant.d/insecure_private_key"]

  config.vm.provision "shell", inline: <<-SCRIPT
    printf "%s\n" "#{File.read("#{ENV['HOME']}/.ssh/id_rsa.pub")}" > /home/vagrant/.ssh/authorized_keys
    chown -R vagrant:vagrant /home/vagrant/.ssh
  SCRIPT

end

3
对于私钥来说,这看起来很棒。但这对帐户“ vagrant”和“ root”具有密码“ vagrant”的事实不起作用,对吗?
Noah Gibbs 2014年

7

从Vagrant 1.2.3开始,默认设置是绑定到localhost而不是公共接口,从而避免了外部连接问题。


1

只是想补充一点,有一个Vagrant插件可以解决此问题:vagrant-rekey-ssh。它更改虚拟机的默认密码,并删除不安全的SSH密钥。


好东西。谢谢。但是,如果主机环境仍暴露在无聊的盒子中,则仍然存在。
mc0e 2015年

2
仅供参考:该功能现在包含在Vagrant 1.7+中。该插件已过时。
詹姆斯,

0

我想解释一下为什么Vagrant不一定像您想象的那样没有安全感。

首先,我想肯定地说,我相信大多数人已经知道,由于这些盒子的共享方式,有必要保持对Vagrant盒子的开放访问。因此,我认为主要的安全问题是在下载该框后,不要更改默认凭据。以桥接模式运行这样的机器将允许网络上的某人使用默认凭据进行ssh登录。

在我看来,这些框背后的想法是,任何人都可以下载它,并在拥有该文件后将其保护。我的流浪汉安装将默认密钥替换为随机生成的新ssh密钥。我不确定是否通过插件完成此操作,但是我很好奇,如果知道无密码的sudo和默认密码是否也存在安全风险。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.