web-dev-qa-db-ja.com

Vagrant VMに独自の公開キーを追加するにはどうすればよいですか?

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

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

セットアップ中にVagrantに公開キーを含めるように指示する方法はありますか?そうでない場合(おそらく、私のGoogleの結果によると)、浮浪者の設定中に公開鍵を簡単に追加する方法はありますか?

63
tehK

目的の公開キーをコピーすると、 プロビジョニング フェーズに真っ直ぐになります。正確な答えは、使用するプロビジョニング(シェル、シェフ、パペットなど)によって異なります。最も簡単なのは、キーのfileプロビジョニング担当者で、これに沿ったものです。

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

まあ、実際には、authorized_keysに追加する必要があります。 Puppet のような真のプロビジョニングツールを使用してください。たとえば、 PuppetによるSSH認証キーの管理 を参照してください。

38
Remus Rusanu

次のように、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をvagrantとrootユーザーの両方の~/.ssh/authorized_keysに追加します。これにより、既存のSSHキーを使用できるようになります。

62
Meow

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

既存の秘密キーへのパスを確認するには、次のように進みます(以下で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はい
 LogLevel FATAL 

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

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

私は次のようなコードを使用することになります:

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

vagrantユーザー名を使用していないいくつかの浮浪者ボックスがあるため、/home/vagrant/.ssh/authorized_keysへのパスをハードコードしないでください。

9
smartwjw

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

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
9
Stevie Howard

より短く、より正確なコードは次のとおりです。

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は通常寿命が短いため、大きな問題ではありません。

8
sekrett

古い記事はどれも役に立たなかったが、いくつかは近づいた。ターミナルでkeygenを使用してrsaキーを作成し、カスタムキーを使用する必要がありました。言い換えれば、Vagrantのキーを使用することで敗北しました。

この投稿の日付の時点でMac OS Mojaveを使用しています。 1つのVagrantfileに2つのVagrantボックスをセットアップしました。初心者がコンテキストを確認できるように、最初のボックスをすべて表示しています。 Vagrantファイルと同じフォルダーに.sshフォルダーを配置します。それ以外の場合は、user9091383セットアップを使用します。

このソリューションの功績は this coder。

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
Preston

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

最終的には smartwjwの 回答に示されている設定/ロジックを使用しましたが、 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
1
JakeGould

インラインシェルプロビジョニングツールの場合、公開キーにはスペース、コメントなどが含まれることが一般的です。そのため、公開キーに展開する変数の周りに引用符を必ず入れてください(エスケープ)。

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

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 ~]$
0
Gregory