Подтвердить что ты не робот

Как добавить свой собственный открытый ключ к Vagrant VM?

У меня возникла проблема с добавлением ключа ssh в Vagrant VM. В принципе, настройка, которую я здесь, работает нормально. После создания виртуальных машин я могу получить к ним доступ через vagrant ssh, существует "бродяга" пользователя и есть ключ ssh для этого пользователя в файле authorized_keys.

Теперь я хотел бы сделать следующее: чтобы иметь возможность подключаться к этим виртуальным машинам через ssh или использовать scp. Поэтому мне нужно было бы добавить только открытый ключ из id_rsa.pub в authorized_keys - так же, как я сделал бы с ssh-copy-id.

Есть ли способ сообщить Вагранту во время установки, что мой открытый ключ должен быть включен? Если нет (что, вероятно, по моим результатам google), есть ли способ легко добавить мой открытый ключ во время настройки бродяг?

4b9b3361

Ответ 1

Копирование требуемого открытого ключа будет полностью переходить в фазу инициализации. Точный ответ зависит от того, какое обеспечение вы хотите использовать (shell, Chef, Puppet и т.д.). Самым тривиальным будет file поставщик ключа, что-то вроде этого:

config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"

Ну, на самом деле вам нужно добавить к авторизованным ключам. Используйте поставщика оболочки, например, так:

config.vm.provision "shell", inline: <<-SHELL
  cat /home/vagrant/.ssh/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys
SHELL
end

Вы также можете использовать настоящего провайдера, например Puppet. Например, см. Управление авторизованными ключами SSH с помощью Puppet.

Ответ 2

Вы можете использовать модуль файлов ядра Ruby, например:

  config.vm.provision "shell" do |s|
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
    s.inline = <<-SHELL
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    SHELL
  end

Этот рабочий пример добавляет ~/.ssh/id_rsa.pub к ~/.ssh/authorized_keys как брандмауэра, так и пользователя root, что позволит вам использовать существующий ключ SSH.

Ответ 3

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

Пройдите так, чтобы увидеть путь к существующему закрытому ключу (посмотрите ниже для IdentityFile):

выполнить

 vagrant ssh-config 

результат:

$ vagrant ssh-config
Host magento2.vagrant150
  HostName 127.0.0.1
  User vagrant
  Port 3150
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL

Затем вы можете использовать закрытый ключ, как это, обратите внимание также на переключатель для отключения аутентификации пароля

ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication=no [email protected] -p 3150

Ответ 4

В итоге я использую код вроде:

config.ssh.forward_agent    = true
config.ssh.insert_key       = false
config.ssh.private_key_path =  ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"]
config.vm.provision :shell, privileged: false do |s|
  ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  s.inline = <<-SHELL
     echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys
     sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
  SHELL
end

Обратите внимание, что нам не следует жестко указывать путь к /home/vagrant/.ssh/authorized_keys, так как некоторые бродячие боксы не используют имя пользователя vagrant.

Ответ 5

Этот отличный ответ был добавлен пользователем 76329 в отклоненном предложенном редактировании.

Разбираясь в примере с Meow, мы можем скопировать локальные публичные/частные ключи ssh, установить разрешения и сделать идемпотент встроенным сценарием (запускается один раз и будет повторяться только в случае сбоя условия проверки, что требует подготовки):

config.vm.provision "shell" do |s|
  ssh_prv_key = ""
  ssh_pub_key = ""
  if File.file?("#{Dir.home}/.ssh/id_rsa")
    ssh_prv_key = File.read("#{Dir.home}/.ssh/id_rsa")
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  else
    puts "No SSH key found. You will need to remedy this before pushing to the repository."
  end
  s.inline = <<-SHELL
    if grep -sq "#{ssh_pub_key}" /home/vagrant/.ssh/authorized_keys; then
      echo "SSH keys already provisioned."
      exit 0;
    fi
    echo "SSH key provisioning."
    mkdir -p /home/vagrant/.ssh/
    touch /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} > /home/vagrant/.ssh/id_rsa.pub
    chmod 644 /home/vagrant/.ssh/id_rsa.pub
    echo "#{ssh_prv_key}" > /home/vagrant/.ssh/id_rsa
    chmod 600 /home/vagrant/.ssh/id_rsa
    chown -R vagrant:vagrant /home/vagrant
    exit 0
  SHELL
end

Ответ 6

Более короткий и более правильный код должен быть:

ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
config.vm.provision 'shell', inline: 'mkdir -p /root/.ssh'
config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false

В противном случае пользователь .ssh/authorized_keys будет принадлежать пользователю root.

Тем не менее он добавит строку при каждом выполнении условия, но Vagrant используется для тестирования, а виртуальная машина обычно имеет короткий срок службы, поэтому не большая проблема.

Ответ 7

Это отличный поток, который помог мне решить аналогичную ситуацию, о которой описывает оригинальный плакат.

