Vagrant VM에 내 공개 키를 어떻게 추가합니까?


82

Vagrant VM에 ssh 키를 추가하는 데 문제가 있습니다. 기본적으로 여기에있는 설정이 잘 작동합니다. VM이 생성되면을 통해 액세스 할 수 있습니다 vagrant ssh. 사용자 "vagrant"가 존재하며 authorized_keys파일 에이 사용자에 대한 ssh 키가 있습니다.

지금하고 싶은 것은 .NET을 통해 해당 VM에 연결 ssh하거나 사용할 수 있도록하는 것 scp입니다. 따라서에서 id_rsa.pub하는 authorized_keys것처럼 공개 키만 추가 하면됩니다 ssh-copy-id.

설정 중에 내 공개 키를 포함해야한다고 Vagrant에게 알리는 방법이 있습니까? 그렇지 않은 경우 (Google 결과에 따르면 가능성이 있음) 방랑 설정 중에 공개 키를 쉽게 추가하는 방법이 있습니까?

답변:


55

원하는 공개 키를 복사하면 바로 프로비저닝 단계 로 넘어갑니다 . 정확한 대답은 사용하려는 프로비저닝 (shell, Chef, Puppet 등)에 따라 다릅니다. 가장 사소한 것은 file다음과 같은 키를 제공 하는 것입니다 .

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

글쎄, 실제로 당신은 authorized_keys에 추가해야합니다. 다음과 같이 셸 프로비저닝 도구를 사용합니다.

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

Puppet 과 같은 진정한 프로비저닝 도구를 사용할 수도 있습니다 . 예를 들어 Puppet을 사용하여 SSH 인증 키 관리 를 참조하십시오 .


8
귀하의 답변에 감사드립니다-그것은 제가 필요로 한 넛지였습니다. :) Vagrant가 무언가를 제공 할 것이라고 생각했지만 프로비저닝을 통해 가능합니다. 약간 "추악"할 수도 있지만 매력처럼 작동합니다. 기본적으로 제안한대로 파일을 복사 한 다음 셸 프로 비저 너를 사용하여 키를 추가합니다. virtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
tehK

6
(전과 위 tehK의 코멘트 @에 숨겨진 유니 코드 문자가 i당신의 오후를 망칠 수들) - 여기에 고정 복사 / 붙여 넣을 수있는 버전입니다virtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
에이단 케인

이 솔루션은 아름답게 작동했습니다! 정말 감사합니다 :)
Samir Patel

죄송합니다. 경기에 늦었습니다. config.vm.provision은 무엇입니까?
user2568374

5
하드 코딩하지 마십시오 ~/.ssh/id_rsa.pub. ssh-add -L대신 키를 가져옵니다 .
Timur

72

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기존 SSH 키를 사용할 수 있습니다.


2
훌륭하고 작동하지만 여러 번 실행될 수있는 모든 프로 비전마다 한 줄을 추가합니다.
sekrett

2
나는 이 답변에 대한 주요 추가 사항 을 거부하는 투표합니다. 그 추가 사항은 자체 답변으로 추가되어야하기 때문입니다. @ user76329 (이것을 읽으 러 돌아온 경우) 대신 별도의 답변으로 추가해야합니다.
HPierce

1
@sekrett 쉘 제공자 가 한 번만 실행되도록하려면 여기에 하나의 솔루션이 있습니다. blog.ouseful.info/2015/07/27/… 기본적으로 제공이 이미 발생했음을 표시하는 파일 플래그를 만듭니다.
rszalski

나는 동등한 추가하는 데 필요한 :에서 mkdir ~ / 스푸핑 && 터치의 authorized_keys를
더글러스 Denhartog에게

@sekrett 멱 등성을 위해 Ansible을 사용하는 것이 더 낫습니다. shell은 많은 일을 할 수 있습니다. docs.ansible.com/ansible/latest/modules/…
MGP

38

당신이하고 싶은 것을 성취하는 더 "우아한"방법이 있습니다. 공개 키를 추가하는 번거 로움을 겪지 않고 기존 개인 키를 찾아서 사용할 수 있습니다.

