it-swarm.com.de

Wie füge ich meinen eigenen öffentlichen Schlüssel zu Vagrant VM hinzu?

Ich habe ein Problem mit dem Hinzufügen eines SSH-Schlüssels zu einer Vagrant-VM. Grundsätzlich funktioniert das Setup, das ich hier habe, gut. Sobald die VMs erstellt wurden, kann ich über vagrant ssh darauf zugreifen, der Benutzer "vagrant" ist vorhanden und es gibt einen ssh-Schlüssel für diesen Benutzer in der authorized_keys-Datei.

Was ich jetzt tun möchte, ist: Ich kann über ssh eine Verbindung zu diesen VMs herstellen oder scp verwenden. Ich müsste also nur meinen öffentlichen Schlüssel von id_rsa.pub zum authorized_keys hinzufügen - genau wie ich mit ssh-copy-id

Gibt es eine Möglichkeit, Vagrant während des Setups mitzuteilen, dass mein öffentlicher Schlüssel enthalten sein soll? Wenn nicht (was laut meinen Google-Ergebnissen wahrscheinlich ist), gibt es eine Möglichkeit, meinen öffentlichen Schlüssel während des Vagrant-Setups leicht anzufügen?

56
tehK

Das Kopieren des gewünschten öffentlichen Schlüssels würde direkt in die Bereitstellung -Phase fallen. Die genaue Antwort hängt davon ab, welche Bereitstellung Sie verwenden möchten (Shell, Chef, Puppet usw.). Das Trivialste wäre ein file-Provisioner für den Schlüssel. Etwas entlang dieser:

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

Nun, eigentlich müssen Sie an authorized_keys anhängen und einen echten Provisioner wie Puppet verwenden. Siehe zum Beispiel Verwalten von autorisierten SSH-Schlüsseln mit Puppet .

34
Remus Rusanu

Sie können das Kernmodul von Ruby wie folgt verwenden:

  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

In diesem Arbeitsbeispiel wird ~/.ssh/id_rsa.pub an den ~/.ssh/authorized_keys des Vagabund- und des Root-Benutzers angehängt, sodass Sie Ihren vorhandenen SSH-Schlüssel verwenden können.

59
Meow

Es gibt einen "eleganteren" Weg, um das zu erreichen, was Sie tun möchten. Sie können den vorhandenen privaten Schlüssel finden und verwenden, anstatt den öffentlichen Schlüssel hinzuzufügen.

Gehen Sie wie folgt vor, um den Pfad zum vorhandenen privaten Schlüssel anzuzeigen (siehe IdentityFile ): 

lauf 

  vagrant ssh-config 

ergebnis:

 $ vagrant ssh-config
Host magento2.vagrant150 
 HostName 127.0.0.1 
 User vagrant 
 Port 3150 
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking Nr 
 PasswortAuthentifizierung Nr 
 IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
 IdentitätenNur ja 
 LogLevel FATAL 

Dann können Sie den privaten Schlüssel so verwenden, beachten Sie auch den Schalter zum Deaktivieren der Kennwortauthentifizierung

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

Ich ende mit Code wie:

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

Beachten Sie, dass wir den Pfad zu /home/vagrant/.ssh/authorized_keys nicht fest codieren sollten, da einige Vagrant-Boxen den Benutzernamen vagrant nicht verwenden.

8
smartwjw

Ein kürzerer und korrekter Code sollte sein:

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

Andernfalls gehört .ssh/authorized_keys des Benutzers zum root-Benutzer.

Es wird zwar bei jedem Bereitstellungslauf eine Zeile hinzugefügt, aber Vagrant wird zum Testen verwendet, und ein VM hat normalerweise eine kurze Lebensdauer, daher kein großes Problem.

7
sekrett

Diese hervorragende Antwort wurde von user76329 in a abgelehnt. Vorgeschlagene Bearbeitung

Erweitern wir auf das Meow-Beispiel , können wir die lokalen pub/private-ssh-Schlüssel kopieren, Berechtigungen festlegen und das Inline-Skript idempotent machen (wird einmal ausgeführt und wird nur wiederholt, wenn die Testbedingung fehlschlägt und daher eine Bereitstellung erforderlich ist):

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

Keiner der älteren Beiträge funktionierte für mich, obwohl einige nahe kamen. Ich musste rsa-Schlüssel mit keygen im Terminal machen und mit benutzerdefinierten Schlüsseln gehen. Mit anderen Worten, besiegt von Vagrants Schlüssel. 

Ich bin seit dem Datum dieses Beitrags auf Mac OS Mojave. Ich habe zwei Vagrant-Boxen in einer Vagrantfile eingerichtet. Ich zeige die erste Box, damit Neulinge den Kontext sehen können. Ich habe den .ssh-Ordner im selben Ordner wie die Vagrant-Datei abgelegt.

Diese Lösung geht an diesen Codierer.

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|
        ...
0
Preston

Dies ist ein ausgezeichneter Thread, der mir geholfen hat, eine ähnliche Situation zu lösen, wie das Originalplakat beschreibt.

Während ich letztendlich die in smartwjws antwort vorgestellten Einstellungen/Logik verwendete, stieß ich auf ein Problem, da ich die Umgebungsvariable VAGRANT_HOME verwende, um den Kern des vagrant.d-Verzeichnisses auf einer externen Festplatte auf einer meiner Entwicklung zu speichern Systeme.

Hier ist also der angepasste Code, den ich in meiner Vagrantfile verwende, um eine VAGRANT_HOME-Umgebungsvariable unterzubringen, die gesetzt wird; Die "Magie" geschieht in dieser Zeile 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
0
JakeGould

Für die Inline-Shell-Provisioner enthält ein öffentlicher Schlüssel üblicherweise Leerzeichen, Kommentare usw. Stellen Sie daher sicher, dass Sie (mit Escape-Zeichen versehene) Anführungszeichen um die Variable setzen, die zum öffentlichen Schlüssel erweitert wird: 

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

Die Antwort von Madis Maenni kommt der besten Lösung am nächsten:

mach einfach:

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

dann kannst du einfach per hostname ssh.

Um eine Liste der in ~/.ssh/config konfigurierten Hostnamen abzurufen

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

Mein Beispiel:

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