В то время как я в конечном счете использовал настройки/логику, представленные в ответе smartwjws, я столкнулся с проблемой, поскольку я использую VAGRANT_HOME переменная среды, чтобы сохранить содержимое основного файла vagrant.d на внешнем жестком диске в одной из моих систем разработки.

Итак, вот скорректированный код, который я использую в своем Vagrantfile, чтобы разместить переменную среды VAGRANT_HOME; "волшебство" происходит в этой строке vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d":

config.ssh.insert_key = false
config.ssh.forward_agent = true
vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"
config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"]
config.vm.provision :shell, privileged: false do |shell_action|
  ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  shell_action.inline = <<-SHELL
    echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys
  SHELL
end

Ответ 8

Для создателей встроенных оболочек - общий ключ для открытого ключа содержит пробелы, комментарии и т.д. Поэтому обязательно держите (экранированные) кавычки вокруг var, которые расширяются до открытого ключа:

config.vm.provision 'shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false

Ответ 9

Ни один из более старых постов не работал для меня, хотя некоторые подошли близко. Я должен был сделать ключи rsa с keygen в терминале и пойти с пользовательскими ключами. Другими словами побежден от использования ключей Vagrant.

Я нахожусь на Mac OS Mojave на дату этого поста. Я установил два Vagrant-бокса в одном Vagrantfile. Я показываю все первое окно, чтобы новички могли видеть контекст. Я помещаю папку .ssh в ту же папку, что и файл Vagrant, в противном случае используйте настройку user9091383.

Кредит на это решение идет к этому кодеру.

Vagrant.configure("2") do |config|
  config.vm.define "pfbox", primary: true do |pfbox|
        pfbox.vm.box = "ubuntu/xenial64"
        pfbox.vm.network "forwarded_port", host: 8084, guest: 80
        pfbox.vm.network "forwarded_port", host: 8080, guest: 8080
        pfbox.vm.network "forwarded_port", host: 8079, guest: 8079
        pfbox.vm.network "forwarded_port", host: 3000, guest: 3000
        pfbox.vm.provision :shell, path: ".provision/bootstrap.sh"
        pfbox.vm.synced_folder "ubuntu", "/home/vagrant"
        pfbox.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig"
        pfbox.vm.network "private_network", type: "dhcp"
        pfbox.vm.network "public_network"
        pfbox.ssh.insert_key = false
        ssh_key_path = ".ssh/"  # This may not be necessary.  I may remove.
        pfbox.vm.provision "shell", inline: "mkdir -p /home/vagrant/.ssh"
        pfbox.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key", ".ssh/id_rsa"]
        pfbox.vm.provision "file", source: ".ssh/id_rsa.pub", destination: ".ssh/authorized_keys"
        pfbox.vm.box_check_update = "true"
        pfbox.vm.hostname = "pfbox"
        # VirtualBox
          config.vm.provider "virtualbox" do |vb|
            # vb.gui = true
            vb.name = "pfbox" # friendly name for Oracle VM VirtualBox Manager
            vb.memory = 2048 # memory in megabytes 2.0 GB
            vb.cpus = 1 # cpu cores, can't be more than the host actually has.
          end
  end
  config.vm.define "dbbox" do |dbbox|
        ...

Ответ 10

Ответ мадис Маенни наиболее близок к лучшему решению:

просто сделайте:

vagrant ssh-config >> ~/.ssh/config
chmod 600 ~/.ssh/config

тогда вы можете просто ssh через имя хоста.

Чтобы получить список имен хостов, настроенных в ~/.ssh/config

grep -E '^Host ' ~/.ssh/config

Мой пример:

$ grep -E '^Host' ~/.ssh/config
Host web
Host db
$ ssh web
[[email protected] ~]$

Ответ 11

Создайте пару ключей rsa для проверки бродяг ssh-keygen -f ~/.ssh/vagrant

Вы также можете добавить файлы с идентификационными данными для бродяг в свой ~/.ssh/config

IdentityFile ~/.ssh/vagrant
IdentityFile ~/.vagrant.d/insecure_private_key

По какой-то причине мы не можем просто указать ключ, который мы хотим вставить, поэтому мы берем несколько дополнительных шагов для генерации ключа. Таким образом, мы получаем безопасность и знание того, какой именно ключ нам нужен (+ все бродячие коробки получат один и тот же ключ)

Не может ssh использовать бранные виртуальные машины с использованием небезопасного частного ключа (vagrant 1.7.2) Как добавить свой собственный открытый ключ к Vagrant VM?

config.ssh.insert_key = false
config.ssh.private_key_path = ['~/.ssh/vagrant', '~/.vagrant.d/insecure_private_key']
config.vm.provision "file", source: "~/.ssh/vagrant.pub", destination: "/home/vagrant/.ssh/vagrant.pub"
config.vm.provision "shell", inline: <<-SHELL
cat /home/vagrant/.ssh/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
mkdir -p /root/.ssh
cat /home/vagrant/.ssh/authorized_keys >> /root/.ssh/authorized_keys

ОБОЛОЧКА