다음과 같이 진행하여 기존 개인 키의 경로를 확인합니다 ( IdentityFile 은 아래 참조 ).

운영

 방랑 ssh 구성 

결과:

$ vagrant ssh-config
호스트 magento2.vagrant150
  호스트 이름 127.0.0.1
  사용자 방랑자
  포트 3150
  UserKnownHostsFile / dev / null
  StrictHostKeyChecking 아니요
  비밀번호 인증 번호
  IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
  IdentitiesOnly 예
  LogLevel 치명적

그런 다음 이와 같은 개인 키를 사용할 수 있습니다. 암호 인증을 끄는 스위치도 참고하십시오.

ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication = no vagrant@127.0.0.1 -p 3150

확인 : ssh_exhange_identification : 원격 호스트에 의해 연결이 닫혔습니다. 이제는 방랑자에 대한 인증 오류조차 얻을 수 없습니다. 게스트 통신 준비가되지 않은 시스템에서 게스트 특정 작업이 시도되었다고 표시됩니다. 이것은 발생해서는 안되며보고되어야합니다.
user2568374

13

이 훌륭한 답변은 거부 된 제안 편집user76329 에 의해 추가되었습니다.

Meow의 예제를 확장 하면 로컬 pub / private 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

11

더 짧고 정확한 코드는 다음과 같아야합니다.

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는 루트 사용자에게 속합니다.

그래도 모든 프로비저닝 실행마다 라인이 추가되지만 Vagrant는 테스트에 사용되며 VM은 일반적으로 수명이 짧으므로 큰 문제는 아닙니다.


1
내가 추가 한 config.vm.provision 'shell', inline: "mkdir -p /root/.ssh"폴더가 존재하지 않았기 때문에 첫 번째 줄 이후
geekQ

@geekQ를 사용 ssh-copy-id하므로 항상 나를 위해 생성되지만 다른 사람을 위해 생성하는 것이 더 정확합니다. 감사합니다.
sekrett

9

다음과 같은 코드를 사용하게됩니다.

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사용자 이름을 사용하지 않으므로 경로를 하드 코드해서는 안됩니다 .


정말 좋은 대답입니다. 나를 많이 도왔다. 그러나 vagrant.d디렉토리가 저장 되는 위치를 조정하는 설정이 있으므로 이러한 경우를 처리하도록 구성을 조정했습니다. 자세한 내용은 여기 .
Giacomo1968 19:43에

2

일부는 가까이 왔지만 이전 게시물 중 어느 것도 나를 위해 일하지 않았습니다. 터미널에서 keygen으로 rsa 키를 만들고 사용자 지정 키로 이동해야했습니다. 즉, Vagrant의 키를 사용하여 패배했습니다.

이 게시물의 날짜를 기준으로 Mac OS Mojave를 사용하고 있습니다. 하나의 Vagrantfile에 두 개의 Vagrant 상자를 설치했습니다. 초보자가 컨텍스트를 볼 수 있도록 첫 번째 상자를 모두 표시하고 있습니다. Vagrant 파일과 같은 폴더에 .ssh 폴더를 넣습니다. 그렇지 않으면 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|
        ...

1

이것은 원래 포스터가 설명하는 것과 유사한 상황을 해결하는 데 도움이 된 훌륭한 스레드입니다.

궁극적으로 smartwjw의 답변에 제시된 설정 / 로직을 사용하는 동안 VAGRANT_HOME환경 변수를 사용하여 vagrant.d개발 시스템 중 하나의 외장 하드 드라이브에 핵심 디렉토리 항목 을 저장하기 때문에 문제가 발생했습니다.

그래서 VAGRANT_HOME설정 되는 환경 변수 를 수용하기 위해 Vagrantfile에서 사용하는 조정 된 코드가 있습니다. "마법"은 다음 줄에서 발생합니다 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

1

