自分の公開鍵をVagrantVMに追加するにはどうすればよいですか?


83

VagrantVMにsshキーを追加する際に問題が発生しました。基本的に、ここにあるセットアップは正常に機能します。VMが作成されると、を介してVMにアクセスできます。vagrant sshユーザー「vagrant」が存在し、authorized_keysファイルにこのユーザーのsshキーがあります。

私が今やりたいのは、を介してそれらのVMに接続できるようにすること、sshまたはを使用できるようにすることscpです。したがってid_rsa.pub、でauthorized_keys行うのと同じように、からに公開鍵を追加するだけで済みssh-copy-idます。

セットアップ中にVagrantに公開鍵を含める必要があることを伝える方法はありますか?そうでない場合(私のグーグルの結果によると、おそらくそうです)、vagrantのセットアップ中に公開鍵を簡単に追加する方法はありますか?

回答:


55

目的の公開鍵をコピーすると、プロビジョニングフェーズに直接分類されます。正確な答えは、使用したいプロビジョニング(シェル、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 2015年

6
上記の@tehKのコメント(isの前)に隠されているUnicode文字があり、午後を台無しにする可能性があります-これが修正されたコピー/貼り付け可能なバージョンですvirtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
Aidan Kane

このソリューションは美しく機能しました!どうもありがとうございました:)
Samir Patel

申し訳ありませんが、私はゲームに遅れています。config.vm.provisionとは何ですか?
user2568374 2017

5
ハードコーディングしないでください~/.ssh/id_rsa.pubssh-add -L代わりにからキーを取得してください。
ティムール

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

この作業例は、vagrantユーザーとrootユーザーの両方に追加さ~/.ssh/id_rsa.pub~/.ssh/authorized_keysます。これにより、既存のSSHキーを使用できるようになります。


2
うまく機能しますが、複数回実行される可能性のあるすべてのプロビジョニングに行が追加されます。
sekrett 2016

2
私はこの回答への主要な追加を拒否することに投票しています-その追加はそれ自身の回答として追加されるべきだからです。@ user76329(これを読むために戻ってきた場合)は、代わりに別の回答として追加する必要があります。
HPierce 2016

1
@sekrettシェルプロバイダーを1回だけ実行する場合は、次の1つの解決策があります。blog.ouseful.info / 2015/07/27 / 基本的に、プロビジョニングがすでに行われたことを示すファイルフラグを作成します。
rszalski 2016年

同等のものを追加する必要がありました:
mkdir〜

@sekrettべき等の場合、Ansibleの方が適していますが、シェルでできることはそれほど多くありません。 docs.ansible.com/ansible/latest/modules/...
MGP

38

あなたがやりたいことを達成するためのより「エレガントな」方法があります。公開鍵を追加する手間をかけずに、既存の秘密鍵を見つけて使用することができます。

次のように進めて、既存の秘密鍵へのパスを確認します(以下でIdentityFileを探してください)。

実行

 vagrant ssh-config 

結果:

$ vagrant ssh-config
ホストmagento2.vagrant150
  ホスト名127.0.0.1
  ユーザーvagrant
  ポート3150
  UserKnownHostsFile / dev / null
  StrictHostKeyCheckingいいえ
  PasswordAuthenticationいいえ
  IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
  アイデンティティのみはい
  LogLevel FATAL

次に、このような秘密鍵を使用できます。パスワード認証をオフにするためのスイッチにも注意してください。

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:リモートホストによって接続が閉じられました。今では、vagrantupで認証エラーを取得することさえできません。ゲスト通信の準備ができていないマシンでゲスト固有の操作が試行されたと表示されます。これは発生しないはずですが、報告する必要があります。
user2568374 2017

13

この優れた回答は、user76329によって拒否された提案された編集で追加されまし

Meowの例を拡張すると、ローカルのpub / private sshキーをコピーし、アクセス許可を設定して、インラインスクリプトをべき等にすることができます(1回実行され、テスト条件が失敗した場合にのみ繰り返されるため、プロビジョニングが必要です)。

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はrootユーザーに属します。

それでも、プロビジョニングの実行ごとに行が追加されますが、Vagrantはテストに使用され、VMの寿命は通常短いため、大きな問題ではありません。


1
config.vm.provision 'shell', inline: "mkdir -p /root/.ssh"フォルダが存在しなかったため、最初の行の後に追加する必要がありました
geekQ 2017

@geekQ私が使用ssh-copy-idしているので、常に私のために作成されますが、他の人のために作成する方が正しいです。編集します、ありがとう。
sekrett 2017

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ユーザー名を使用していないため、パスをハードコーディングしないでください。


本当に良い答えです。とても助かりました。しかし、vagrant.dディレクトリが保存される場所を調整する設定があるので、そのような場合を処理するように構成を調整しました。詳細はこちら
Giacomo1968 2017

2

いくつかは近づいてきましたが、古い投稿はどれも私には役に立ちませんでした。ターミナルでkeygenを使用してrsaキーを作成し、カスタムキーを使用する必要がありました。言い換えれば、Vagrantのキーの使用から敗北しました。

この投稿の日付の時点で、私はMac OSMojaveを使用しています。1つのVagrantfileに2つのVagrantボックスをセットアップしました。初心者がコンテキストを確認できるように、最初のボックスをすべて表示しています。.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|
        ...

1

これは、元のポスターが説明しているのと同様の状況を解決するのに役立った優れたスレッドです。

最終的にsmartwjwの回答に示されている設定/ロジックを使用しましたが、VAGRANT_HOME環境変数を使用しvagrant.dて開発システムの1つにある外付けハードドライブにコアディレクトリを保存しているため、問題が発生しました。

これが、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

インラインシェルプロビジョナーの場合-公開鍵にはスペースやコメントなどが含まれるのが一般的です。したがって、公開鍵に展開される変数を引用符で囲んでください。

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

マディスマンニの答えは、最良の解決策に最も近いです:

ただ行う:

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

また、vagrantIDファイルをに追加することもできます。 ~/.ssh/config

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

何らかの理由で、挿入するキーを指定するだけでは不十分なため、自分でキーを生成するためにいくつかの追加手順を実行します。このようにして、必要なキーのセキュリティと知識を正確に取得します(+すべてのvagrantボックスは同じキーを取得します)

安全でない秘密鍵(vagrant 1.7.2)を使用してvagrant VMにSSH接続できないVagrantVMに 自分の公開鍵を追加するにはどうすればよいですか?

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.