Не удается ssh перехватить виртуальные машины, используя небезопасный закрытый ключ (vagrant 1.7.2)

У меня кластер из 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 (я на 1.7.2) создают защищенный закрытый ключ для каждой машины. Я обнаружил это, запустив

vagrant ssh-config

Вывод показывает разные ключи для каждого хоста. Я проверил, что ключи отличаются, различая их.

Я попытался форсировать небезопасный ключ, установив в Vagrantfile config.ssh.private_key_path, но он не работает.

Причина, по которой я хочу использовать незащищенный ключ для всех машин, заключается в том, что я хочу предоставить их извне, используя ansible. Я не хочу использовать поставщика Ansible, но отношусь к виртуальным машинам как к удаленным серверам. Итак, Vagrantfile просто используется для указания машин в кластере, и тогда подготовка будет производиться извне.

В документации все еще говорится, что по умолчанию машины будут использовать небезопасный закрытый ключ.

Как я могу заставить свои виртуальные машины использовать небезопасный закрытый ключ?

5 ответов

Решение

Vagrant изменил поведение между версиями 1.6 и 1.7 и теперь будет вставлять автоматически сгенерированный небезопасный ключ вместо ключа по умолчанию.

Вы можете отменить это поведение, установив config.ssh.insert_key = false в вашем Vagrantfile.

Vagrant не должен заменять небезопасный ключ, если вы укажете private_key_path как вы сделали, однако внутренняя логика проверяет, если private_key_path указывает на дефолт insecure_private_keyи если это произойдет, Vagrant заменит его.

Более подробную информацию можно найти здесь.

Когда Vagrant создает новый ключ ssh, он сохраняется с конфигурацией по умолчанию в каталоге Vagrantfile по адресу .vagrant / machines / default / virtualbox / private_key.

Используя автоматически сгенерированный ключ, вы можете войти в него из того же каталога, что и Vagrantfile, например:

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

Чтобы узнать все подробности о фактической конфигурации ssh vagrant-бокса, используйте команду 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

Добавление config.ssh.insert_key = false в Vagrantfile и удаление нового закрытого ключа VM .vagrant/machines/default/virtualbox/private_key Бродяга автоматически обновляет vagrant ssh-config с правильным закрытым ключом ~/.vagrant.d/insecure_private_key, Последнее, что я должен был сделать, это войти в vm по ssh и обновить файл авторизованных ключей в vm. curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys

tldr;

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

Я не мог заставить это работать, поэтому в конце я добавил следующее в скрипт rush ssh.rb (/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.

Если вы специально используете Ansible (не поставщик Vagrant Ansible), вы можете рассмотреть возможность использования сценария динамической инвентаризации vagrant из репозитория Ansible:

В качестве альтернативы, вы можете создать свой собственный скрипт и динамически создать свой собственный файл инвентаризации:

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).

Другие вопросы по тегам