인라인 쉘 프로 비저 너의 경우-공개 키에 공백, 주석 등이 포함되는 것이 일반적입니다. 따라서 공개 키로 확장되는 var 주위에 따옴표를 (이스케이프 처리 된) 따옴표로 묶어야합니다.

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

0

꽤 완벽한 예입니다. 이것이 다음에 방문하는 사람에게 도움이되기를 바랍니다. 모든 구체적인 값을 외부 구성 파일로 이동했습니다. IP 할당은 시험용입니다.

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

require 'yaml'
vmconfig = YAML.load_file('vmconfig.yml')

=begin
Script to created VMs with public IPs, VM creation governed by the provided
config file.
All Vagrant configuration is done below. The "2" in Vagrant.configure
configures the configuration version (we support older styles for
backwards compatibility). Please don't change it unless you know what
you're doing
Default user `vagrant` is created and ssh key is overridden. make sure to have
the files `vagrant_rsa` (private key) and `vagrant_rsa.pub` (public key) in the
path `./.ssh/`
Same files need to be available for all the users you want to create in each of
these VMs
=end

uid_start = vmconfig['uid_start']
ip_start = vmconfig['ip_start']
vagrant_private_key = Dir.pwd + '/.ssh/vagrant_rsa'
guest_sshkeys = '/' + Dir.pwd.split('/')[-1] + '/.ssh/'
Vagrant.configure('2') do |config|
  vmconfig['machines'].each do |machine|
    config.vm.define "#{machine}" do |node|
      ip_start += 1
      node.vm.box = vmconfig['vm_box_name']
      node.vm.box_version = vmconfig['vm_box_version']
      node.vm.box_check_update = false
      node.vm.boot_timeout = vmconfig['vm_boot_timeout']
      node.vm.hostname = "#{machine}"
      node.vm.network "public_network", bridge: "#{vmconfig['bridge_name']}", auto_config: false
      node.vm.provision "shell", run: "always", inline: "ifconfig #{vmconfig['ethernet_device']} #{vmconfig['public_ip_part']}#{ip_start} netmask #{vmconfig['subnet_mask']} up"
      node.ssh.insert_key = false
      node.ssh.private_key_path = ['~/.vagrant.d/insecure_private_key', "#{vagrant_private_key}"]
      node.vm.provision "file", source: "#{vagrant_private_key}.pub", destination: "~/.ssh/authorized_keys"
      node.vm.provision "shell", inline: <<-EOC
        sudo sed -i -e "\\#PasswordAuthentication yes# s#PasswordAuthentication yes#PasswordAuthentication no#g" /etc/ssh/sshd_config
        sudo systemctl restart sshd.service
      EOC
      vmconfig['users'].each do |user|
        uid_start += 1
        node.vm.provision "shell", run: "once", privileged: true, inline: <<-CREATEUSER
          sudo useradd -m -s /bin/bash -U #{user} -u #{uid_start}
          sudo mkdir /home/#{user}/.ssh
          sudo cp #{guest_sshkeys}#{user}_rsa.pub /home/#{user}/.ssh/authorized_keys
          sudo chown -R #{user}:#{user} /home/#{user}
          sudo su
          echo "%#{user} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/#{user}
          exit
        CREATEUSER
      end
    end
  end

-1

Madis Maenni 답변은 최상의 솔루션에 가장 가깝습니다.

그냥 해:

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
[vagrant@web ~]$

-2

방랑자 인증을위한 rsa 키 쌍 생성 ssh-keygen -f ~/.ssh/vagrant

방랑자 신원 파일을 추가하고 싶을 수도 있습니다. ~/.ssh/config

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

어떤 이유로 삽입하려는 키를 지정할 수 없기 때문에 몇 가지 추가 단계를 거쳐 직접 키를 생성합니다. 이런 식으로 우리는 정확히 어떤 키가 필요한지에 대한 보안과 지식을 얻습니다 (+ 모든 방랑 상자는 동일한 키를 얻습니다).

안전하지 않은 개인 키 (vagrant 1.7.2) 를 사용하여 Vagrant VM에 SSH를 사용할 수 없습니다. 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

껍질

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.